Hinweis
Gehen Sie zum Ende, um den vollständigen Beispielcode herunterzuladen oder dieses Beispiel über JupyterLite oder Binder in Ihrem Browser auszuführen.
Auswirkungen der Modellregularisierung auf Trainings- und Testfehler#
In diesem Beispiel bewerten wir den Einfluss des Regularisierungsparameters in einem linearen Modell namens ElasticNet. Zur Durchführung dieser Bewertung verwenden wir eine Validierungskurve mit ValidationCurveDisplay. Diese Kurve zeigt die Trainings- und Testergebnisse des Modells für verschiedene Werte des Regularisierungsparameters.
Sobald wir den optimalen Regularisierungsparameter identifiziert haben, vergleichen wir die wahren und geschätzten Koeffizienten des Modells, um festzustellen, ob das Modell in der Lage ist, die Koeffizienten aus den verrauschten Eingabedaten wiederherzustellen.
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
Beispieldaten generieren#
Wir generieren einen Regressionsdatensatz, der viele Merkmale im Verhältnis zur Anzahl der Stichproben enthält. Allerdings sind nur 10 % der Merkmale informativ. In diesem Kontext werden lineare Modelle mit L1-Regularisierung häufig verwendet, um eine spärliche Menge von Koeffizienten wiederherzustellen.
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
)
Modell Definition#
Hier verwenden wir kein Modell, das nur eine L1-Strafe aufweist. Stattdessen verwenden wir ein ElasticNet-Modell, das sowohl L1- als auch L2-Strafen aufweist.
Wir setzen den Parameter l1_ratio so, dass die vom Modell gefundene Lösung immer noch spärlich ist. Daher versucht dieser Modelltyp, eine spärliche Lösung zu finden, versucht aber gleichzeitig, alle Koeffizienten gegen Null zu schrumpfen.
Darüber hinaus zwingen wir die Koeffizienten des Modells, positiv zu sein, da wir wissen, dass make_regression eine Antwort mit einem positiven Signal erzeugt. Wir nutzen also dieses Vorwissen, um ein besseres Modell zu erhalten.
from sklearn.linear_model import ElasticNet
enet = ElasticNet(l1_ratio=0.9, positive=True, max_iter=10_000)
Auswirkungen des Regularisierungsparameters bewerten#
Um die Auswirkungen des Regularisierungsparameters zu bewerten, verwenden wir eine Validierungskurve. Diese Kurve zeigt die Trainings- und Testergebnisse des Modells für verschiedene Werte des Regularisierungsparameters.
Die Regularisierung alpha ist ein Parameter, der auf die Koeffizienten des Modells angewendet wird: Wenn er gegen Null tendiert, wird keine Regularisierung angewendet und das Modell versucht, die Trainingsdaten mit dem geringsten Fehler anzupassen. Dies führt jedoch zu Überanpassung, wenn die Merkmale verrauscht sind. Wenn alpha ansteigt, werden die Modellkoeffizienten eingeschränkt, und somit kann das Modell die Trainingsdaten nicht so genau anpassen, wodurch Überanpassung vermieden wird. Wenn jedoch zu viel Regularisierung angewendet wird, unterpasst das Modell die Daten und ist nicht in der Lage, das Signal richtig zu erfassen.
Die Validierungskurve hilft dabei, einen guten Kompromiss zwischen beiden Extremen zu finden: Das Modell ist nicht regularisiert und somit flexibel genug, um das Signal anzupassen, aber nicht zu flexibel, um über anzupassen. Die ValidationCurveDisplay ermöglicht es uns, die Trainings- und Validierungsergebnisse über einen Bereich von Alpha-Werten anzuzeigen.
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")

Um den optimalen Regularisierungsparameter zu finden, können wir den Wert von alpha auswählen, der die Validierungsbewertung maximiert.
Koeffizientenvergleich#
Nachdem wir nun den optimalen Regularisierungsparameter identifiziert haben, können wir die wahren und die geschätzten Koeffizienten vergleichen.
Zuerst setzen wir den Regularisierungsparameter auf den optimalen Wert und passen das Modell an die Trainingsdaten an. Zusätzlich zeigen wir die Testbewertung für dieses Modell an.
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
Nun zeichnen wir die wahren Koeffizienten und die geschätzten Koeffizienten auf.
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()

Während die ursprünglichen Koeffizienten spärlich sind, sind die geschätzten Koeffizienten nicht so spärlich. Der Grund dafür ist, dass wir den Parameter l1_ratio auf 0,9 gesetzt haben. Wir könnten das Modell zwingen, eine spärlichere Lösung zu erhalten, indem wir den Parameter l1_ratio erhöhen.
Wir haben jedoch beobachtet, dass unser Modell bei den geschätzten Koeffizienten, die im wahren generativen Modell nahe Null liegen, diese gegen Null schrumpft. Wir rekonstruieren also nicht die wahren Koeffizienten, aber wir erhalten ein sinnvolles Ergebnis, das mit der Leistung auf dem Testdatensatz übereinstimmt.
Gesamtlaufzeit des Skripts: (0 Minuten 4,646 Sekunden)
Verwandte Beispiele
Ridge-Koeffizienten als Funktion der L2-Regularisierung
Ridge-Koeffizienten als Funktion der Regularisierung plotten
Regularisierungspfad der L1-Logistischen Regression