Sklearns KFold, Mischen, Schichten und ihre Auswirkungen auf Daten in Test- und Trainingssets.
Beispiele und Anwendungsfälle für die Kreuzvalidierung von sklearn, Erläuterung von KFold, Shuffling, Layering und dem Verhältnis von Trainings- und Testdaten.
Kreuzvalidierung ist ein Schlüsselkonzept für maschinelles Lernen, das Datenwissenschaftlern auf zweierlei Weise hilft: es kannDatengröße reduzierenund stellen Sie das sicherModellkünstliche Intelligenzes ist schwer genug. Die Kreuzvalidierung geht zu Lasten des Ressourcenverbrauchs. Daher ist es wichtig zu verstehen, wie dies funktioniert, bevor Sie sich entscheiden, es zu verwenden.
In diesem Artikel werden wir kurz auf die Vorteile der Kreuzvalidierung eingehen. Dann zeige ich Ihnen eine detaillierte Implementierung mit einer Vielzahl von Methoden in der beliebten Sklearn-Python-Bibliothek. Wir werden lernen:
- Was ist es?KDobsGenericName,barajadoKfoldjKfach geschichtetund sehen, wie sie sich unterscheiden
- wie zu überprüfenEllaIhre Vorlage ohne KFold mit den MethodenKreuzvalidierungjcross_val_score
- Was sind die anderen Split-Optionen?RepetidoKDouble,dejarunofuerajAbgangSchmollmundund ein Anwendungsfall für GroupKFold
- Wie wichtig ist es, die Verteilung von Zielen und Merkmalen zu berücksichtigen?
Die Daten werden normalerweise in 3 Sätze unterteilt.
- Ausbildung:wirdwird verwendet, um das Modell zu trainieren und Modellhyperparameter zu optimieren
- Zu testen:wirdWird verwendet, um zu überprüfen, ob das optimierte Modell mit unbekannten Daten funktioniert, um zu testen, ob das Modell gut generalisiert
- Validierung: Bei der Optimierung werden bei der Parameterauswahl einige Informationen über Lecks aus dem Test-Set an das Modell übertragen, sodass Sie eine abschließende Überprüfung völlig unbekannter Daten durchführen können
Die gebräuchlichsten Kreuzvalidierungsansätze verwenden einen Teil des Trainingssatzes zum Testen. Dies geschieht mehrmals, sodass jeder Datenpunkt einmal im Testsatz erscheint.
Obwohl die train_test_split-Methode von sklearn eine stratifizierte Aufteilung verwendet, was bedeutet, dass das Test- und das Trainingsset dieselbe Verteilung von Zielvariablen haben, könnten Sie versehentlich mit einem Teilset trainieren, das nicht die reale Welt widerspiegelt.
Stellen Sie sich vor, Sie versuchen vorherzusagen, ob eine Person aufgrund ihrer Größe und ihres Gewichts männlich oder weiblich ist. Man würde annehmen, dass die größten und schwersten Menschen eher Männer sind; Wenn Sie jedoch sehr viel Pech haben, enthalten Ihre Zugdaten nur Zwergmännchen und große Amazonasweibchen. Dank der Kreuzvalidierung führen Sie mehrere Splits von train_test aus, und während eine Kurve außergewöhnlich gut abschneidet, kann die andere unterdurchschnittlich sein. Wenn eine der Aufteilungen ungewöhnliche Ergebnisse zeigt, bedeutet dies, dass Ihre Daten eine Anomalie aufweisen.
Wenn Ihr Cross-Validation-Split nicht dasselbe Ergebnis erzielt, haben Sie etwas Wichtiges in den Daten übersehen.
Sie können jederzeit Ihre eigene Datenteilungsfunktion schreiben, aber scikit-learn enthält 10 Datenteilungsmethoden, mit denen Sie nahezu jedes Problem lösen können.
Beginnen wir jedoch mit der Codierung. Laden Sie das vollständige Beispiel auf Github herunter.
Lassen Sie uns als ersten Schritt eine Reihe einfacher Zahlen von 1,2,3 bis 24,25 erstellen.
# erstelle den Bereich von 1 bis 25rn = range(1,26)
from sklearn.model_selection import KFoldkf5 = KFold(n_splits=5, shuffle=False)kf3 = KFold(n_splits=3, shuffle=False)
# Die Kfold-Funktion gibt die Indizes der Daten zurück. Unser Bereich ist 1-25, also ist der Index 0-24 für train_index, test_index in kf3.split(rn): print(train_index, test_index)KFold-Return-Indizes
Da KFold den Index zurückgibt, benötigen wir diesen, wenn Sie die tatsächlichen Daten sehen möchtennp.tomar
im NumPy-Array oder.iloc
Einsatz bei Pandas
# Um unsere Datenwerte zu erhalten, verwenden wir np.take(), um auf einen Wert an einem bestimmten Index für train_index, test_index in kf3.split(rn) zuzugreifen: print(np.take(rn,train_index), np.take (rn ,test_index))Sie müssen den tatsächlichen Datenpunkt mit np.take(index) finden.
Um besser zu verstehen, wie die KFold-Methode die Daten aufteilt, zeigen wir sie in einem Diagramm. seit wirembaralhado = falsch
Wenn Sie den ersten Datenpunkt verwendet haben, gehört er in den Testsatz sowohl auf die erste Biegung als auch auf die nächste. Test- und Trainingsdatenpunkte sind klar definiert.
Es ist wichtig zu sagen, dass die Anzahl der Faltungen die Größe Ihres Testsets beeinflusst. Testen Sie 3 Mal bei 33 % der Daten, testen Sie 5 Mal bei 1/5, was 20 % der Daten entspricht.
Jeder Datenpunkt erscheint einmal in der Testmenge undk mal im Zugspiel
KFold misto
Ihre Daten können einer bestimmten Reihenfolge folgen, und es kann riskant sein, Daten in der angezeigten Reihenfolge auszuwählen. Dies kann behoben werden, indem der KFold-Shuffle-Parameter auf eingestellt wirdWAHR
. In diesem Fall wählt KFold zufällig die Datenpunkte aus, die Teil des Zuges und des Testsets sein werden. Oder, um genau zu sein, nicht ganz zufällig,random_state
beeinflusst, welche Punkte in jedem Satz erscheinen und gleichrandom_state
führt immer zur gleichen Teilung.
KConvolve mit aktuellem Datensatz
Wenn Sie an dem eigentlichen Problem arbeiten, haben Sie selten ein kleines Array als Eingabe. Sehen wir uns also das reale Beispiel mit einem bekannten Iris-Datensatz an.
Der Iris-Datensatz enthält 150 Messwerte der Blütenblatt- und Kelchblattgrößen von 3 Irisblütensorten: 50 Iris setosa s, 50 Iris virginica s und 50 Iris versicolor s
Wenn bei der KFold-Kreuzvalidierung ein Problem auftritt
Auf dem Github-Notebook führe ich einen einzelnen Test aus, der eine Genauigkeit von 95 % auf dem Trainingsset und eine Genauigkeit von 100 % auf dem Testset erreicht. Was war meine Überraschung, als das Tripel in eins geteilt wurdeGenauigkeitExakt0% geführt. Sie haben richtig gelesen, mein Modell hat keine einzige Blume richtig gepflückt.
i = 1 für train_index, test_index in kf3.split(iris_df): X_train = iris_df.iloc[train_index].loc[:, features] X_test = iris_df.iloc[test_index][features] y_train = iris_df.iloc[train_index]. loc [:,'target'] y_test = iris_df.loc[test_index]['target'] #Treine o modelo model.fit(X_train, y_train) #Treine o modelo print(f"Präzision für Faltzahl {i} im Test Konjunktion: {accuracy_score(y_test, model.predict(X_test))}") i += 1Die Genauigkeit des maschinellen Lernmodells betrug bei jeder Faltung 0 %. Warum?
Ist gemischtes KFold ideal?
Um dieses Problem zu lösen, können wir die verwendengemischt = wahr
Ändern Sie die Parameter und randomisieren Sie die Proben. Das wirft aber auch Probleme auf.
Die Gruppen sind noch nicht ausgeglichen. Sie werden oft mit einer viel größeren Anzahl von Proben eines Typs trainieren, während Sie verschiedene Typen testen. Mal sehen, ob wir etwas dagegen tun können.
Geschichtete K-Faltung
In vielen Szenarien ist es wichtig, die gleiche Probenverteilung im Zug und im Testset beizubehalten. Dies wird durch StratifiedKFold erreicht, das gemischt oder ungemischt sein kann.
Sie können sehen, dass KFold die Daten in Gruppen unterteilt, die die Proportionen beibehalten. StratifiedKFold spiegelt die Verteilung der Zielvariablen wider, auch wenn einige der Werte häufiger im Datensatz vorkommen. Die Verteilung der Inputmaße wird jedoch nicht ausgewertet. Wir werden am Ende mehr darüber sprechen.
Muss ich meine Daten jedes Mal aufteilen?
Sie müssen Daten nicht manuell aufteilen, um die Kreuzvalidierung nutzen zu können. Sklearn bietet zwei Methoden für schnelles Scoring mittels Kreuzvalidierung.Kreuzpunktzahl
Gibt eine Liste von Modellwerten und Rückgaben zurückKreuzvalidierung
Auch Trainingszeiten.
# Mit cross_validate können Sie auch die Metriken angeben, die Sie für i, score in enumerate(cross_validate(model, X,y, cv=3)["test_score"]): print(f"Precision for fold number {i} kein Testsatz: {score}")Ergebnisse der Cross_validate-Funktion
Zusätzlich zu den oben genannten Funktionen verfügt sklearn über andere Methoden, die Sie verwenden können, um bestimmte Anforderungen zu erfüllen.
kfach wiederholtwürde verschiedene Kombinationen von Praxis-Test-Split ergeben.
Während die regelmäßige Kreuzvalidierung sicherstellt, dass Sie jeden Datenpunkt einmal überprüfensiehe Testset,Du kannst mit mir kommenRandomDivideGeben Sie an, wie viele Merkmale an jeder Biegung zum Testen ausgewählt werden.
LeaveOneOut und LeavePOut lösen die Notwendigkeit in anderen Spezialfällen. Die erste belässt jeweils nur eine Probe im Testsatz.
Im Allgemeinen legen die meisten Autoren und empirischen Daten nahe, dass eine 5- oder 10-fache Kreuzvalidierung gegenüber LOO bevorzugt werden sollte. - sklearn-Dokumentation
Kfold-Gruppe
GroupKFold hat seinen Platz in Szenarien, in denen mehrere Datenproben aus demselben Thema entnommen wurden. Zum Beispiel mehr als eine Messung derselben Person. Es ist wahrscheinlich, dass sich Daten aus derselben Gruppe ähnlich verhalten. Wenn Sie eine der Maßnahmen trainieren und die andere testen, erhalten Sie eine gute Punktzahl, aber das beweist nicht, dass Ihr Modell gut verallgemeinern kann. GroupKFold sorgt dafür, dass die gesamte Gruppe zum Zug oder Testset geht. Weitere Informationen finden Sie in der sklearn-Dokumentation zu Gruppen.
Zeitreihendaten
Probleme mit Zeitreihen hängen auch von der Reihenfolge der Datenpunkte ab. Es ist normalerweise viel einfacher, die Vergangenheit auf der Grundlage des aktuellen Wissens zu erraten, als die Zukunft vorherzusagen. Aus diesem Grund ist es sinnvoll, Zeitreihenmodelle immer mit älteren Daten zu versehen und neuere zu prognostizieren. Sklearns TimeSeriesSplit macht genau das.
Eine letzte Sache muss unbedingt betont werden. Sie denken vielleicht, dass Ebenen alle Ihre Probleme beim maschinellen Lernen lösen würden, aber das stimmt nicht. StratifiedKFold stellt sicher, dass die Zielrate sowohl im Zug als auch im Testset gleich bleibt. In unserem Fall 33 % von jeder Art von Iris.
Um dies anhand eines unausgeglichenen Datensatzes zu demonstrieren, schauen wir uns den beliebten Wettbewerb Kaggle Titanic an. Ihr Ziel wäre es, ein KI-Modell zu trainieren, um vorherzusagen, ob ein Titanic-Passagier überlebt hat oder starb, als das Schiff sank. Sehen wir uns an, wie StratifiedKFold die Überlebenden und Opfer im Datensatz bei jedem Fold aufteilt.
Klingt gut, oder? Ihre Daten werden jedoch möglicherweise immer noch nicht korrekt aufgeteilt. Wenn Sie sich die Verteilung der wichtigsten Funktionen ansehen (ich habe diese Verteilung absichtlich gewählt, um meinen Standpunkt zu beweisen, da das Mischen der Daten normalerweise ausreicht, um eine ausgewogenere Verteilung zu erhalten), werden Sie feststellen, dass Sie häufig versuchen, die Ergebnisse vorherzusagen Verwenden des Satzes von Trainingsdaten, die sich von dem Testsatz unterscheiden. Betrachtet man zum Beispiel die Geschlechterverteilung in den Trainings- und Testsets.
Die Kreuzvalidierung hilft Ihnen zumindest dabei, dieses Problem zu erkennen, wenn sich die Modellpunktzahl für jede Falte erheblich unterscheidet. Stellen Sie sich vor, Sie haben das Pech, einen einzelnen Split zu verwenden, der perfekt zu Ihren Testdaten passt, aber in realen Szenarien katastrophal versagt.
Es ist eine sehr komplexe Aufgabe, Ihre Daten auszugleichen, damit Sie die optimale Verteilung trainieren und testen können. Viele argumentieren, dass dies nicht notwendig ist, da das Modell gut genug verallgemeinern muss, um mit den unbekannten Daten zu arbeiten.
Ich ermutige Sie dennoch, über die Verteilung von Ressourcen nachzudenken. Stellen Sie sich vor, Sie haben ein Geschäft, in dem die Kunden hauptsächlich Männer sind, und Sie versuchen, Verkäufe anhand von Daten aus einer an Frauen gerichteten Marketingkampagne zu prognostizieren. Es wäre nicht die beste Vorlage für Ihr Geschäft.
Abschluss
Train-Test-Split ist ein Kernkonzept in vielen maschinellen Lernaufgaben. Wenn Sie jedoch über genügend Ressourcen verfügen, sollten Sie eine Kreuzvalidierung auf Ihr Problem anwenden. Dies hilft Ihnen nicht nur, weniger Daten zu verwenden, sondern eine inkonsistente Auswertung über verschiedene Folds hinweg deutet darauf hin, dass Sie eine wichtige Beziehung in Ihren Daten übersehen haben.
Die Sklearn-Bibliothek enthält mehrere Methoden zum Aufteilen der Daten gemäß Ihrer KI-Übung. Sie können grundlegende KFold-Dateien erstellen, die Daten oder Daten aus Layern basierend auf der Zielvariablen mischen. Sie können zusätzliche Methoden verwenden oder einfach Ihre Vorlage verwendenKreuzvalidierung
ÖKreuzpunktzahl
Testen Sie ohne manuelles Datensplitting. In beiden Fällen sollte Ihre resultierende Punktzahl ein stetiges Muster aufweisen, da Sie nicht möchten, dass sich Ihr Modell darauf verlässt, dass Glücksdaten aufgeteilt werden, um eine gute Leistung zu erzielen.
Alle Daten, Grafiken und die Python-Verarbeitung wurden in dem auf github verfügbaren Notebook zusammengefasst.
# Hat dir das Tutorial gefallen? Siehe auch* So konvertieren Sie eine Liste mit Adressen oder Regionen in eine Karte* Verschiedene Anwendungen zur Erkennung von Anomalien