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 | Abschnitt
Practice
Projects
Quizzes & Challenges
Quizze
Challenges
/
Grundlagen des Überwachten Lernens

bookTrain-Test-Split und Kreuzvalidierung

In den vorherigen Kapiteln wurden die Modelle erstellt und neue Werte vorhergesagt. Allerdings gibt es bisher keine Informationen darüber, wie gut das Modell tatsächlich arbeitet und ob diese Vorhersagen verlässlich sind.

Train-Test-Split

Um die Leistungsfähigkeit des Modells zu messen, wird ein Teil der gelabelten Daten benötigt, den das Modell noch nicht gesehen hat. Daher werden alle gelabelten Daten zufällig in Trainingsmenge und Testmenge aufgeteilt.

Dies lässt sich mit der Funktion train_test_split() aus sklearn umsetzen.

Argumente:

  • X — ein Array mit Merkmalswerten;
  • y — ein Array mit Zielwerten;
  • test_size — Anteil der Testmenge;

Rückgabewerte:

  • X_train, X_test, y_train, y_test — Arrays mit denselben Datentypen wie X, y.

In der Regel teilt man das Modell in etwa 70-90 % für den Trainingssatz und 10-30 % für den Testsatz auf.

Note
Hinweis

Wenn Ihr Datensatz Millionen von Instanzen enthält, reicht es in der Regel aus, nur einige Tausend für das Testen zu verwenden. In solchen Fällen kann sogar weniger als 10 % der Daten für das Testen reserviert werden.

Nun kann das Modell mit dem Trainingssatz trainiert und seine Genauigkeit am Testsatz 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_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Dieses Vorgehen weist jedoch einige Schwächen auf:

  • Es wird nicht der gesamte verfügbare Datensatz für das Training genutzt, was das Modell verbessern könnte;
  • Da die Genauigkeit des Modells nur auf einem kleinen Teil der Daten (Testmenge) bewertet wird, kann dieser Genauigkeitswert bei kleineren Datensätzen unzuverlässig sein. Der Code kann mehrfach ausgeführt werden, wobei sich die Genauigkeit jedes Mal ändert, wenn eine neue Testmenge gezogen wird.

Kreuzvalidierung

Kreuzvalidierung dient dazu, das Problem des Overfittings zu adressieren und sicherzustellen, dass das Modell gut auf neue, unbekannte Daten generalisieren kann. Dies kann als Klassenzimmertraining für das Modell betrachtet werden — es unterstützt das Modell dabei, auf ausgewogenere Weise zu lernen, bevor es dem eigentlichen Abschlusstest begegnet.

Das Prinzip besteht darin, den gesamten Datensatz zu mischen und in n gleich große Teile, sogenannte Folds, zu unterteilen. Das Modell durchläuft dann 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 es entsteht eine zuverlässigere Schätzung der Modellleistung.

Zu beachten ist, dass Kreuzvalidierung nicht den Testdatensatz ersetzt. Nachdem mithilfe der Kreuzvalidierung das Modell ausgewählt und optimiert wurde, sollte es auf einem separaten Testdatensatz bewertet werden, um eine objektive Einschätzung der realen Leistungsfähigkeit zu erhalten.

Note
Hinweis

Eine gängige Wahl für die Anzahl der Faltungen ist 5. In diesem Fall wird eine Faltung als Testmenge verwendet, und die verbleibenden 4 Faltungen werden für das Training genutzt.

Es werden fünf Modelle mit leicht unterschiedlichen Teilmengen trainiert. Für jedes Modell wird die Testgenauigkeit berechnet:

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

Nachdem dies durchgeführt wurde, kann der Durchschnitt dieser 5 Genauigkeitswerte berechnet werden, welcher als Cross-Validation-Genauigkeitswert dient:

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:

Argumente:

  • estimator — das Modellobjekt;
  • X — ein Array von Merkmalswerten;
  • y — ein Array von Zielwerten;
  • cv — die Anzahl der Folds (standardmäßig 5);
  • scoring — die Metrik (standardmäßig Genauigkeit);

Rückgabewerte:

  • scores — ein Array von Ergebnissen für jede Iteration.

Hier ist ein Beispiel, wie Cross-Validation mit einem k-NN-Modell durchgeführt wird, das auf dem Star Wars-Bewertungsdatensatz 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())
copy

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

question mark

Wählen Sie alle korrekten Aussagen aus.

Select all correct answers

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 19

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

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

bookTrain-Test-Split und Kreuzvalidierung

