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

Kursinhalt

Klassifikation mit Python

Klassifikation mit Python

1. K-NN Klassifikator
2. Logistische Regression
3. Entscheidungsbaum
4. Random Forest
5. Modelle Vergleichen

book
Train-Test-Split. Kreuzvalidierung

In den vorherigen Kapiteln haben wir die Modelle erstellt und neue Werte vorhergesagt. Aber wir haben keine Ahnung, wie gut das Modell funktioniert und ob diese Vorhersagen vertrauenswürdig sind.

Train-test-Split

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

Dies ist mit der Funktion train_test_split() von sklearn erreichbar.

Normalerweise teilt man das Modell in etwa 70-90% für den Trainingssatz und 10-30% für den Testsatz auf. Allerdings sind Zehntausende von Testinstanzen mehr als ausreichend, sodass es nicht notwendig ist, sogar 10% zu verwenden, wenn Ihr Datensatz groß ist (Millionen von Instanzen).
Jetzt können wir das Modell mit dem Trainingssatz trainieren und seine Genauigkeit auf dem Testsatz berechnen.

123456789101112131415161718
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[['StarWars4_rate', 'StarWars5_rate']] # Store feature columns as `X` y = df['StarWars6'] # Store target column as `y` # Split the data X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # Scale the data scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # Note that we use only transform for `X_test` # Initialize a model knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Print the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Aber dieser Ansatz hat einige Schwächen:

  • Wir nutzen nicht alle verfügbaren Daten für das Training, was unser Modell verbessern könnte;
  • Da wir die Genauigkeit des Modells auf einem kleinen Teil der Daten (Testsatz) bewerten, kann dieser Genauigkeitswert bei kleineren Datensätzen unzuverlässig sein (Sie können den obigen Code mehrmals ausführen und sehen, wie sich die Genauigkeit jedes Mal ändert, wenn ein neuer Testsatz ausgewählt wird).

Kreuzvalidierung

Die Kreuzvalidierung ist dafür konzipiert, diese Probleme zu bekämpfen. Die Idee ist, den gesamten Satz zu mischen, ihn in 5 gleiche Teile (Folds) zu teilen und 5 Iterationen durchzuführen, bei denen 4 Teile zum Trainieren und 1 als Testset verwendet werden.

So trainieren wir fünf Modelle mit leicht unterschiedlichen Datensätzen. Bei jedem berechnen wir die Genauigkeit des Testsets. Sobald wir das getan haben, können wir einen Durchschnitt dieser 5 Genauigkeitswerte nehmen, was unser Kreuzvalidierungs-Genauigkeitswert sein wird. Er ist zuverlässiger, da wir die Genauigkeit auf allen unseren Daten berechnet haben, nur mit fünf Iterationen dafür.
Jetzt wissen wir, wie gut das Modell funktioniert und können das Modell mit dem gesamten Datensatz neu trainieren.

Hinweis

Sie können eine andere Anzahl von Falten als fünf verwenden. Nehmen wir an, eine Zahl n. Dann verwenden Sie eine Falte für den Testsatz und n-1 für den Trainingssatz. Die folgende Funktion erleichtert die Konfiguration solcher Dinge.

Hier ist ein Anwendungsbeispiel:

1234567891011121314151617
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[['StarWars4_rate', 'StarWars5_rate']] # Store feature columns as `X` y = df['StarWars6'] # Store target column as `y` # Scale the data scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # Initialize a model knn = KNeighborsClassifier(n_neighbors=3) # Print the accuracy on the test set scores = cross_val_score(knn, X_scaled, y, cv=5) print('Scores: ', scores) print('Average score:', scores.mean())
copy

Der standardmäßig für die Klassifikation verwendete Score ist die Genauigkeit:

Also sind nur etwa 75% der Vorhersagen korrekt. Aber vielleicht ist die Genauigkeit mit einem anderen n_neighbors besser? Das wird sie! Das folgende Kapitel behandelt die Auswahl der n_neighbors (oder k) mit der höchsten Kreuzvalidierungsgenauigkeit.

Wählen Sie alle richtigen Aussagen aus.

Wählen Sie alle richtigen Aussagen aus.

Wählen Sie einige richtige Antworten aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 6
We're sorry to hear that something went wrong. What happened?
some-alt