Spec-Zone.ru › scikit-learn

Примечание

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

Влияние регуляризации модели на ошибку обучения и проверки

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

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

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Генерация выборочных данных

Мы генерируем регрессионный набор данных, который содержит много функций по сравнению с количеством образцов. Однако только 10% функций информативны. В этом контексте часто используются линейные модели с L1-понижением, чтобы восстановить набор разреженных коэффициентов.

from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

n_samples_train, n_samples_test, n_features = 150, 300, 500
X, y, true_coef = make_regression(
    n_samples=n_samples_train + n_samples_test,
    n_features=n_features,
    n_informative=50,
    shuffle=False,
    noise=1.0,
    coef=True,
    random_state=42,
)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, train_size=n_samples_train, test_size=n_samples_test, shuffle=False
)

Определение модели

Здесь мы не используем модель, которая только демонстрирует L1-штраф. Вместо этого мы используем модель ElasticNet, которая демонстрирует как L1, так и L2-штрафы.

Мы фиксируем параметр l1_ratio, чтобы решение, найденное моделью, всё ещё оставалось разреженным. Таким образом, этот тип модели пытается найти разрешённое решение, но одновременно пытается сжать все коэффициенты к нулю.

Кроме того, мы принуждаем коэффициенты модели быть положительными, поскольку мы знаем, что make_regression генерирует ответ с положительным сигналом. Поэтому мы используем эти предварительные знания для получения лучшей модели.

from sklearn.linear_model import ElasticNet

enet = ElasticNet(l1_ratio=0.9, positive=True, max_iter=10_000)

Оценка влияния параметра регуляризации

Для оценки влияния параметра регуляризации мы используем кривую валидации. Эта кривая показывает значения точности обучения и проверки модели для различных значений параметра регуляризации.

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

Кривая валидации помогает найти хорошее компромиссное решение между двумя крайностями: модель не регулируется и, таким образом, достаточно гибкая, чтобы подогнать сигнал, но не слишком гибкая, чтобы переобучаться. ValidationCurveDisplay позволяет нам отображать значения точности обучения и валидации по ряду значений alpha.

import numpy as np

from sklearn.model_selection import ValidationCurveDisplay

alphas = np.logspace(-5, 1, 60)
disp = ValidationCurveDisplay.from_estimator(
    enet,
    X_train,
    y_train,
    param_name="alpha",
    param_range=alphas,
    scoring="r2",
    n_jobs=2,
    score_type="both",
)
disp.ax_.set(
    title=r"Validation Curve for ElasticNet (R$^2$ Score)",
    xlabel=r"alpha (regularization strength)",
    ylabel="R$^2$ Score",
)

test_scores_mean = disp.test_scores.mean(axis=1)
idx_avg_max_test_score = np.argmax(test_scores_mean)
disp.ax_.vlines(
    alphas[idx_avg_max_test_score],
    disp.ax_.get_ylim()[0],
    test_scores_mean[idx_avg_max_test_score],
    color="k",
    linewidth=2,
    linestyle="--",
    label=f"Optimum on test\n$\\alpha$ = {alphas[idx_avg_max_test_score]:.2e}",
)
_ = disp.ax_.legend(loc="lower right")
Validation Curve for ElasticNet (R$^2$ Score)

Чтобы найти оптимальный параметр регуляризации, мы можем выбрать значение alpha, которое максимизирует значение точности валидации.

Сравнение коэффициентов

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

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

enet.set_params(alpha=alphas[idx_avg_max_test_score]).fit(X_train, y_train)
print(
    f"Test score: {enet.score(X_test, y_test):.3f}",
)
Test score: 0.884

Теперь мы построим график истинных коэффициентов и оценённых коэффициентов.

import matplotlib.pyplot as plt

fig, axs = plt.subplots(ncols=2, figsize=(12, 6), sharex=True, sharey=True)
for ax, coef, title in zip(axs, [true_coef, enet.coef_], ["True", "Model"]):
    ax.stem(coef)
    ax.set(
        title=f"{title} Coefficients",
        xlabel="Feature Index",
        ylabel="Coefficient Value",
    )
fig.suptitle(
    "Comparison of the coefficients of the true generative model and \n"
    "the estimated elastic net coefficients"
)

plt.show()
Comparison of the coefficients of the true generative model and  the estimated elastic net coefficients, True Coefficients, Model Coefficients

Хотя исходные коэффициенты разреженные, оценённые коэффициенты не такие разреженные. Причина в том, что мы зафиксировали параметр l1_ratio в значении 0.9. Мы могли бы заставить модель получить более разрешенное решение, увеличив параметр l1_ratio.

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

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_train_error_vs_test_error.ipynb

Download Python source code: plot_train_error_vs_test_error.py

Download zipped: plot_train_error_vs_test_error.zip

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

Коэффициенты регрессии Риджа как функция L2-регуляризации

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

Модели на основе L1 для разреженных сигналов

Путь регуляризации логистической регрессии L1

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/model_selection/plot_train_error_vs_test_error.html

Spec-Zone.ru

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