Suche…


Kreuzvalidierung

Das Erlernen der Parameter einer Vorhersagefunktion und das Testen derselben mit denselben Daten ist ein methodologischer Fehler: Ein Modell, das nur die Bezeichnungen der gerade wiedergegebenen Stichproben wiederholt, hätte eine perfekte Punktzahl, würde jedoch nichts Nützliches für noch nicht vorhersagen unsichtbare Daten. Diese Situation wird als Überanpassung bezeichnet . Um dies zu vermeiden, ist es üblich , wenn ein ( überwachtes) maschinelles Lernen Experiment durchführt Teil der zur Verfügung stehenden Daten zu halten, wie ein Test - Set X_test, y_test . Beachten Sie, dass das Wort „Experiment“ nicht nur für die akademische Verwendung gedacht ist, da selbst in kommerziellen Umgebungen maschinelles Lernen normalerweise experimentell beginnt.

Beim Scikit-Learn kann eine zufällige Aufteilung in Trainings- und Test-Sets mit der Hilfsfunktion train_test_split schnell berechnet werden. Laden wir die Iris-Datei, um eine lineare Unterstützungsvektor-Maschine darauf zu laden:

>>> import numpy as np
>>> from sklearn import cross_validation
>>> from sklearn import datasets
>>> from sklearn import svm

>>> iris = datasets.load_iris()
>>> iris.data.shape, iris.target.shape
((150, 4), (150,))

Wir können jetzt schnell einen Trainingssatz testen und dabei 40% der Daten zur Prüfung (Bewertung) unseres Klassifikators heraushalten:

>>> X_train, X_test, y_train, y_test = cross_validation.train_test_split(
...     iris.data, iris.target, test_size=0.4, random_state=0)

>>> X_train.shape, y_train.shape
((90, 4), (90,))
>>> X_test.shape, y_test.shape
((60, 4), (60,))

Nun, nachdem wir Trainings- und Test-Sets haben, können wir es verwenden:

>>> clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)   

K-Fold Cross Validation

Die K-fache Kreuzvalidierung ist ein systematischer Prozess, um das Train / Test-Split-Verfahren mehrmals zu wiederholen, um die Varianz zu reduzieren, die mit einer einzelnen Testphase von Train / Test-Split verbunden ist. Sie teilen im Wesentlichen das gesamte Dataset in "gleich große" Falten auf, und jede Faltung wird einmal zum Testen des Modells und K-1-mal zum Trainieren des Modells verwendet.

Die Scikit-Bibliothek bietet mehrere Falttechniken an. Ihre Verwendung hängt von den Eigenschaften der Eingabedaten ab. Einige Beispiele sind

K-Fold

Sie teilen im Wesentlichen das gesamte Dataset in "gleich große" Falten auf, und jede Faltung wird einmal für das Testen des Modells und für K-1-Zeiten zum Trainieren des Modells verwendet.

from sklearn.model_selection import KFold
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 1, 2])
cv = KFold(n_splits=3, random_state=0)

for train_index, test_index in cv.split(X):
...    print("TRAIN:", train_index, "TEST:", test_index)

TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1 3] TEST: [2]
TRAIN: [0 1 2] TEST: [3]

StratifiedKFold ist eine Variation der k-Fache, die geschichtete Falten zurückgibt: Jeder Satz enthält ungefähr den gleichen Prozentsatz von Abtastwerten jeder Zielklasse wie der vollständige Satz

ShuffleSplit

Wird verwendet, um eine benutzerdefinierte Anzahl unabhängiger Zug- / Testdatensatzaufteilungen zu generieren. Die Proben werden zuerst gemischt und dann in ein Paar Zug- und Testsätze aufgeteilt.

from sklearn.model_selection import ShuffleSplit
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 1, 2])
cv = ShuffleSplit(n_splits=3, test_size=.25, random_state=0)

for train_index, test_index in cv.split(X):
...    print("TRAIN:", train_index, "TEST:", test_index)

TRAIN: [3 1 0] TEST: [2]
TRAIN: [2 1 3] TEST: [0]
TRAIN: [0 2 1] TEST: [3]

StratifiedShuffleSplit ist eine Variation von ShuffleSplit, die geschichtete Aufteilungen zurückgibt, dh Splits erzeugt, indem für jede Zielklasse derselbe Prozentsatz wie im gesamten Satz beibehalten wird.

Andere Falttechniken wie Leave One / P Out und TimeSeriesSplit (eine Variation der K-Faltung) sind in der Bibliothek scikit model_selection verfügbar.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow