Permutations-Test-Score für die Klassifikation

Machine LearningMachine LearningBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Beim maschinellen Lernen bewerten wir die Leistung eines Klassifizierungsmodells oft mithilfe eines Scores. Wir müssen jedoch auch die Signifikanz des Scores testen, um sicherzustellen, dass die Modellleistung nicht rein zufällig ist. Hier kommt der Permutations-Test-Score zum Einsatz. Er generiert eine Nullverteilung, indem er die Genauigkeit des Klassifizierers auf 1000 verschiedenen Permutationen des Datensatzes berechnet. Ein empirischer p-Wert wird dann als das Prozentsatz der Permutationen berechnet, für die der erzielte Score größer ist als der Score, der mit den ursprünglichen Daten erhalten wurde. In diesem Lab verwenden wir die Funktion permutation_test_score aus sklearn.model_selection, um die Signifikanz eines durch Kreuzvalidierung erhaltenen Scores mithilfe von Permutationen zu evaluieren.

Tipps für die VM

Nachdem der Start der VM 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 gerne fragen. Geben Sie nach der Sitzung Feedback ab, und wir werden das Problem für Sie prompt beheben.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49246{{"Permutations-Test-Score für die Klassifikation"}} sklearn/model_selection -.-> lab-49246{{"Permutations-Test-Score für die Klassifikation"}} sklearn/datasets -.-> lab-49246{{"Permutations-Test-Score für die Klassifikation"}} ml/sklearn -.-> lab-49246{{"Permutations-Test-Score für die Klassifikation"}} end

Lade den Datensatz und generiere zufällige Features

Wir werden den Iris-Datensatz verwenden, der aus Messungen von 3 Arten von Irisen besteht, und einige zufällige Feature-Daten (d.h. 20 Features) generieren, die nicht mit den Klassenlabels im Iris-Datensatz korreliert sind.

from sklearn.datasets import load_iris
import numpy as np

iris = load_iris()
X = iris.data
y = iris.target

n_uncorrelated_features = 20
rng = np.random.RandomState(seed=0)
X_rand = rng.normal(size=(X.shape[0], n_uncorrelated_features))

Permutations-Test-Score auf den ursprünglichen Daten

Als nächstes berechnen wir den Permutations-Test-Score mit dem ursprünglichen Iris-Datensatz und dem SVC-Klassifizierer mit accuracy-Score, um das Modell in jeder Runde zu evaluieren.

from sklearn.svm import SVC
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import permutation_test_score

clf = SVC(kernel="linear", random_state=7)
cv = StratifiedKFold(2, shuffle=True, random_state=0)

score_iris, perm_scores_iris, pvalue_iris = permutation_test_score(
    clf, X, y, scoring="accuracy", cv=cv, n_permutations=1000
)

Permutations-Test-Score auf zufälligen Daten

Als nächstes berechnen wir den Permutations-Test-Score mit den zufällig generierten Features und den Iris-Labels, zwischen denen es keine Abhängigkeit zwischen Features und Labels geben sollte.

score_rand, perm_scores_rand, pvalue_rand = permutation_test_score(
    clf, X_rand, y, scoring="accuracy", cv=cv, n_permutations=1000
)

Zeichne die Ergebnisse

Wir zeichnen ein Histogramm der Permutations-Scores (die Nullverteilung) für sowohl den ursprünglichen Iris-Datensatz als auch die randomisierten Daten. Wir markieren auch den Score, den der Klassifizierer auf den ursprünglichen Daten erhalten hat, mit einer roten Linie. Der p-Wert wird auf jedem Graphen angezeigt.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

## Ursprüngliche Daten
ax.hist(perm_scores_iris, bins=20, density=True)
ax.axvline(score_iris, ls="--", color="r")
score_label = f"Score auf ursprünglichen\nDaten: {score_iris:.2f}\n(p-Wert: {pvalue_iris:.3f})"
ax.text(0.7, 10, score_label, fontsize=12)
ax.set_xlabel("Accuracy score")
_ = ax.set_ylabel("Wahrscheinlichkeitsdichte")

plt.show()

fig, ax = plt.subplots()

## Zufällige Daten
ax.hist(perm_scores_rand, bins=20, density=True)
ax.set_xlim(0.13)
ax.axvline(score_rand, ls="--", color="r")
score_label = f"Score auf ursprünglichen\nDaten: {score_rand:.2f}\n(p-Wert: {pvalue_rand:.3f})"
ax.text(0.14, 7.5, score_label, fontsize=12)
ax.set_xlabel("Accuracy score")
ax.set_ylabel("Wahrscheinlichkeitsdichte")

plt.show()

Zusammenfassung

In diesem Lab haben wir gelernt, wie man die Funktion permutation_test_score aus sklearn.model_selection verwendet, um die Signifikanz eines durch Kreuzvalidierung ermittelten Scores mit Hilfe von Permutationen zu evaluieren. Wir haben eine Nullverteilung erzeugt, indem wir die Genauigkeit des Klassifizierers auf 1000 verschiedenen Permutationen des Datensatzes berechnet haben, und einen empirischen p-Wert berechnet als den Anteil der Permutationen, für die der erzielte Score größer ist als der Score, der mit den ursprünglichen Daten erhalten wurde. Wir haben auch die Ergebnisse geplottet, um die Nullverteilung und den Score auf den ursprünglichen Daten zu visualisieren.