Einführung
In diesem Lab werden wir lernen, wie man den besten Hyperparameter Alpha für Lasso-Regressionsmodelle auswählt. Zwei Ansätze werden diskutiert: (1) die optimale Alpha-Wertauswahl ausschließlich mithilfe des Trainingssatzes und eines Informationskriteriums und (2) die Auswahl des besten Hyperparameters unter Verwendung von Kreuzvalidierung. Wir werden in diesem Beispiel den Diabetes-Datensatz verwenden.
VM-Tipps
Nachdem die VM gestartet ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.
Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund der Einschränkungen von Jupyter Notebook nicht automatisiert werden.
Wenn Sie während des Lernens Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.
Datensatz
Zunächst werden wir den Diabetes-Datensatz mithilfe der Funktion load_diabetes aus sklearn.datasets laden. Der Datensatz besteht aus 10 Basisvariablen, Alter, Geschlecht, Körpermasseindex, durchschnittlicher Blutdruck und sechs Blutserummessungen sowie einer quantitativen Messung der Krankheitsentwicklung ein Jahr nach der Basis.
from sklearn.datasets import load_diabetes
X, y = load_diabetes(return_X_y=True, as_frame=True)
X.head()
Hinzufügen von Zufallsmerkmalen
Wir werden einigen Zufallsmerkmalen zu den ursprünglichen Daten hinzufügen, um die von dem Lasso-Modell durchgeführte Merkmalsauswahl besser zu veranschaulichen. Zufallsmerkmale werden mithilfe der Funktion RandomState aus numpy generiert.
import numpy as np
import pandas as pd
rng = np.random.RandomState(42)
n_random_features = 14
X_random = pd.DataFrame(
rng.randn(X.shape[0], n_random_features),
columns=[f"random_{i:02d}" for i in range(n_random_features)],
)
X = pd.concat([X, X_random], axis=1)
X[X.columns[::3]].head()
Auswahl von Lasso über ein Informationskriterium
Wir werden die Funktion LassoLarsIC aus sklearn.linear_model verwenden, um einen Lasso-Schätzer bereitzustellen, der das Akaike-Informationskriterium (AIC) oder das Bayes-Informationskriterium (BIC) verwendet, um den optimalen Wert des Regularisierungsparameters Alpha zu wählen. Wir werden zunächst ein Lasso-Modell mit dem AIC-Kriterium anpassen.
import time
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LassoLarsIC
from sklearn.pipeline import make_pipeline
start_time = time.time()
lasso_lars_ic = make_pipeline(StandardScaler(), LassoLarsIC(criterion="aic")).fit(X, y)
fit_time = time.time() - start_time
Speichern von Ergebnissen und Prüfen des optimalen Alpha
Wir werden die AIC-Metrik für jeden Wert von Alpha, der während fit verwendet wird, speichern. Anschließend werden wir die gleiche Analyse mit dem BIC-Kriterium durchführen. Schließlich werden wir überprüfen, welcher Wert von alpha zu dem minimalen AIC und BIC führt.
results = pd.DataFrame(
{
"alphas": lasso_lars_ic[-1].alphas_,
"AIC criterion": lasso_lars_ic[-1].criterion_,
}
).set_index("alphas")
alpha_aic = lasso_lars_ic[-1].alpha_
lasso_lars_ic.set_params(lassolarsic__criterion="bic").fit(X, y)
results["BIC criterion"] = lasso_lars_ic[-1].criterion_
alpha_bic = lasso_lars_ic[-1].alpha_
def highlight_min(x):
x_min = x.min()
return ["font-weight: bold" if v == x_min else "" for v in x]
results.style.apply(highlight_min)
Plotten von AIC- und BIC-Werten
Schließlich werden wir die AIC- und BIC-Werte für die verschiedenen Alpha-Werte plotten. Die vertikalen Linien im Plot entsprechen dem für jedes Kriterium gewählten Alpha. Das ausgewählte Alpha entspricht dem Minimum des AIC- oder BIC-Kriteriums.
ax = results.plot()
ax.vlines(
alpha_aic,
results["AIC criterion"].min(),
results["AIC criterion"].max(),
label="alpha: AIC estimate",
linestyles="--",
color="tab:blue",
)
ax.vlines(
alpha_bic,
results["BIC criterion"].min(),
results["BIC criterion"].max(),
label="alpha: BIC estimate",
linestyle="--",
color="tab:orange",
)
ax.set_xlabel(r"$\alpha$")
ax.set_ylabel("criterion")
ax.set_xscale("log")
ax.legend()
_ = ax.set_title(
f"Information-criterion for model selection (training time {fit_time:.2f}s)"
)
Auswahl von Lasso über Kreuzvalidierung
Wir werden zwei verschiedene Schätzer verwenden, um den besten Hyperparameter Alpha mit integrierter Kreuzvalidierung zu wählen: LassoCV und LassoLarsCV. Für beide Algorithmen werden wir eine 20-fache Kreuzvalidierungsstrategie verwenden.
Lasso über Koordinatenabstieg
Wir werden die Hyperparameteroptimierung mit LassoCV vornehmen.
from sklearn.linear_model import LassoCV
start_time = time.time()
model = make_pipeline(StandardScaler(), LassoCV(cv=20)).fit(X, y)
fit_time = time.time() - start_time
Lasso über die kleinste Winkelregression
Wir werden die Hyperparameteroptimierung mit LassoLarsCV vornehmen.
from sklearn.linear_model import LassoLarsCV
start_time = time.time()
model = make_pipeline(StandardScaler(), LassoLarsCV(cv=20)).fit(X, y)
fit_time = time.time() - start_time
Zusammenfassung des Kreuzvalidierungsansatzes
Beide Algorithmen liefern ungefähr die gleichen Ergebnisse. Lars berechnet nur für jede Knickstelle im Pfad einen Lösungsweg. Dadurch ist es sehr effizient, wenn es nur wenige Knickstellen gibt, was der Fall ist, wenn es nur wenige Merkmale oder Proben gibt. Im Gegensatz dazu berechnet der Koordinatenabstieg die Pfadpunkte auf einem vorgegebenen Gitter (hier verwenden wir die Standardeinstellungen). Daher ist es effizienter, wenn die Anzahl der Gitterpunkte kleiner ist als die Anzahl der Knickstellen im Pfad. Eine solche Strategie kann interessant sein, wenn die Anzahl der Merkmale wirklich groß ist und es in jeder Kreuzvalidierungsgruppe genug Proben zum Auswählen gibt. Was die numerischen Fehler betrifft, werden bei stark korrelierten Variablen bei Lars mehr Fehler akkumuliert, während der Koordinatenabstieg-Algorithmus nur den Pfad auf einem Gitter abtastet.
Zusammenfassung
In diesem Lab haben wir gelernt, wie man den besten Hyperparameter Alpha für Lasso-Regressionsmodelle auswählt. Wir haben zwei Ansätze diskutiert: (1) die Auswahl des optimalen Wertes von Alpha ausschließlich mithilfe des Trainingssatzes und eines Informationskriteriums und (2) die Auswahl des besten Hyperparameters mithilfe von Kreuzvalidierung. Wir haben in diesem Beispiel den Diabetes-Datensatz verwendet. Beide Ansätze können ähnlich wirken, aber die in-sample-Hyperparameterauswahl zeigt ihre Effizienz in Bezug auf die Rechenleistung. Allerdings kann sie nur verwendet werden, wenn die Anzahl der Proben im Vergleich zur Anzahl der Merkmale groß genug ist. Die Hyperparameteroptimierung über Kreuzvalidierung ist eine sichere Strategie, die in verschiedenen Einstellungen funktioniert.