Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.
Метод наименьших квадратов и регрессия Риджа
- Метод наименьших квадратов: покажем, как использовать модель метода наименьших квадратов (МНК)
LinearRegressionдля одного признака из набора данных о диабете. Мы обучим модель на части данных, оценим её на тестовой выборке и визуализируем прогнозы. - Дисперсия метода наименьших квадратов и регрессии Риджа: затем покажем, что дисперсия МНК может быть высокой при разреженных или зашумлённых данных, многократно обучая модель на очень маленькой синтетической выборке. Регрессия Риджа
Ridgeуменьшает эту дисперсию, накладывая штраф на коэффициенты (уменьшая их значения), что позволяет получать более стабильные прогнозы.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Загрузка и подготовка данных
Загрузим набор данных о диабете. Для простоты оставим в данных только один признак. Затем разделим данные и целевую переменную на обучающую и тестовую выборки.
from sklearn.datasets import load_diabetes from sklearn.model_selection import train_test_split X, y = load_diabetes(return_X_y=True) X = X[:, [2]] # Use only one feature X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=20, shuffle=False)
Модель линейной регрессии
Создадим модель линейной регрессии и обучим её на обучающих данных. Обратите внимание, что по умолчанию в модель добавляется свободный член. Этим поведением можно управлять с помощью параметра fit_intercept.
from sklearn.linear_model import LinearRegression regressor = LinearRegression().fit(X_train, y_train)
Оценка модели
Оценим качество модели на тестовой выборке с помощью среднеквадратичной ошибки и коэффициента детерминации.
from sklearn.metrics import mean_squared_error, r2_score
y_pred = regressor.predict(X_test)
print(f"Mean squared error: {mean_squared_error(y_test, y_pred):.2f}")
print(f"Coefficient of determination: {r2_score(y_test, y_pred):.2f}")
Mean squared error: 2548.07 Coefficient of determination: 0.47
Визуализация результатов
Наконец, визуализируем результаты для обучающих и тестовых данных.
import matplotlib.pyplot as plt
fig, ax = plt.subplots(ncols=2, figsize=(10, 5), sharex=True, sharey=True)
ax[0].scatter(X_train, y_train, label="Train data points")
ax[0].plot(
X_train,
regressor.predict(X_train),
linewidth=3,
color="tab:orange",
label="Model predictions",
)
ax[0].set(xlabel="Feature", ylabel="Target", title="Train set")
ax[0].legend()
ax[1].scatter(X_test, y_test, label="Test data points")
ax[1].plot(X_test, y_pred, linewidth=3, color="tab:orange", label="Model predictions")
ax[1].set(xlabel="Feature", ylabel="Target", title="Test set")
ax[1].legend()
fig.suptitle("Linear Regression")
plt.show()

МНК на подмножестве с одним признаком обучает линейную функцию, минимизирующую среднеквадратичную ошибку на обучающих данных. Оценить качество обобщения модели можно по значению R^2 и среднеквадратичной ошибке на тестовой выборке. В задачах с большим числом признаков обычный МНК часто приводит к переобучению, особенно если данные зашумлены. Уменьшить его помогают методы регуляризации, например регрессия Риджа или Лассо.
Дисперсия метода наименьших квадратов и регрессии Риджа
Затем нагляднее продемонстрируем проблему высокой дисперсии на крошечном синтетическом наборе данных. Возьмём всего две точки, будем многократно добавлять к ним небольшой гауссовский шум и повторно обучать модели МНК и Риджа. Построим каждую новую прямую и увидим, насколько сильно могут меняться результаты МНК, тогда как регрессия Риджа остаётся стабильнее благодаря штрафному члену.
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
X_train = np.c_[0.5, 1].T
y_train = [0.5, 1]
X_test = np.c_[0, 2].T
np.random.seed(0)
classifiers = dict(
ols=linear_model.LinearRegression(), ridge=linear_model.Ridge(alpha=0.1)
)
for name, clf in classifiers.items():
fig, ax = plt.subplots(figsize=(4, 3))
for _ in range(6):
this_X = 0.1 * np.random.normal(size=(2, 1)) + X_train
clf.fit(this_X, y_train)
ax.plot(X_test, clf.predict(X_test), color="gray")
ax.scatter(this_X, y_train, s=3, c="gray", marker="o", zorder=10)
clf.fit(X_train, y_train)
ax.plot(X_test, clf.predict(X_test), linewidth=2, color="blue")
ax.scatter(X_train, y_train, s=30, c="red", marker="+", zorder=10)
ax.set_title(name)
ax.set_xlim(0, 2)
ax.set_ylim((0, 1.6))
ax.set_xlabel("X")
ax.set_ylabel("y")
fig.tight_layout()
plt.show()
Заключение
- В первом примере мы применили МНК к реальному набору данных и показали, как обычная линейная модель подбирает параметры, минимизируя квадратичную ошибку на обучающей выборке.
- Во втором примере прямые, построенные методом МНК, сильно менялись при каждом добавлении шума, что отражает высокую дисперсию метода на разреженных или зашумлённых данных. Напротив, регрессия Риджа вводит член регуляризации, уменьшающий коэффициенты и стабилизирующий прогнозы.
Такие методы, как Ridge или Lasso (использующий штраф L1), часто применяются для улучшения обобщающей способности и снижения переобучения. Хорошо настроенные модели Риджа или Лассо часто превосходят обычный МНК, если признаки коррелируют, данные зашумлены или размер выборки мал.
Общее время выполнения скрипта: (0 минут 0.415 секунды)
Связанные примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/linear_model/plot_ols_ridge.html

