Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Train-Test-Split und Kreuzvalidierung | K-NN-Klassifikator
Klassifikation mit Python

Train-Test-Split und Kreuzvalidierung

Swipe um das Menü anzuzeigen

In den vorherigen Kapiteln haben wir die Modelle erstellt und neue Werte vorhergesagt. Aber wir wissen nicht, wie gut das Modell tatsächlich arbeitet und ob diese Vorhersagen vertrauenswürdig sind.

Aufteilung in Trainings- und Testdaten

Um die Leistung des Modells zu messen, benötigen wir einen Teil der gelabelten Daten, den das Modell noch nicht gesehen hat. Daher teilen wir alle gelabelten Daten zufällig in Trainingsdaten und Testdaten auf.

traintestset

Dies ist mit der Funktion train_test_split() aus sklearn möglich.

TrainTestFunc

In der Regel wird das Modell zu 70-90 % für das Trainingsset und zu 10-30 % für das Testset aufgeteilt.

Note
Hinweis

Wenn Ihr Datensatz Millionen von Instanzen enthält, reicht es in der Regel aus, nur einige Tausend für den Test zu verwenden. In solchen Fällen können Sie sogar weniger als 10 % der Daten für den Test reservieren.

Nun kann das Modell mit dem Trainingsdatensatz trainiert und seine Genauigkeit mit dem Testdatensatz bewertet werden.

123456789101112131415161718192021
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] # Splitting the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train, y_train) # Printing the accuracy on the test set print(knn.score(X_test, y_test))

Aber dieser Ansatz hat einige Schwächen:

  • Es werden nicht alle verfügbaren Daten für das Training verwendet, was unser Modell verbessern könnte;
  • Da die Genauigkeit des Modells nur an einem kleinen Teil der Daten (Testmenge) bewertet wird, kann dieser Genauigkeitswert bei kleineren Datensätzen unzuverlässig sein. Sie können den obigen Code mehrmals ausführen und beobachten, wie sich die Genauigkeit jedes Mal ändert, wenn eine neue Testmenge ausgewählt wird.

Kreuzvalidierung

Kreuzvalidierung wurde entwickelt, um das Problem des Overfittings zu adressieren und sicherzustellen, dass das Modell gut auf neue, unbekannte Daten generalisieren kann. Man kann es sich wie ein Klassenzimmertraining für das Modell vorstellen – es hilft dem Modell, auf ausgewogenere Weise zu lernen, bevor es dem eigentlichen Abschlusstest begegnet.

Die Idee ist, den gesamten Datensatz zu mischen und in n gleich große Teile, sogenannte Folds, zu unterteilen. Anschließend durchläuft das Modell n Iterationen. In jeder Iteration werden n-1 Folds für das Training und 1 Fold für die Validierung verwendet. So wird jeder Teil der Daten einmal zur Validierung genutzt und wir erhalten eine zuverlässigere Schätzung der Modellleistung.

Beachten Sie, dass Kreuzvalidierung nicht den Testdatensatz ersetzt. Nachdem Sie die Kreuzvalidierung zur Auswahl und Feinabstimmung Ihres Modells verwendet haben, sollten Sie es auf einem separaten Testdatensatz bewerten, um eine unverfälschte Einschätzung der tatsächlichen Leistungsfähigkeit zu erhalten.

Note
Hinweis

Eine gängige Wahl für die Anzahl der Folds ist 5. In diesem Fall wird ein Fold als Testmenge verwendet und die verbleibenden 4 Folds dienen dem Training.

Kreuz

Training von fünf Modellen mit leicht unterschiedlichen Teilmengen. Für jedes Modell Berechnung der Testgenauigkeit:

accuracy=predicted correctlypredicted correctly+predicted incorrectly\text{accuracy} = \frac{\text{predicted correctly}}{\text{predicted correctly} + \text{predicted incorrectly}}

Nach Abschluss dieser Schritte Berechnung des Durchschnitts dieser 5 Genauigkeitswerte als Kreuzvalidierungsgenauigkeit:

accuracyavg=accuracy1+accuracy2+...+accuracy55\text{accuracy}_{avg} = \frac{\text{accuracy}_1+\text{accuracy}_2+...+\text{accuracy}_5}{5}

Es ist zuverlässiger, da wir die Genauigkeit mit allen unseren Daten berechnet haben – nur in fünf Durchläufen unterschiedlich aufgeteilt.

Jetzt, da wir wissen, wie gut das Modell abschneidet, können wir es mit dem gesamten Datensatz erneut trainieren.

Glücklicherweise stellt sklearn die Funktion cross_val_score() zur Verfügung, um das Modell mithilfe von Cross-Validation zu bewerten, sodass Sie dies nicht selbst implementieren müssen:

CrossValFunc

Hier ist ein Beispiel, wie Cross-Validation mit einem k-NN-Modell verwendet wird, das auf dem Star Wars Ratings-Datensatz trainiert wurde:

12345678910111213141516171819
from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.model_selection import cross_val_score df = pd.read_csv('https://codefinity-content-media.s3.eu-west-1.amazonaws.com/b71ff7ac-3932-41d2-a4d8-060e24b00129/starwars_binary.csv') X = df.drop('StarWars6', axis=1) y = df['StarWars6'] scaler = StandardScaler() X = scaler.fit_transform(X) knn = KNeighborsClassifier(n_neighbors=3) # Calculating the accuracy for each split scores = cross_val_score(knn, X, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())

Die standardmäßig für die Klassifikation verwendete Kennzahl ist Genauigkeit.

question mark

Wähle alle richtigen Aussagen aus.

Wählen Sie alle richtigen Antworten aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 6

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 1. Kapitel 6
some-alt