Swipe um das Menü anzuzeigen

In den vorherigen Kapiteln wurden die Modelle erstellt und neue Werte vorhergesagt. Allerdings gibt es bisher keine Informationen darüber, wie gut das Modell tatsächlich arbeitet und ob diese Vorhersagen verlässlich sind.

Train-Test-Split

Um die Leistungsfähigkeit des Modells zu messen, wird ein Teil der gelabelten Daten benötigt, den das Modell noch nicht gesehen hat. Daher werden alle gelabelten Daten zufällig in Trainingsmenge und Testmenge aufgeteilt.

Dies lässt sich mit der Funktion train_test_split() aus sklearn umsetzen.

Argumente:

  • X — ein Array mit Merkmalswerten;
  • y — ein Array mit Zielwerten;
  • test_size — Anteil der Testmenge;

Rückgabewerte:

  • X_train, X_test, y_train, y_test — Arrays mit denselben Datentypen wie X, y.

In der Regel teilt man das Modell in etwa 70-90 % für den Trainingssatz und 10-30 % für den Testsatz auf.

Note
Hinweis

Wenn Ihr Datensatz Millionen von Instanzen enthält, reicht es in der Regel aus, nur einige Tausend für das Testen zu verwenden. In solchen Fällen kann sogar weniger als 10 % der Daten für das Testen reserviert werden.

Nun kann das Modell mit dem Trainingssatz trainiert und seine Genauigkeit am Testsatz 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_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) knn = KNeighborsClassifier(n_neighbors=3).fit(X_train_scaled, y_train) # Printing the accuracy on the test set print(knn.score(X_test_scaled, y_test))
copy

Dieses Vorgehen weist jedoch einige Schwächen auf:

  • Es wird nicht der gesamte verfügbare Datensatz für das Training genutzt, was das Modell verbessern könnte;
  • Da die Genauigkeit des Modells nur auf einem kleinen Teil der Daten (Testmenge) bewertet wird, kann dieser Genauigkeitswert bei kleineren Datensätzen unzuverlässig sein. Der Code kann mehrfach ausgeführt werden, wobei sich die Genauigkeit jedes Mal ändert, wenn eine neue Testmenge gezogen wird.

Kreuzvalidierung

Kreuzvalidierung dient dazu, das Problem des Overfittings zu adressieren und sicherzustellen, dass das Modell gut auf neue, unbekannte Daten generalisieren kann. Dies kann als Klassenzimmertraining für das Modell betrachtet werden — es unterstützt das Modell dabei, auf ausgewogenere Weise zu lernen, bevor es dem eigentlichen Abschlusstest begegnet.

Das Prinzip besteht darin, den gesamten Datensatz zu mischen und in n gleich große Teile, sogenannte Folds, zu unterteilen. Das Modell durchläuft dann 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 es entsteht eine zuverlässigere Schätzung der Modellleistung.

Zu beachten ist, dass Kreuzvalidierung nicht den Testdatensatz ersetzt. Nachdem mithilfe der Kreuzvalidierung das Modell ausgewählt und optimiert wurde, sollte es auf einem separaten Testdatensatz bewertet werden, um eine objektive Einschätzung der realen Leistungsfähigkeit zu erhalten.

Note
Hinweis

Eine gängige Wahl für die Anzahl der Faltungen ist 5. In diesem Fall wird eine Faltung als Testmenge verwendet, und die verbleibenden 4 Faltungen werden für das Training genutzt.

Es werden fünf Modelle mit leicht unterschiedlichen Teilmengen trainiert. Für jedes Modell wird die Testgenauigkeit berechnet:

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

Nachdem dies durchgeführt wurde, kann der Durchschnitt dieser 5 Genauigkeitswerte berechnet werden, welcher als Cross-Validation-Genauigkeitswert dient:

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:

Argumente:

  • estimator — das Modellobjekt;
  • X — ein Array von Merkmalswerten;
  • y — ein Array von Zielwerten;
  • cv — die Anzahl der Folds (standardmäßig 5);
  • scoring — die Metrik (standardmäßig Genauigkeit);

Rückgabewerte:

  • scores — ein Array von Ergebnissen für jede Iteration.

Hier ist ein Beispiel, wie Cross-Validation mit einem k-NN-Modell durchgeführt wird, das auf dem Star Wars-Bewertungsdatensatz 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())
copy

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

question mark

Wählen Sie alle korrekten Aussagen aus.

Select all correct answers

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 19
some-alt