Примечание
Перейти к концу, чтобы загрузить весь пример кода. или запустить этот пример в браузере с помощью 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 минут 6.852 секунды)
Связанные примеры
© 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