Das Erlernen der Parameter einer Vorhersagefunktion und deren Test mit denselben Daten ist ein methodischer Fehler: Ein Modell, das einfach die Bezeichnungen der gerade untersuchten Proben wiederholt, würde perfekt abschneiden, aber es sagt immer noch nichts Nützliches voraus. unsichtbare Daten. diese Situation istÜberanpassunggenannt . Um dies zu vermeiden, ist es üblich, bei der Durchführung eines (überwachten) maschinellen Lernexperiments einige der verfügbaren Daten alsMenge der Prüfung test_x, test_y
. Beachten Sie, dass das Wort „Experiment“ nicht nur für den akademischen Gebrauch bestimmt ist, da maschinelles Lernen selbst in kommerziellen Umgebungen oft experimentell beginnt. Dies ist ein Flussdiagramm eines typischen Cross-Validation-Workflows beim Modelltraining. Die besten Parameter können bestimmt werden durchGrid-Suchtechniken.
split_test_trainEine zufällige Aufteilung in Trainings- und Testsets lässt sich schnell berechnen. Lassen Sie uns den Iris-Datensatz laden, um ihn an eine lineare Support-Vektor-Maschine anzupassen:
>>> GegenstandSchwellungalsöffentlicher Notar>>> vonsklearn.model_selectionGegenstandsplit_test_train>>> vongelerntGegenstandDatensätze>>> vongelerntGegenstandsvm>>> X, y = Würfelsätze.load_iris(return_X_y=WAHR)>>> X-Form, Y-Form((150, 4), (150,))
Jetzt können wir schnell ein Beispiel für das Training erstellen, wobei 40 % der Daten zum Testen (Evaluieren) unseres Klassifikators beibehalten werden:
>>> X_train, X_test, y_train, y_test = train_test_divide(... X, y, test_size=0,4, random_state=0)>>> Zug_X.Form, Zug_y.Form((90, 4), (90,))>>> X_test.form, y_test.form((60, 4), (60,))>>> clf = svm.SVC(nucleo='linear', C=1).fit(Zug_X, Zug_y)>>> clf.score(X_test, y_test)0,96...
Bei der Auswertung unterschiedlicher Einstellungen (“Hyperparameter”) für Schätzer wie z. B. dieC
Konfiguration, die für eine SVM manuell konfiguriert werden muss, besteht immer noch die Gefahr einer Überanpassung des Testsets,da die Parameter angepasst werden können, bis der Schätzer optimal arbeitet. Auf diese Weise kann Wissen über die Testsuite in das Modell “einsickern” und die Bewertungsmetriken spiegeln nicht mehr die Leistung der Verallgemeinerung wider. Um dieses Problem zu lösen, kann ein weiterer Teil des Datensatzes als sogenanntes “Validation Set” vorgehalten werden: Auf dem Trainingsset wird trainiert, dann auf dem Validierungsset ausgewertet und bei erfolgreichem Versuch ein Finale Auswertung am Testset möglich.
Durch die Aufteilung der verfügbaren Daten in drei Sätze wird jedoch die Anzahl der Proben, die zum Lernen des Modells verwendet werden können, drastisch reduziert, und die Ergebnisse können von einer zufälligen Auswahl des Satzpaars abhängen (Training, Validierung).
Eine Lösung für dieses Problem ist eine Technik namensKreuzvalidierung(kurzer Lebenslauf). Ein Test-Set muss weiterhin zur abschließenden Auswertung aufbewahrt werden, das Validierungs-Set wird jedoch bei der Erstellung des Lebenslaufs nicht mehr benötigt. Im Grundansatz, derk-CV-Ordner, der Ausbildungssatz ist drinkkleinere Sätze (andere Ansätze werden unten beschrieben, folgen aber im Allgemeinen denselben Prinzipien). für jeden vonkDas “Falten” wird wie folgt durchgeführt:
- Ein Modell wird mit \(k-1\) Faltungen als Trainingsdaten trainiert;
- Das resultierende Modell wird anhand der restlichen Daten validiert (d. h. es wird als Testsatz verwendet, um ein Leistungsmaß wie Genauigkeit zu berechnen).
das durch diek-Das von der mehrfachen Kreuzvalidierung gemeldete Leistungsmaß ist dann der Durchschnitt der berechneten Werte in der Schleife. Dieser Ansatz kann rechenintensiv sein, verschwendet aber nicht viele Daten (wie es der Fall ist, wenn ein willkürlicher Validierungssatz angegeben wird), was ein großer Vorteil für Probleme wie die inverse Inferenz ist, bei denen die Anzahl der Stichproben sehr gering ist .
3.1.1. Berechnung von Kreuzmetriken
Der einfachste Weg, die Kreuzvalidierung zu verwenden, ist die Verwendung der Methodecross_val_scorefür den Schätzer und den Datensatz.
Das folgende Beispiel zeigt, wie die Genauigkeit einer linearen Kernel-Support-Vektor-Maschine für den Iris-Datensatz geschätzt werden kann, indem die Daten aufgeteilt, ein Modell angepasst und die Punktzahl fünfmal hintereinander berechnet wird (jeweils mit unterschiedlichen Aufteilungen):
>>> vonsklearn.model_selectionGegenstandcross_val_score>>> clf = svm.SVC(nucleo='linear', C=1, random_state=42)>>> scores = cross_val_score(clf, X, y, cv=5)>>> Partiturenmatrix([0.96..., 1. , 0.96..., 0.96..., 1. ])
Daher sind der Mittelwert und die Standardabweichung gegeben durch:
>>>drucken("%0.2f Präzision mit einer Standardabweichung von %0.2f"% (scores.average(), scores.std()))0.98Genauigkeit auf eine Standardabweichung von0.02
Der Standardwert ist der, der bei jeder CV-Iteration berechnet wirdInterpunktion
die Schätzungsmethode. Dies kann mit dem Interpunktionsparameter geändert werden:
>>> vongelerntGegenstandmetrisch>>> Ergebnisse = cross_val_score (... clf, X, y, Lebenslauf =5, Punktzahl ='f1_makro')>>> Partiturenmatrix([0.96..., 1. ..., 0.96..., 0.96..., 1. ])
Weitere Informationen finden Sie unterDer Bewertungsparameter: definiert die Modellbewertungsregeln. Beim Iris-Datensatz sind die Proben zwischen den Zielklassen ausgeglichen, sodass die Präzision und der F1-Wert nahezu gleich sind.
wenn das argumentLebenslauf
eine ganze Zahl verwendet wirdcross_val_scoreStandardstrategienKDobsGenericNameÖLayeredKFold, wobei letzteres verwendet wird, wenn der Schätzer istClassifierMixin se-Derivat.
Sie können auch andere Cross-Validation-Strategien verwenden, z. B. das Übergeben eines Cross-Validation-Iterators:
>>> vonsklearn.model_selectionGegenstandRandomDivide>>> n_samples = X.form[0]>>> cv = ShuffleSplit(n_splits=5, test_size=0,3, random_state=0)>>> score_cross_value(clf, X, y, cv=cv)Array([0.977..., 0.977..., 1. ..., 0.955..., 1. ])
Eine andere Möglichkeit besteht darin, ein Iterable zu verwenden, das beispielsweise (Train-, Test-) Slices als Index-Arrays zurückgibt:
>>> definitiv custom_cv_2folds(X):... n = forma X[0]... du =1... währenddu >> custom_cv = custom_cv_2folds(X)>>> cross_value_score(clf, X, y, cv=custom_cv)Matrix([1. , 0,973...])
Datentransformation mit gelöschten Daten
Genauso wie es wichtig ist, einen Prädiktor an gespeicherten Trainingsdaten zu testen, müssen Vorverarbeitung (wie Standardisierung, Merkmalsauswahl usw.) und dergleichen berücksichtigt werden.Datentransformationen inähnlich aus einem Trainingssatz gelernt und auf die gespeicherten Daten zur Vorhersage angewendet:
>>> vongelerntGegenstandVorverarbeitung>>> X_train, X_test, y_train, y_test = train_test_divide(... X, y, test_size=0,4, random_state=0)>>> scaler = Vorverarbeitung.StandardScaler().fit(X_train)>>> Train_X_transformed = scaler.transform(train_X)>>> clf = svm.SVC(C=1).fit(X_train_transformiert, y_train)>>> X_test_transformed = scaler.transform(X_test)>>> clf.score(X_test_transformiert, y_test)0,9333...
EinsPipelineerleichtert die Zusammenstellung von Schätzern und bietet dieses Verhalten bei der Kreuzvalidierung:
>>> vonsklearn.pipelineGegenstandmake_pipe>>> clf = make_pipeline(preprocesamiento.StandardScaler(), svm.SVC(C=1))>>> score_cross_value(clf, X, y, cv=cv)Array([0,977..., 0,933..., 0,955..., 0,933..., 0,977...])
SehenPipelines und zusammengesetzte Schätzer.
3.1.1.1. Die Funktion cross_validate und die Auswertung mehrerer Metriken
Sterbencross_validate -Funktion unterscheidet sich voncross_val_scoreIn zwei Wegen:
- Ermöglicht die Angabe mehrerer Metriken für die Bewertung.
- Gibt ein Diktat zurück, das das Testergebnis, Anpassungszeiten, Ergebniszeiten (und optional Trainingsergebnisse und angepasste Schätzer) enthält.
Um einzelne Metriken auszuwerten, bei denen der Auswertungsparameter eine Zeichenfolge ist, aufrufbar oder keine, lauten die Schlüssel:['test_score', 'fit_time', 'time_score']
Und für die Auswertung['test_', 'test_', 'test_', 'fit_time', 'score_time']
Der Rückgabewert ist ein Diktat mit den folgenden Schlüsseln: [‘test_’, ‘test_’, ‘test_’, ‘fit_time’, ‘score_time’]
return_train_score
ist standardmäßig aktiviertFALSCH
konfiguriert, um Rechenzeit zu sparen. Um auch die Ergebnisse des Trainingssatzes auszuwerten, klicken Sie aufWAHR
etabliert sein
Sie können den Schätzer auch mit an jeden Trainingssatz angepasst haltenreturn_estimator=Wahr
hinstellen .
Machine Learning Classification in Python – Part 1 | rocket loop
Die verschiedenen Metriken können als Liste, Tupel oder als Satz vordefinierter Markierungsnamen angegeben werden:
>>> vonsklearn.model_selectionGegenstandKreuzvalidierung>>> vonsklearn.metricsGegenstandRemember_score>>> Punktzahl = ['macro_precision','Rückruf_Makro']>>> clf = svm.SVC(nucleo='linear', C=1, random_state=0)>>> scores = cross_validate(clf, X, y, score=score)>>> sauber(Ergebnisse.Schlüssel())['fit_time', 'score_time', 'test_precision_macro', 'test_recall_macro']>>> punkte['test_recall_macro']matrix([0.96..., 1. ..., 0.96..., 0.96..., 1. ])
Oder als Diktat, das den Annotatornamen einer vordefinierten oder benutzerdefinierten Interpunktionsfunktion zuordnet:
>>> vonsklearn.metricsGegenstandmake_marker>>> Punktzahl = {'prec_macro':'macro_precision',... 'rec_macro': make_scorer(recall_score, promedio='Makro')}>>> scores = cross_validate(clf, X, y, score=score,... Lebenslauf=5, return_train_score=WAHR)>>> sauber(Ergebnisse.Schlüssel())['fit_time', 'score_time', 'test_prec_macro', 'test_rec_macro', 'train_prec_macro', 'train_rec_macro']>>> punkte['tren_rec_macro']Array([0,97..., 0,97..., 0,99..., 0,98..., 0,98...])
Hier ist ein Beispiel fürKreuzvalidierung
mit einer einzigen Metrik:
>>>Ergebnisse = cross_validate(clf, X, y,...Punktzahl ='macro_precision', Lebenslauf=5,...return_estimator=WAHR)>>>sauber(Ergebnisse.Tasten())['Schätzer','fit_time','time_score','Testergebnis']
3.1.1.2. Erhalten von Prognosen durch Kreuzvalidierung
Die Funktioncross_val_predicthat eine ähnliche Schnittstelle wiecross_val_score, aber für jedes Element in der Eingabe wird die Vorhersage zurückgegeben, die für dieses Element erhalten wurde, als es sich in der Testmenge befand. Sie können nur Kreuzvalidierungsstrategien verwenden, die alle Elemente genau einmal einer Testmenge zuweisen (andernfalls wird eine Ausnahme ausgelöst).
Notiz
Hinweise zum Missbrauch von cross_val_predict
das Ergebnis voncross_val_predictkönnen sich von denen unterscheiden, die mit erhalten wurdencross_val_scorewie Elemente auf unterschiedliche Weise gruppiert werden. Die Funktioncross_val_scorenimmt einen Durchschnitt über die Kreuzvalidierungsfaltungen, währendcross_val_predictes gibt einfach die Bezeichnungen (oder Wahrscheinlichkeiten) mehrerer nicht unterscheidbarer Modelle zurück. so ist escross_val_predictist kein adäquates Maß für Generalisierungsfehler.
Die Funktion cross_val_predict ist geeignet für:
- Visualisierung von Vorhersagen, die mit verschiedenen Modellen gemacht wurden.
- Modellüberlagerung: Wenn Vorhersagen von einem überwachten Schätzer verwendet werden, um einen anderen Schätzer in Ensemble-Methoden zu schulen.
Die für die Kreuzvalidierung verfügbaren Iteratoren werden im nächsten Abschnitt vorgestellt.
Beispiele
- Receiver Operating Characteristic (ROC) mit Kreuzvalidierung,
- Rekursive Funktionslöschung mit Kreuzvalidierung,
- Parameterschätzung mit kreuzvalidierter Gittersuche,
- Beispielpipeline zum Extrahieren und Auswerten von Textmerkmalen,
- Erstellen von Vorhersagen mit Kreuzvalidierung,
- Verschachtelte und nicht verschachtelte Kreuzvalidierung.
© 2007–2020 Die Entwickler von scikit-learnLizenziert unter der BSD 3-Klausel-Lizenz.
https://scikit-learn.org/0.24/modules/cross_validation.html
scikit-lernen 1.1
- 2.6.4.1. Minimale Kovarianz-Determinante
- 1.8. Kreuzzerlegung
- 3.1.2. Kreuzvalidierungs-Iteratoren
- 3.1.2.4. Vordefinierte Faltteilungen/Validierungssätze
- 1
- …
- 299
- 300
- 301
- 302
- 303
- …
- 903
- Nächste