Перейти к основному контенту

Линейная регрессия в Sklearn: полное руководство с примерами

Узнайте, что такое линейная регрессия, для чего она нужна и как реализовать её с помощью scikit-learn. Включает практические примеры.
Обновлено 22 июл. 2026 г.  · 10 мин читать

Изучить с помощью AI

Открыть в ChatGPTОткрыть в ClaudeОткрыть в Perplexity

Линейная регрессия — это базовая техника в статистике и машинном обучении, которая помогает моделировать взаимосвязь между переменными. Проще говоря, она позволяет предсказывать результат на основе одного или нескольких факторов. Её широко применяют в ценообразовании недвижимости, прогнозировании продаж, оценке рисков и многих других областях.

В этом руководстве мы рассмотрим линейную регрессию в 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 по аналогии с примером выше. Можно установить несколько библиотек одной командой:

pip install scikit-learn numpy pandas matplotlib seaborn.

Реализация линейной регрессии в sklearn

Прежде чем загрузим набор данных, импортируем «подозреваемых по умолчанию».

# 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}")
R-squared: 0.0138

Другие распространённые метрики — среднеквадратичная ошибка (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.5
print(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.5
print(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 and abs(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 in range(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.847621
   1  AveBedrms   AveRooms     0.847621
   2   Latitude  Longitude    -0.924664
   3  Longitude   Latitude    -0.924664
  
   Variance Inflation Factor (VIF) for each feature:
          Feature         VIF
   0      MedInc   11.511140
   1    HouseAge    7.195917
   2    AveRooms   45.993601
   3   AveBedrms   43.590314
   4  Population    2.935745
   5    AveOccup    1.095243
   6    Latitude  559.874071
   7   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 metrics
print(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.725747

   1   HouseAge     0.121519

   2   Latitude    -0.943105

   3  Longitude    -0.900735

Суммирование результатов модели

Поскольку Scikit-Learn не предоставляет встроенного метода summary(), как Statsmodels, мы можем вручную извлечь и визуализировать важность каждого признака по коэффициентам регрессии. Признаки с бóльшими по модулю коэффициентами сильнее влияют на целевую переменную. Рассмотрим следующий код.

# Sort dataframe by coefficients.
coef_df_sorted = coef_df.sort_values(by="Coefficient", ascending=False)


# Create plot.
plt.figure(figsize=(8,6))
plt.barh(coef_df["Feature"], coef_df_sorted["Coefficient"], color="blue")
plt.xlabel("Coefficient Value")
plt.ylabel("Feature")
plt.title("Feature Importance (Linear Regression Coefficients)")
plt.show()

Feature importance (Linear Regression Coefficients)

График важности признаков на основе значений коэффициентов

Теперь визуализируем остатки и линию регрессии.

# 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()

Residuals Distribution and Regression Fit

Графики для визуализации остатков и подгонки регрессии

Распределение остатков (левый график) должно быть центрировано вокруг нуля, что указывает на случайное распределение ошибок. Если остатки близки к нормальному распределению, модель хорошо подогнана; если есть перекос или тренд, это может указывать на систематические ошибки. График подгонки (правый) сравнивает фактические и предсказанные значения; красная пунктирная линия — идеальное соответствие. Чем ближе точки к линии, тем точнее предсказания; появление закономерного рисунка (например, кривизны) может означать, что связь на самом деле не линейна. 

Эти визуализации помогают выявлять переобучение или недообучение, обнаруживать паттерны в остатках, указывающие на пропущенные зависимости, и в целом оценивать эффективность модели.

Практические применения

Линейная регрессия широко используется в индустрии для прогнозирования и поддержки принятия решений. В недвижимости она оценивает цены домов по таким факторам, как размер и расположение. 

В продажах и маркетинге — для прогнозирования спроса и оптимизации бюджета; в здравоохранении — для оценки риска заболеваний. В финансах — для прогноза цен акций и скоринга, в производстве — для контроля качества и прогнозирования отказов. 

Когда использовать линейную регрессию

  • Между признаками и целевой переменной существует линейная зависимость.
  • Интерпретируемость и простота важнее сложного моделирования.
  • Данные требуют минимальной инженерии признаков.

Когда не использовать линейную регрессию

Заключение

Линейная регрессия остаётся одним из самых фундаментальных и широко применяемых методов машинного обучения и статистического моделирования. Несмотря на простоту, это мощный инструмент для понимания взаимосвязей между переменными и построения предсказаний в реальных задачах.

Ключевые выводы из руководства:

  • Разнообразные применения. Линейная регрессия даёт ценные инсайты в разных отраслях и для разных типов задач.
  • Интерпретируемость. В отличие от сложных «чёрных ящиков», линейная регрессия даёт понятную интерпретацию через коэффициенты.
  • Отбор признаков. Правильный выбор признаков и учёт мультиколлинеарности помогают сохранять точность, устойчивость и надёжность моделей. 

За дополнительной информацией об интерполяции строк в Python обратитесь к материалам DataCamp.

FAQ по линейной регрессии в Sklearn

Что такое линейная регрессия и как она работает?

Линейная регрессия — это статистический метод моделирования взаимосвязи между целевой переменной и одним или несколькими предикторами. Она находит линию наилучшего соответствия, минимизируя разницу между фактическими и предсказанными значениями методом наименьших квадратов.

Каковы предположения линейной регрессии?

Линейная регрессия опирается на следующие предположения:

  • Линейность: зависимость между предикторами и целевой переменной — линейная.
  • Независимость: наблюдения независимы друг от друга.
  • Гомоскедастичность: дисперсия остатков постоянна для всех значений.
  • Нормальность остатков: остатки должны быть распределены нормально.
  • Отсутствие мультиколлинеарности: независимые переменные не должны быть сильно коррелированы.

Зачем масштабировать признаки перед обучением модели линейной регрессии?

Масштабирование признаков гарантирует, что все признаки вносят сопоставимый вклад в модель. Так как линейная регрессия чувствительна к величинам признаков, масштабирование предотвращает доминирование переменных с большими значениями над переменными с меньшими. Используйте StandardScaler() для стандартизации

Что такое мультиколлинеарность и как её обнаружить?

Мультиколлинеарность — это ситуация, когда две или более независимых переменных сильно коррелируют, что делает интерпретацию коэффициентов ненадёжной. Её можно обнаружить с помощью коэффициента инфляции дисперсии (VIF).

Как оценить модель линейной регрессии?

Ключевые метрики качества:

  • R² (коэффициент детерминации) → измеряет, насколько хорошо модель объясняет дисперсию целевой переменной.
  • MSE (среднеквадратичная ошибка) → средний квадрат ошибки между фактическими и предсказанными значениями.
  • RMSE (корень из среднеквадратичной ошибки) → более интерпретируемая версия MSE.
Темы

Лучшие курсы DataCamp

Track

Младший специалист по данным и науке о данных на Python

90 ч
Изучите data science на Python — от обработки данных до машинного обучения. Этот трек предоставляет навыки, необходимые для успеха в роли data scientist!
ПодробнееRight Arrow
Начать Курс
Смотрите большеRight Arrow