Geschachtelte Kreuzvalidierung für die Modellauswahl (Nested Cross-Validation for Model Selection)

Beginner

This tutorial is from open-source community. Access the source code

Einführung

Geschachtelte Kreuzvalidierung (Nested cross-validation) ist eine Technik, die zur Schätzung des Verallgemeinerungsfehlers eines Modells und seiner Hyperparameter verwendet wird. Sie ist besonders nützlich, wenn zwischen verschiedenen Modellen gewählt werden muss oder wenn Hyperparameter optimiert werden müssen. In diesem Tutorial vergleichen wir nicht-geschachtelte und geschachtelte Kreuzvalidierung anhand eines Support-Vektor-Klassifikator-Modells (Support vector classifier model) mit dem Iris-Datensatz. Wir werden auch den Leistungsunterschied zwischen den beiden Methoden visualisieren.

Tipps für die virtuelle Maschine (VM)

Nachdem die virtuelle Maschine gestartet wurde, klicken Sie in der oberen linken Ecke auf die Registerkarte Notebook, um auf Jupyter Notebook für die Übung zuzugreifen.

Manchmal müssen Sie möglicherweise einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Aufgrund von Einschränkungen in Jupyter Notebook kann die Überprüfung von Vorgängen nicht automatisiert werden.

Wenn Sie während des Lernens Probleme haben, können Sie sich gerne an Labby wenden. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem umgehend für Sie lösen.

Laden des Datensatzes

Der erste Schritt besteht darin, den Iris-Datensatz aus scikit-learn zu laden.

from sklearn.datasets import load_iris

## Laden des Datensatzes
iris = load_iris()
X_iris = iris.data
y_iris = iris.target

Definition der Hyperparameter

Als nächstes definieren wir die Hyperparameter, die für den Support-Vektor-Klassifikator (Support vector classifier) optimiert werden sollen. In diesem Fall optimieren wir den Kostenparameter C und den Kernel-Koeffizienten gamma.

## Set up possible values of parameters to optimize over
p_grid = {"C": [1, 10, 100], "gamma": [0.01, 0.1]}

Definition des Modells

Wir verwenden einen Support-Vektor-Klassifikator (Support vector classifier) mit einem Radialbasisfunktions-Kernel (radial basis function kernel).

from sklearn.svm import SVC

## We will use a Support Vector Classifier with "rbf" kernel
svm = SVC(kernel="rbf")

Nicht-geschachtelte Kreuzvalidierung (Non-Nested Cross-Validation)

Wir verwenden nicht-geschachtelte Kreuzvalidierung, um die Hyperparameter zu optimieren und die Leistung des Modells zu bewerten. Die Funktion GridSearchCV führt eine erschöpfende Suche über die angegebenen Parameterwerte für einen Schätzer (estimator) durch. Wir verwenden eine 4-fache Kreuzvalidierung.

from sklearn.model_selection import GridSearchCV

## Non_nested parameter search and scoring
clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=4)
clf.fit(X_iris, y_iris)
non_nested_score = clf.best_score_

Geschachtelte Kreuzvalidierung (Nested Cross-Validation)

Wir verwenden geschachtelte Kreuzvalidierung, um den Verallgemeinerungsfehler des Modells und seiner Hyperparameter abzuschätzen. In der inneren Schleife führen wir eine Rastersuche (grid search) durch, um die besten Hyperparameter für jeden Trainingssatz zu finden. In der äußeren Schleife bewerten wir die Leistung des Modells auf dem Testsatz.

from sklearn.model_selection import KFold, cross_val_score

## Number of random trials
NUM_TRIALS = 30

## Arrays to store scores
non_nested_scores = np.zeros(NUM_TRIALS)
nested_scores = np.zeros(NUM_TRIALS)

## Loop for each trial
for i in range(NUM_TRIALS):
    ## Choose cross-validation techniques for the inner and outer loops,
    ## independently of the dataset.
    inner_cv = KFold(n_splits=4, shuffle=True, random_state=i)
    outer_cv = KFold(n_splits=4, shuffle=True, random_state=i)

    ## Nested CV with parameter optimization
    clf = GridSearchCV(estimator=svm, param_grid=p_grid, cv=inner_cv)
    nested_score = cross_val_score(clf, X=X_iris, y=y_iris, cv=outer_cv)
    nested_scores[i] = nested_score.mean()

score_difference = non_nested_score - nested_scores.mean()

Visualisierung der Ergebnisse

Wir visualisieren die Ergebnisse der nicht-geschachtelten und geschachtelten Kreuzvalidierung mithilfe eines Balkendiagramms.

from matplotlib import pyplot as plt

## Plot bar chart of the difference.
plt.bar(["Non-Nested", "Nested"], [non_nested_score, nested_scores.mean()])
plt.ylim([0.9, 1.0])
plt.ylabel("Score")
plt.title("Non-Nested and Nested Cross-Validation Scores")
plt.show()

Zusammenfassung

Geschachtelte Kreuzvalidierung (Nested cross-validation) ist eine leistungsstarke Technik, um den Verallgemeinerungsfehler eines Modells und seiner Hyperparameter abzuschätzen. Sie kann helfen, Überanpassung (Overfitting) zu vermeiden und sicherstellen, dass das Modell auf neuen Daten gut performt. In diesem Tutorial haben wir die nicht-geschachtelte und die geschachtelte Kreuzvalidierung an einem Support-Vektor-Klassifikator-Modell (Support vector classifier model) mit dem Iris-Datensatz verglichen. Wir haben den Unterschied in der Leistung zwischen den beiden Methoden mithilfe eines Balkendiagramms visualisiert.