Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.

Метод наименьших квадратов и регрессия Риджа

  1. Метод наименьших квадратов: покажем, как использовать модель метода наименьших квадратов (МНК) LinearRegression для одного признака из набора данных о диабете. Мы обучим модель на части данных, оценим её на тестовой выборке и визуализируем прогнозы.
  2. Дисперсия метода наименьших квадратов и регрессии Риджа: затем покажем, что дисперсия МНК может быть высокой при разреженных или зашумлённых данных, многократно обучая модель на очень маленькой синтетической выборке. Регрессия Риджа 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()
Linear Regression, Train set, Test set

МНК на подмножестве с одним признаком обучает линейную функцию, минимизирующую среднеквадратичную ошибку на обучающих данных. Оценить качество обобщения модели можно по значению 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()
  • ols
  • ridge

Заключение

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

Такие методы, как Ridge или Lasso (использующий штраф L1), часто применяются для улучшения обобщающей способности и снижения переобучения. Хорошо настроенные модели Риджа или Лассо часто превосходят обычный МНК, если признаки коррелируют, данные зашумлены или размер выборки мал.

Общее время выполнения скрипта: (0 минут 0.415 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_ols_ridge.ipynb

Download Python source code: plot_ols_ridge.py

Download zipped: plot_ols_ridge.zip

Связанные примеры

Метод наименьших квадратов с неотрицательными коэффициентами

График зависимости коэффициентов Риджа от силы регуляризации

HuberRegressor и Ridge на наборе данных с сильными выбросами

Сравнение ядерной регрессии Риджа и регрессии гауссовского процесса

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API