Die Anpassung von Hyperparametern in Modellen des maschinellen Lernens ist teilweise eine Kunst, die das richtige Geschick erfordert, um Erfahrung, Intuition und umfangreiche Experimente in Einklang zu bringen. In der Praxis kann dieser Prozess manchmal überwältigend erscheinen, da komplexe Modelle einen großen Suchraum aufweisen, die Wechselwirkungen zwischen Hyperparametern kompliziert sind und die Leistungssteigerungen durch deren Anpassung oft subtil ausfallen.
Im Folgenden präsentieren wir eine Liste mit 7 Tricks für Scikit-learn, die Ihre Fähigkeiten zur Anpassung von Hyperparametern in Modellen des maschinellen Lernens auf das nächste Level heben.
1. Eingrenzung des Suchraums mit Fachwissen
Ein unbeschränkter Suchraum bedeutet, nach einer Nadel im Heuhaufen zu suchen! Nutzen Sie Fachwissen oder ziehen Sie einen Experten hinzu, um zunächst eine Reihe gut gewählter Grenzen für relevante Hyperparameter in Ihrem Modell festzulegen. Dies hilft, die Komplexität zu reduzieren und die Durchführbarkeit des Prozesses zu erhöhen, indem unrealistische Einstellungen ausgeschlossen werden.
Ein Beispiel für ein Gitter mit zwei typischen Hyperparametern in einem Random Forest könnte wie folgt aussehen:
param_grid = {"max_depth": [3, 5, 7], "min_samples_split": [2, 10]}
2. Breiter Einstieg mit Zufallsuche
In ressourcenarmen Kontexten sollten Sie die Zufallsuche nutzen, eine effiziente Methode zur Erkundung großer Suchräume, indem ein verteilungsbasiertes Sampling-Verfahren verwendet wird, das einige Bereiche von Hyperparameterwerten abtastet. Ein Beispiel für das Sampling über C, den Hyperparameter, der die Steifigkeit der Grenzen in SVM-Modellen steuert:
param_dist = {"C": loguniform(1e-3, 1e2)}
RandomizedSearchCV(SVC(), param_dist, n_iter=20)
3. Lokale Verfeinerung mit Gitter-Suche
Nachdem vielversprechende Bereiche mit einer Zufallsuche gefunden wurden, kann es sinnvoll sein, eine fokussierte Gitter-Suche anzuwenden, um diese Bereiche weiter zu erkunden und marginale Gewinne zu identifizieren. Zuerst erkunden, dann ausnutzen.
GridSearchCV(SVC(), {"C": [5, 10], "gamma": [0.01, 0.1]})
4. Einbettung von Vorverarbeitungspipelines in die Hyperparameter-Anpassung
Scikit-learn-Pipelines sind eine hervorragende Möglichkeit, um End-to-End-Workflows im maschinellen Lernen zu vereinfachen und zu optimieren sowie Probleme wie Datenleckagen zu vermeiden. Sowohl Vorverarbeitungs- als auch Modellhyperparameter können gemeinsam optimiert werden, wenn wir eine Pipeline an die Suchinstanz übergeben:
param_grid = {
"scaler__with_mean": [True, False], # Skalierungs-Hyperparameter
"clf__C": [0.1, 1, 10], # SVM-Modell-Hyperparameter
"clf__kernel": ["linear", "rbf"] # Ein weiterer SVM-Hyperparameter
}
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
grid_search.fit(X_train, y_train)
5. Geschwindigkeit gegen Zuverlässigkeit mit Kreuzvalidierung abwägen
Die Anwendung von Kreuzvalidierung ist der Standard bei der Hyperparameter-Anpassung mit Scikit-learn. Es ist jedoch wichtig zu verstehen, dass das Weglassen dieser Methode bedeutet, dass nur eine einzige Trainings-Validierungs-Trennung verwendet wird: Dies ist schneller, führt jedoch zu variableren und manchmal weniger zuverlässigen Ergebnissen. Eine Erhöhung der Anzahl der Kreuzvalidierungsfalten – z.B. cv=5 – erhöht die Stabilität der Leistung für den Vergleich zwischen Modellen. Finden Sie einen Wert, der für Sie das richtige Gleichgewicht darstellt:
GridSearchCV(model, params, cv=5)
6. Optimierung mehrerer Metriken
Wenn mehrere Leistungsabgleiche bestehen, hilft es, wenn Ihr Anpassungsprozess mehrere Metriken überwacht, um Kompromisse zu erkennen, die möglicherweise unbeabsichtigt bei der Anwendung einer Einzelwertoptimierung auftreten. Außerdem können Sie refit verwenden, um das Hauptziel zur Bestimmung des endgültigen, „besten“ Modells festzulegen.
from sklearn.model_selection import GridSearchCV
param_grid = {
"C": [0.1, 1, 10],
"gamma": [0.01, 0.1]
}
scoring = {
"accuracy": "accuracy",
"f1": "f1"
}
gs = GridSearchCV(
SVC(),
param_grid,
scoring=scoring,
refit="f1", # Metrik zur Auswahl des endgültigen Modells
cv=5
)
gs.fit(X_train, y_train)
7. Ergebnisse weise interpretieren
Sobald Ihr Anpassungsprozess abgeschlossen ist und das Modell mit der besten Punktzahl gefunden wurde, gehen Sie den zusätzlichen Schritt und verwenden Sie cv_results_, um Parameterinteraktionen, Trends usw. besser zu verstehen oder, wenn Sie möchten, eine Visualisierung der Ergebnisse durchzuführen. Dieses Beispiel erstellt einen Bericht und eine Rangliste der Ergebnisse für ein Gitter-Suchobjekt namens gs, nachdem der Such- und Trainingsprozess abgeschlossen ist:
import pandas as pd
results_df = pd.DataFrame(gs.cv_results_)
# Zielspalten für unseren Bericht
columns_to_show = [
'param_clf__C',
'mean_test_score',
'std_test_score',
'mean_fit_time',
'rank_test_score'
]
print(results_df[columns_to_show].sort_values('rank_test_score'))
Fazit
Die Anpassung von Hyperparametern ist am effektivsten, wenn sie sowohl systematisch als auch durchdacht erfolgt. Durch die Kombination intelligenter Suchstrategien, angemessener Validierung und sorgfältiger Interpretation der Ergebnisse können Sie bedeutende Leistungssteigerungen erzielen, ohne Rechenressourcen zu verschwenden oder Überanpassung zu riskieren. Betrachten Sie die Anpassung als einen iterativen Lernprozess und nicht nur als eine Optimierungsaufgabe.