Линейная регрессия — это базовая техника в статистике и машинном обучении, которая помогает моделировать взаимосвязь между переменными. Проще говоря, она позволяет предсказывать результат на основе одного или нескольких факторов. Её широко применяют в ценообразовании недвижимости, прогнозировании продаж, оценке рисков и многих других областях.
В этом руководстве мы рассмотрим линейную регрессию в scikit-learn: разберёмся, как она работает, зачем нужна и как её реализовать с помощью scikit-learn. К концу вы сможете построить и оценить модель линейной регрессии для принятия решений на основе данных.
Точечная диаграмма: цена дома vs количество комнат
Линейная регрессия и машинное обучение
Помимо очевидной пользы при определении стоимости жилья, линейная регрессия играет важную роль в машинном обучении.
Она быстро обучается, что делает её идеальной для быстрого прототипирования.
Служит отправной точкой для сравнения. Если более сложные модели не дают существенного выигрыша, их сложность может быть неоправданной.
В отличие от некоторых техник (например, глубокого обучения), она легко интерпретируема.
Помогает в отборе признаков, выявляя наиболее полезные предикторы.
Несмотря на простоту, линейная регрессия остаётся незаменимым инструментом в машинном обучении благодаря эффективности, интерпретируемости и универсальности.
Линейная регрессия и библиотека scikit-learn
Библиотека scikit-learn упрощает реализацию линейной регрессии. У неё множество преимуществ.
Единый интерфейс: код для разных алгоритмов ML похож.
Код простой — сложная математика и детали реализации скрыты. Например, чтобы обучить модель на тренировочных данных, достаточно строки model.fit(X_train, y_train).
Лёгкий доступ к коэффициентам модели.
Встроенные метрики для оценки качества модели.
Простая интеграция линейной регрессии (или любого другого алгоритма ML) с шагами препроцессинга, такими как масштабирование и отбор признаков, с помощью Pipeline.
Если вы новичок в scikit-learn, ознакомьтесь с нашим курсом Машинное обучение с scikit-learn, чтобы получить практическое введение в эту библиотеку Python.
Понимание линейной регрессии
Как мы видели, при простой линейной регрессии данные моделируются «линией наилучшего соответствия». Формула этой линии:
где m — наклон линии, а b — пересечение с осью (свободный член).
«Множественная линейная регрессия» обобщает случай одного предиктора на несколько предикторов (число комнат, близость к океану, медианный доход района). Формула обобщается до:
где каждый xi — независимая переменная, а соответствующий bi — её коэффициент. В трёх измерениях линия обобщается до плоскости. В более высоких размерностях плоскость становится «гиперплоскостью».
Как интерпретировать коэффициенты и свободный член? Пересечение — это предсказанное значение y, когда все независимые переменные равны 0, иначе говоря, базовый уровень зависимой переменной при отсутствии вклада предикторов. Каждый коэффициент bi показывает изменение зависимой переменной y при изменении xi на одну единицу при фиксированных остальных независимых переменных.
Подготовка окружения
Установить scikit-learn просто. Используйте команду pip install scikit-learn. Если нужна конкретная версия, например 1.2.2, укажите её: pip install scikit-learn==1.2.2. Если вы используете Anaconda, scikit-learn, скорее всего, уже установлен. Если всё же нужно установить его в среде Anaconda, используйте команду conda install scikit-learn.
При работе с scikit-learn необходимы или рекомендуются несколько библиотек. Библиотека numpy нужна для хранения признаков и меток. Библиотека pandas рекомендуется для загрузки, предобработки и исследования наборов данных.
Если вы используете scikit-learn, скорее всего, вы уже применяете pandas для подготовки данных. Для построения графиков вы, вероятно, будете использовать matplotlib или seaborn, или обе библиотеки. Любую из них можно установить через pip по аналогии с примером выше. Можно установить несколько библиотек одной командой:
Прежде чем загрузим набор данных, импортируем «подозреваемых по умолчанию».
# Import libraries.import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as snsРаботает на
Загрузка набора данных
Используем известный набор данных по жилью в Калифорнии.
# Read in California housing dataset.from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()Работает на
Подготовка данных
Разобьём данные на обучающую и тестовую выборки. Импортируем метод train_test_split() из sklearn.model_selection, затем вызовем его, указав долю тестовой выборки и random_state. Мы также используем простую линейную регрессию с признаком, соответствующим среднему числу комнат.
# Import train_test_split.from sklearn.model_selection import train_test_split
# Create features X and target y.
X = pd.DataFrame(housing.data, columns=housing.feature_names)[["AveRooms"]]
y = housing.target # Median house value in $100,000s# Split the dataset into training (80%) and testing (20%) sets.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)Работает на
Теперь, когда мы разделили данные на тестовую и обучающую выборки, стандартизируем признаки. Этот процесс приводит все переменные к одной шкале, что может улучшить качество модели и численную устойчивость.
# Import StandardScaler.from sklearn.preprocessing import StandardScaler
# Instantiate StandardScaler.
scaler = StandardScaler()# Fit and transform training data.
X_train_scaled = scaler.fit_transform(X_train)# Also transform test data.
X_test_scaled = scaler.transform(X_test)Работает на
В этом коде StandardScaler — это инструмент предобработки данных, который вычитает среднее и масштабирует признаки к единичной дисперсии. Это помогает предотвратить доминирование некоторых признаков из-за различий в масштабе.
Скалер обучается на тренировочных данных методом fit_transform(). Тестовые данные затем преобразуются отдельно методом transform(), чтобы масштабирование выполнялось по тем же параметрам, что и для обучения, предотвращая утечку данных.
Обучение модели линейной регрессии
Чтобы создать модель линейной регрессии, импортируйте LinearRegression() из sklearn.linear_model. Вызовите её и присвойте переменной.
# Import LinearRegression.from sklearn.linear_model import LinearRegression
# Instantiate linear regression model.
model = LinearRegression()Работает на
Обучить модель на тренировочных данных несложно.
# Fit the model to the training data.
model.fit(X_train_scaled, y_train)Работает на
Построение прогнозов
Теперь, когда мы обучили модель, сделаем предсказания на тестовой выборке.
# Make predictions on the testing data.
y_pred = model.predict(X_test_scaled)Работает на
Оценка качества модели
Сделав предсказания на тестовой выборке, нужно понять, насколько они соответствуют реальности. Для оценки регрессионных алгоритмов есть несколько метрик. Наиболее распространённые — коэффициент детерминации (R2), среднеквадратичная ошибка (MSE) и корень из среднеквадратичной ошибки (RMSE).
Коэффициент детерминации R2 измеряет, насколько хорошо модель объясняет изменчивость целевой переменной. Иными словами, он показывает, какая доля вариации целевой переменной объясняется предикторами; это показатель качества подгонки.
Чтобы разобраться глубже, посмотрим на формулу:
где yactual — фактические значения целевой переменной, ypredicted — предсказанные моделью значения, а ȳ — среднее фактических значений. Эта формула помогает понять, какая часть дисперсии целевой переменной объясняется моделью. В знаменателе — общая дисперсия в данных, в числителе — необъяснённая дисперсия после применения регрессии. Отношение даёт долю дисперсии, объяснённой моделью.
Как интерпретировать R2?
R2 = 1: модель полностью объясняет всю вариативность целевой переменной.
R2 = 0: модель ничего не объясняет; предсказания не лучше простого среднего.
R2 < 0: модель хуже простого среднего — признак плохой подгонки.
Важные соображения.
Более высокий R2 не всегда лучше. Высокий R2 может указывать на переобучение, особенно у сложных моделей.
Добавление признаков может искусственно повышать R2, так что большее значение не обязательно лучше.
Для множественной регрессии используйте скорректированный R2, который учитывает количество предикторов и избегает вводящих в заблуждение улучшений из-за лишних переменных.
Оценивать качество модели по коэффициенту детерминации в scikit-learn просто.
# Import metrics.from sklearn.metrics import mean_squared_error, r2_score
# Calculate and print R^2 score.
r2 = r2_score(y_test, y_pred)print(f"R-squared: {r2:.4f}")Работает на
Другие распространённые метрики — среднеквадратичная ошибка (MSE) и корень из неё (RMSE). Они измеряют, насколько предсказания модели отклоняются от фактических значений.
MSE вычисляет среднее квадрата разницы между фактическими и предсказанными значениями:
для общего числа наблюдений n. Поскольку ошибки возводятся в квадрат перед усреднением, большие ошибки штрафуются сильнее малых, поэтому MSE чувствительна к выбросам. Чем ниже MSE, тем лучше подгонка.
Чтобы сгладить этот эффект, используют RMSE — это просто квадратный корень из MSE. Поскольку RMSE выражается в тех же единицах, что и целевая переменная, эта метрика более интерпретируема: показывает, насколько в среднем промахиваются предсказания.
Вычислить MSE и RMSE в scikit-learn легко.
# Calculate and print MSE.
mse = mean_squared_error(y_test, y_pred)print(f"Mean squared error: {mse:.4f}")# Calculate and print RMSE.
rmse = mse **0.5print(f"Root mean squared error: {rmse:.4f}")Работает на
Mean squared error:1.2923
Root mean squared error:1.1368Работает на
Множественная линейная регрессия в scikit-learn
Запустим модель снова, но уже со всеми доступными признаками, а не только со средним числом комнат. Ожидаете лучший или худший результат?
# Uses all features.import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# Load data set.
housing = fetch_california_housing()# Split into X, y.
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = housing.target # Median house value in $100,000s
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# Scale the data.
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# Create model and fit it to the training data.
model = LinearRegression()
model.fit(X_train_scaled, y_train)# Make predictions.
y_pred = model.predict(X_test_scaled)# Calculate and print errors.
r2 = r2_score(y_test, y_pred)print(f"R-squared: {r2:.4f}")
mse = mean_squared_error(y_test, y_pred)print(f"Mean squared error: {mse:.4f}")
rmse = mse **0.5print(f"Root mean squared error: {rmse:.4f}")Работает на
R-squared:0.5758
Mean squared error:0.5559
Root mean squared error:0.7456Работает на
Мы видим, что результаты заметно лучше, чем при использовании одного признака. Однако возникает вопрос, нужны ли нам все признаки. Некоторые из них могут быть важнее других. Выбор наиболее релевантных признаков из набора данных называется отбором признаков.
Отбор признаков важен по нескольким причинам.
Снижает переобучение. Меньше признаков — ниже сложность и риск переобучения.
Повышает точность. Удаление нерелевантных или дублирующих признаков помогает модели сосредоточиться на значимых паттернах.
Улучшает интерпретируемость. Делает модели понятнее, выделяя ключевые факторы.
Ускоряет обучение. Меньше признаков — меньше времени и памяти на вычисления.
Когда несколько признаков сильно коррелируют, они избыточны — фактически несут одну и ту же информацию для модели. Такая ситуация называется мультиколлинеарностью. Хотя мультиколлинеарность не всегда снижает точность предсказаний, она усложняет отбор признаков и интерпретацию, особенно в линейной регрессии и родственных моделях.
Коэффициент инфляции дисперсии (VIF) — метрика для выявления мультиколлинеарности среди предикторов. Для каждого предиктора VIF вычисляется как:
где Ri2 — значение R2, полученное при регрессии предиктора Xi на все остальные предикторы в модели. Чем выше VIF, тем сильнее предиктор коррелирует с другими переменными.
VIF = 1: мультиколлинеарности нет (идеально).
VIF < 5: низкая или умеренная мультиколлинеарность (обычно приемлемо).
VIF > 5: высокая мультиколлинеарность (стоит рассмотреть удаление или объединение коррелирующих переменных).
VIF > 10: серьёзная мультиколлинеарность (сильно указывает на избыточность признаков).
# Import libraries.import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from statsmodels.stats.outliers_influence import variance_inflation_factor
# Load the dataset.
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)# Compute the correlation matrix.
corr_matrix = X.corr()# Identify pairs of features with high collinearity (correlation > 0.8 or < -0.8).
high_corr_features =[(col1, col2, corr_matrix.loc[col1, col2])for col1 in corr_matrix.columns
for col2 in corr_matrix.columns
if col1 != col2 andabs(corr_matrix.loc[col1, col2])>0.8]# Convert to a DataFrame for better visualization.
collinearity_df = pd.DataFrame(high_corr_features, columns=["Feature 1","Feature 2","Correlation"])print("\nHighly Correlated Features:\n", collinearity_df)# Compute Variance Inflation Factor (VIF) for each feature.
vif_data = pd.DataFrame()
vif_data["Feature"]= X.columns
vif_data["VIF"]=[variance_inflation_factor(X.values, i)for i inrange(X.shape[1])]# Print VIF values.print("\nVariance Inflation Factor (VIF) for each feature:\n", vif_data)Работает на
Highly Correlated Features:
Feature 1 Feature 2 Correlation
0 AveRooms AveBedrms 0.8476211 AveBedrms AveRooms 0.8476212 Latitude Longitude -0.9246643 Longitude Latitude -0.924664
Variance Inflation Factor (VIF)for each feature:
Feature VIF
0 MedInc 11.5111401 HouseAge 7.1959172 AveRooms 45.9936013 AveBedrms 43.5903144 Population 2.9357455 AveOccup 1.0952436 Latitude 559.8740717 Longitude 633.711654Работает на
Давайте удалим AveBedrms из модели.
# Import libraries.import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# Load California housing dataset.
housing = fetch_california_housing()# Create DataFrame and remove "AveBedrms" feature.
X = pd.DataFrame(housing.data, columns=housing.feature_names).drop(columns=["AveBedrms"])
y = housing.target # Median house value in $100,000s# Split data into training and testing sets.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# Scale the data (Standardization).
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)# Create a linear regression model and train it.
model = LinearRegression()
model.fit(X_train_scaled, y_train)# Make predictions on the test set.
y_pred = model.predict(X_test_scaled)# Calculate performance metrics.
r2 = r2_score(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)# Print evaluation metricsprint(f"R-squared: {r2:.4f}")print(f"Mean squared error: {mse:.4f}")print(f"Root mean squared error: {rmse:.4f}")Работает на
R-squared:0.5823
Mean squared error:0.5473
Root mean squared error:0.7398Работает на
Результаты (незначительно) улучшились.
Извлечение инсайтов из модели
Построение регрессионной модели — лишь первый шаг; не менее важно понимать её результаты. Анализируя коэффициенты модели, можно определить, какие признаки сильнее всего влияют на предсказания.
Понимание регрессионных коэффициентов
После обучения модели линейной регрессии коэффициенты доступны через model.coef_. Свободный член доступен через model.intercept_.
После обучения модели линейной регрессии с помощью LinearRegression() коэффициенты доступны через model.coef_, а свободный член — через model.intercept_.
print("Intercept:", model.intercept_)
coeff_df = pd.DataFrame({"Feature": X.columns,"Coefficient": model.coef_})print("\nFeature Coefficients:\n", coeff_df)Работает на
Intercept:2.0719469373788777
Feature Coefficients:
Feature Coefficient
0 MedInc 0.7257471 HouseAge 0.1215192 Latitude -0.9431053 Longitude -0.900735Работает на
Суммирование результатов модели
Поскольку Scikit-Learn не предоставляет встроенного метода summary(), как Statsmodels, мы можем вручную извлечь и визуализировать важность каждого признака по коэффициентам регрессии. Признаки с бóльшими по модулю коэффициентами сильнее влияют на целевую переменную. Рассмотрим следующий код.
График важности признаков на основе значений коэффициентов
Теперь визуализируем остатки и линию регрессии.
# Compute residuals.
residuals = y_test - y_pred
# Create plots.
plt.figure(figsize=(12,5))# Plot 1: Residuals Distribution.
plt.subplot(1,2,1)
sns.histplot(residuals, bins=30, kde=True, color="blue")
plt.axvline(x=0, color='red', linestyle='--')
plt.title("Residuals Distribution")
plt.xlabel("Residuals (y_actual - y_predicted)")
plt.ylabel("Frequency")# Plot 2: Regression Fit (Actual vs Predicted).
plt.subplot(1,2,2)
sns.scatterplot(x=y_test, y=y_pred, alpha=0.5)
plt.plot([min(y_test),max(y_test)],[min(y_test),max(y_test)], color='red', linestyle='--')# Perfect fit line
plt.title("Regression Fit: Actual vs Predicted")
plt.xlabel("Actual Prices (in $100,000s)")
plt.ylabel("Predicted Prices (in $100,000s)")# Show plots.
plt.tight_layout()
plt.show()Работает на
Графики для визуализации остатков и подгонки регрессии
Распределение остатков (левый график) должно быть центрировано вокруг нуля, что указывает на случайное распределение ошибок. Если остатки близки к нормальному распределению, модель хорошо подогнана; если есть перекос или тренд, это может указывать на систематические ошибки. График подгонки (правый) сравнивает фактические и предсказанные значения; красная пунктирная линия — идеальное соответствие. Чем ближе точки к линии, тем точнее предсказания; появление закономерного рисунка (например, кривизны) может означать, что связь на самом деле не линейна.
Эти визуализации помогают выявлять переобучение или недообучение, обнаруживать паттерны в остатках, указывающие на пропущенные зависимости, и в целом оценивать эффективность модели.
Практические применения
Линейная регрессия широко используется в индустрии для прогнозирования и поддержки принятия решений. В недвижимости она оценивает цены домов по таким факторам, как размер и расположение.
В продажах и маркетинге — для прогнозирования спроса и оптимизации бюджета; в здравоохранении — для оценки риска заболеваний. В финансах — для прогноза цен акций и скоринга, в производстве — для контроля качества и прогнозирования отказов.
Когда использовать линейную регрессию
Между признаками и целевой переменной существует линейная зависимость.
Интерпретируемость и простота важнее сложного моделирования.
Данные требуют минимальной инженерии признаков.
Когда не использовать линейную регрессию
Связь между целевой переменной и признаками сложная и нелинейная.
Линейная регрессия остаётся одним из самых фундаментальных и широко применяемых методов машинного обучения и статистического моделирования. Несмотря на простоту, это мощный инструмент для понимания взаимосвязей между переменными и построения предсказаний в реальных задачах.
Ключевые выводы из руководства:
Разнообразные применения. Линейная регрессия даёт ценные инсайты в разных отраслях и для разных типов задач.
Интерпретируемость. В отличие от сложных «чёрных ящиков», линейная регрессия даёт понятную интерпретацию через коэффициенты.
Отбор признаков. Правильный выбор признаков и учёт мультиколлинеарности помогают сохранять точность, устойчивость и надёжность моделей.
За дополнительной информацией об интерполяции строк в Python обратитесь к материалам DataCamp.
Линейная регрессия — это статистический метод моделирования взаимосвязи между целевой переменной и одним или несколькими предикторами. Она находит линию наилучшего соответствия, минимизируя разницу между фактическими и предсказанными значениями методом наименьших квадратов.
Каковы предположения линейной регрессии?⌄
Линейная регрессия опирается на следующие предположения:
Линейность: зависимость между предикторами и целевой переменной — линейная.
Независимость: наблюдения независимы друг от друга.
Гомоскедастичность: дисперсия остатков постоянна для всех значений.
Нормальность остатков: остатки должны быть распределены нормально.
Отсутствие мультиколлинеарности: независимые переменные не должны быть сильно коррелированы.
Зачем масштабировать признаки перед обучением модели линейной регрессии?⌄
Масштабирование признаков гарантирует, что все признаки вносят сопоставимый вклад в модель. Так как линейная регрессия чувствительна к величинам признаков, масштабирование предотвращает доминирование переменных с большими значениями над переменными с меньшими. Используйте StandardScaler() для стандартизации
Что такое мультиколлинеарность и как её обнаружить?⌄
Мультиколлинеарность — это ситуация, когда две или более независимых переменных сильно коррелируют, что делает интерпретацию коэффициентов ненадёжной. Её можно обнаружить с помощью коэффициента инфляции дисперсии (VIF).
Как оценить модель линейной регрессии?⌄
Ключевые метрики качества:
R² (коэффициент детерминации) → измеряет, насколько хорошо модель объясняет дисперсию целевой переменной.
MSE (среднеквадратичная ошибка) → средний квадрат ошибки между фактическими и предсказанными значениями.
RMSE (корень из среднеквадратичной ошибки) → более интерпретируемая версия MSE.
Развивайте навыки машинного обучения с scikit-learn в Python. Используйте реальные наборы данных в этом интерактивном курсе и научитесь делать точные прогнозы!
Изучите data science на Python — от обработки данных до машинного обучения. Этот трек предоставляет навыки, необходимые для успеха в роли data scientist!
Линейная регрессия — это базовая техника в статистике и машинном обучении, которая помогает моделировать взаимосвязь между переменными. Проще говоря, она позволяет предсказывать результат на основе одного или нескольких факторов. Её широко применяют в ценообразовании недвижимости, прогнозировании продаж, оценке рисков и многих других областях.
В этом руководстве мы рассмотрим линейную регрессию в scikit-learn: разберёмся, как она работает, зачем нужна и как её реализовать с помощью scikit-learn. К концу вы сможете построить и оценить модель линейной регрессии для принятия решений на основе данных.
Точечная диаграмма: цена дома vs количество комнат
Линейная регрессия и машинное обучение
Помимо очевидной пользы при определении стоимости жилья, линейная регрессия играет важную роль в машинном обучении.
Несмотря на простоту, линейная регрессия остаётся незаменимым инструментом в машинном обучении благодаря эффективности, интерпретируемости и универсальности.
Линейная регрессия и библиотека scikit-learn
Библиотека scikit-learn упрощает реализацию линейной регрессии. У неё множество преимуществ.
model.fit(X_train, y_train).Если вы новичок в scikit-learn, ознакомьтесь с нашим курсом Машинное обучение с scikit-learn, чтобы получить практическое введение в эту библиотеку Python.
Понимание линейной регрессии
Как мы видели, при простой линейной регрессии данные моделируются «линией наилучшего соответствия». Формула этой линии:
где m — наклон линии, а b — пересечение с осью (свободный член).
«Множественная линейная регрессия» обобщает случай одного предиктора на несколько предикторов (число комнат, близость к океану, медианный доход района). Формула обобщается до:
где каждый xi — независимая переменная, а соответствующий bi — её коэффициент. В трёх измерениях линия обобщается до плоскости. В более высоких размерностях плоскость становится «гиперплоскостью».
Как интерпретировать коэффициенты и свободный член? Пересечение — это предсказанное значение y, когда все независимые переменные равны 0, иначе говоря, базовый уровень зависимой переменной при отсутствии вклада предикторов. Каждый коэффициент bi показывает изменение зависимой переменной y при изменении xi на одну единицу при фиксированных остальных независимых переменных.
Подготовка окружения
Установить scikit-learn просто. Используйте команду
pip install scikit-learn. Если нужна конкретная версия, например 1.2.2, укажите её:pip install scikit-learn==1.2.2.Если вы используете Anaconda, scikit-learn, скорее всего, уже установлен. Если всё же нужно установить его в среде Anaconda, используйте командуconda install scikit-learn.При работе с scikit-learn необходимы или рекомендуются несколько библиотек. Библиотека
numpyнужна для хранения признаков и меток. Библиотекаpandasрекомендуется для загрузки, предобработки и исследования наборов данных.Если вы используете scikit-learn, скорее всего, вы уже применяете pandas для подготовки данных. Для построения графиков вы, вероятно, будете использовать
matplotlibилиseaborn, или обе библиотеки. Любую из них можно установить через pip по аналогии с примером выше. Можно установить несколько библиотек одной командой:pip install scikit-learn numpy pandas matplotlib seaborn.Реализация линейной регрессии в sklearn
Прежде чем загрузим набор данных, импортируем «подозреваемых по умолчанию».
Загрузка набора данных
Используем известный набор данных по жилью в Калифорнии.
Подготовка данных
Разобьём данные на обучающую и тестовую выборки. Импортируем метод
train_test_split()изsklearn.model_selection, затем вызовем его, указав долю тестовой выборки иrandom_state. Мы также используем простую линейную регрессию с признаком, соответствующим среднему числу комнат.Теперь, когда мы разделили данные на тестовую и обучающую выборки, стандартизируем признаки. Этот процесс приводит все переменные к одной шкале, что может улучшить качество модели и численную устойчивость.
В этом коде
StandardScaler— это инструмент предобработки данных, который вычитает среднее и масштабирует признаки к единичной дисперсии. Это помогает предотвратить доминирование некоторых признаков из-за различий в масштабе.Скалер обучается на тренировочных данных методом
fit_transform(). Тестовые данные затем преобразуются отдельно методомtransform(), чтобы масштабирование выполнялось по тем же параметрам, что и для обучения, предотвращая утечку данных.Обучение модели линейной регрессии
Чтобы создать модель линейной регрессии, импортируйте
LinearRegression()изsklearn.linear_model. Вызовите её и присвойте переменной.Обучить модель на тренировочных данных несложно.
Построение прогнозов
Теперь, когда мы обучили модель, сделаем предсказания на тестовой выборке.
Оценка качества модели
Сделав предсказания на тестовой выборке, нужно понять, насколько они соответствуют реальности. Для оценки регрессионных алгоритмов есть несколько метрик. Наиболее распространённые — коэффициент детерминации (R2), среднеквадратичная ошибка (MSE) и корень из среднеквадратичной ошибки (RMSE).
Коэффициент детерминации R2 измеряет, насколько хорошо модель объясняет изменчивость целевой переменной. Иными словами, он показывает, какая доля вариации целевой переменной объясняется предикторами; это показатель качества подгонки.
Чтобы разобраться глубже, посмотрим на формулу:
где yactual — фактические значения целевой переменной, ypredicted — предсказанные моделью значения, а ȳ — среднее фактических значений. Эта формула помогает понять, какая часть дисперсии целевой переменной объясняется моделью. В знаменателе — общая дисперсия в данных, в числителе — необъяснённая дисперсия после применения регрессии. Отношение даёт долю дисперсии, объяснённой моделью.
Как интерпретировать R2?
Важные соображения.
Оценивать качество модели по коэффициенту детерминации в scikit-learn просто.
Другие распространённые метрики — среднеквадратичная ошибка (MSE) и корень из неё (RMSE). Они измеряют, насколько предсказания модели отклоняются от фактических значений.
MSE вычисляет среднее квадрата разницы между фактическими и предсказанными значениями:
для общего числа наблюдений n. Поскольку ошибки возводятся в квадрат перед усреднением, большие ошибки штрафуются сильнее малых, поэтому MSE чувствительна к выбросам. Чем ниже MSE, тем лучше подгонка.
Чтобы сгладить этот эффект, используют RMSE — это просто квадратный корень из MSE. Поскольку RMSE выражается в тех же единицах, что и целевая переменная, эта метрика более интерпретируема: показывает, насколько в среднем промахиваются предсказания.
Вычислить MSE и RMSE в scikit-learn легко.
Множественная линейная регрессия в scikit-learn
Запустим модель снова, но уже со всеми доступными признаками, а не только со средним числом комнат. Ожидаете лучший или худший результат?
Мы видим, что результаты заметно лучше, чем при использовании одного признака. Однако возникает вопрос, нужны ли нам все признаки. Некоторые из них могут быть важнее других. Выбор наиболее релевантных признаков из набора данных называется отбором признаков.
Отбор признаков важен по нескольким причинам.
Когда несколько признаков сильно коррелируют, они избыточны — фактически несут одну и ту же информацию для модели. Такая ситуация называется мультиколлинеарностью. Хотя мультиколлинеарность не всегда снижает точность предсказаний, она усложняет отбор признаков и интерпретацию, особенно в линейной регрессии и родственных моделях.
Коэффициент инфляции дисперсии (VIF) — метрика для выявления мультиколлинеарности среди предикторов. Для каждого предиктора VIF вычисляется как:
где Ri2 — значение R2, полученное при регрессии предиктора Xi на все остальные предикторы в модели. Чем выше VIF, тем сильнее предиктор коррелирует с другими переменными.
Давайте удалим AveBedrms из модели.
Результаты (незначительно) улучшились.
Извлечение инсайтов из модели
Построение регрессионной модели — лишь первый шаг; не менее важно понимать её результаты. Анализируя коэффициенты модели, можно определить, какие признаки сильнее всего влияют на предсказания.
Понимание регрессионных коэффициентов
После обучения модели линейной регрессии коэффициенты доступны через
model.coef_. Свободный член доступен черезmodel.intercept_.После обучения модели линейной регрессии с помощью LinearRegression() коэффициенты доступны через
model.coef_, а свободный член — черезmodel.intercept_.Суммирование результатов модели
Поскольку Scikit-Learn не предоставляет встроенного метода
summary(), как Statsmodels, мы можем вручную извлечь и визуализировать важность каждого признака по коэффициентам регрессии. Признаки с бóльшими по модулю коэффициентами сильнее влияют на целевую переменную. Рассмотрим следующий код.График важности признаков на основе значений коэффициентов
Теперь визуализируем остатки и линию регрессии.
Графики для визуализации остатков и подгонки регрессии
Распределение остатков (левый график) должно быть центрировано вокруг нуля, что указывает на случайное распределение ошибок. Если остатки близки к нормальному распределению, модель хорошо подогнана; если есть перекос или тренд, это может указывать на систематические ошибки. График подгонки (правый) сравнивает фактические и предсказанные значения; красная пунктирная линия — идеальное соответствие. Чем ближе точки к линии, тем точнее предсказания; появление закономерного рисунка (например, кривизны) может означать, что связь на самом деле не линейна.
Эти визуализации помогают выявлять переобучение или недообучение, обнаруживать паттерны в остатках, указывающие на пропущенные зависимости, и в целом оценивать эффективность модели.
Практические применения
Линейная регрессия широко используется в индустрии для прогнозирования и поддержки принятия решений. В недвижимости она оценивает цены домов по таким факторам, как размер и расположение.
В продажах и маркетинге — для прогнозирования спроса и оптимизации бюджета; в здравоохранении — для оценки риска заболеваний. В финансах — для прогноза цен акций и скоринга, в производстве — для контроля качества и прогнозирования отказов.
Когда использовать линейную регрессию
Когда не использовать линейную регрессию
Заключение
Линейная регрессия остаётся одним из самых фундаментальных и широко применяемых методов машинного обучения и статистического моделирования. Несмотря на простоту, это мощный инструмент для понимания взаимосвязей между переменными и построения предсказаний в реальных задачах.
Ключевые выводы из руководства:
За дополнительной информацией об интерполяции строк в Python обратитесь к материалам DataCamp.