Kursinhalt
Klassifikation mit Python
Klassifikation mit Python
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.
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))
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:
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())
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.
Danke für Ihr Feedback!