Примечание
Перейти в конец, чтобы скачать полный пример кода или запустить этот пример в браузере через 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")

Чтобы найти оптимальный параметр регуляризации, можно выбрать значение 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()

Хотя исходные коэффициенты разрежены, оцененные коэффициенты разрежены не так сильно. Причина в том, что мы зафиксировали параметр l1_ratio равным 0.9. Мы могли бы заставить модель получить более разреженное решение, увеличив параметр l1_ratio.
Однако мы заметили, что для оцененных коэффициентов, близких к нулю в истинной порождающей модели, наша модель сдвигает их к нулю. Поэтому мы не восстанавливаем истинные коэффициенты, но получаем разумный результат, соответствующий показателям модели на тестовой выборке.
Общее время выполнения скрипта: (0 минут 7.107 секунды)
Связанные примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/model_selection/plot_train_error_vs_test_error.html