Einführung
Beim maschinellen Lernen ist die Modellauswahl der Prozess, um das beste Modell für einen gegebenen Datensatz auszuwählen. Dabei wird der geeignete Schätzer ausgewählt und seine Parameter optimiert, um die optimale Leistung zu erzielen. In diesem Tutorial wird Ihnen der Prozess der Modellauswahl in scikit-learn erläutert.
Tipps für die VM
Nachdem der VM-Start abgeschlossen 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 bei der Lernphase Probleme haben, können Sie Labby um Hilfe bitten. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem für Sie prompt beheben.
Score und Kreuzvalidierte Scores
Schätzer in scikit-learn bieten eine score-Methode an, die verwendet werden kann, um die Qualität der Modellanpassung oder der Vorhersage für neue Daten zu bewerten. Diese Methode gibt einen Score zurück, wobei ein höherer Wert eine bessere Leistung anzeigt.
from sklearn import datasets, svm
## Lade den Digits-Datensatz
X_digits, y_digits = datasets.load_digits(return_X_y=True)
## Erstelle einen SVM-Klassifizierer mit linearer Kernel
svc = svm.SVC(C=1, kernel='linear')
## Trainiere den Klassifizierer auf den Trainingsdaten und berechne den Score auf den Testdaten
score = svc.fit(X_digits[:-100], y_digits[:-100]).score(X_digits[-100:], y_digits[-100:])
Um eine genauere Messung der Vorhersagegenauigkeit zu erhalten, können wir Kreuzvalidierung verwenden. Die Kreuzvalidierung besteht darin, die Daten in mehrere Folds aufzuteilen, wobei jeder Fold als Testmenge und die verbleibenden Folds als Trainingsmengen verwendet werden. Dieser Prozess wird mehrmals wiederholt, und die Scores werden gemittelt, um die Gesamtleistung zu erhalten.
import numpy as np
## Teile die Daten in 3 Folds auf
X_folds = np.array_split(X_digits, 3)
y_folds = np.array_split(y_digits, 3)
## Führe die Kreuzvalidierung durch
scores = []
for k in range(3):
X_train = list(X_folds)
X_test = X_train.pop(k)
X_train = np.concatenate(X_train)
y_train = list(y_folds)
y_test = y_train.pop(k)
y_train = np.concatenate(y_train)
scores.append(svc.fit(X_train, y_train).score(X_test, y_test))
print(scores)
Kreuzvalidierungsgeneratoren
Scikit-learn bietet eine Sammlung von Klassen an, die verwendet werden können, um Trainings-/Test-Indizes für beliebte Kreuzvalidierungsstrategien zu generieren. Diese Klassen haben eine split-Methode, die den Eingabedatensatz akzeptiert und die Trainings-/Test-Set-Indizes für jede Iteration des Kreuzvalidierungsprozesses liefert.
from sklearn.model_selection import KFold
## Teile die Daten in K Folds auf, indem die KFold-Kreuzvalidierung verwendet wird
k_fold = KFold(n_splits=5)
for train_indices, test_indices in k_fold.split(X_digits):
print(f'Train: {train_indices} | test: {test_indices}')
Die Hilfsfunktion cross_val_score kann verwendet werden, um den Kreuzvalidierungsscore direkt zu berechnen. Sie teilt die Daten in Trainings- und Testsets für jede Iteration der Kreuzvalidierung auf, trainiert den Schätzer auf dem Trainingsset und berechnet den Score basierend auf dem Testset.
from sklearn.model_selection import cross_val_score
## Berechne den Kreuzvalidierungsscore für den SVM-Klassifizierer
scores = cross_val_score(svc, X_digits, y_digits, cv=k_fold, n_jobs=-1)
print(scores)
Grid-Search
Grid-Search ist eine Technik, die verwendet werden kann, um die beste Kombination von Parameternwerten für einen Schätzer zu finden. Dabei wird ein Gitter von Parameternwerten angegeben, der Schätzer für jede Kombination von Parametern auf den Trainingsdaten angepasst und diejenigen Parameter ausgewählt, die zu dem höchsten Kreuzvalidierungsscore führen.
from sklearn.model_selection import GridSearchCV
## Definiere ein Gitter von Parameternwerten
Cs = np.logspace(-6, -1, 10)
## Erstelle ein GridSearchCV-Objekt mit dem SVM-Klassifizierer und dem Parametergitter
clf = GridSearchCV(estimator=svc, param_grid=dict(C=Cs), n_jobs=-1)
## Passt das GridSearchCV-Objekt auf den Trainingsdaten an
clf.fit(X_digits[:1000], y_digits[:1000])
print(clf.best_score_)
print(clf.best_estimator_.C)
Kreuzvalidierte Schätzer
Einige Schätzer in scikit-learn haben eingebautes Kreuzvalidierungsvermögen. Diese kreuzvalidierten Schätzer wählen ihre Parameter automatisch durch Kreuzvalidierung, was den Modellauswahlprozess effizienter macht.
from sklearn import linear_model, datasets
## Erstelle ein LassoCV-Objekt
lasso = linear_model.LassoCV()
## Lade den Diabetes-Datensatz
X_diabetes, y_diabetes = datasets.load_diabetes(return_X_y=True)
## Trainiere das LassoCV-Objekt auf dem Datensatz
lasso.fit(X_diabetes, y_diabetes)
print(lasso.alpha_)
Zusammenfassung
In diesem Tutorial haben wir den Prozess der Modellauswahl in scikit-learn kennengelernt. Wir haben die Bewertungs- Methoden, die Kreuzvalidierung, das Grid-Search und die kreuzvalidierten Schätzer untersucht. Indem Sie diese Schritte befolgen, können Sie den besten Schätzer für einen gegebenen Datensatz auswählen und seine Parameter optimieren, um die optimale Leistung zu erzielen.