Sök…


Korsvalidering

Att lära sig parametrarna för en prediktionsfunktion och testa den på samma data är ett metodologiskt misstag: en modell som bara skulle upprepa etiketterna på proverna som den just har sett skulle ha en perfekt poäng men skulle inte förutsäga något användbart på ännu- osynliga data. Denna situation kallas övermontering . För att undvika det är det vanligt när man utför ett (övervakat) maskininlärningsexperiment att hålla ut en del av tillgängliga data som en testuppsättning X_test, y_test . Observera att ordet "experiment" inte är avsett att endast beteckna akademisk användning, eftersom även i kommersiella miljöer börjar maskininlärning vanligtvis experimentellt.

I scikit-learning kan en slumpmässig uppdelning i träning och testuppsättningar snabbt beräknas med hjälpfunktionen train_test_split . Låt oss ladda irisdatauppsättningen så att den passar en linjär supportvektormaskin på den:

>>> 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,))

Vi kan nu snabbt prova en träningsuppsättning samtidigt som vi håller ut 40% av uppgifterna för att testa (utvärdera) vår klassificerare:

>>> 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,))

Nu, efter att vi har tåg- och testuppsättningar, låter vi använda det:

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

K-Fold Cross Validation

K-faldig korsvalidering är en systematisk process för att upprepa tåg- / testdelningsproceduren flera gånger för att minska variationen förknippad med en enda test av tåg / testdelning. Du delar i huvudsak hela datasättet i "vikar" av lika stor storlek, och varje vikning används en gång för att testa modellen och K-1 gånger för att träna modellen.

Flera vikningstekniker finns tillgängliga med scikit-biblioteket. Deras användning är beroende av ingångsdataegenskaperna. Några exempel är

K-Fold

Du delar i huvudsak hela datasättet i "vikar" av lika stor storlek, och varje vikning används en gång för att testa modellen och K-1 gånger för att träna modellen.

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 är en variant av k-veck som returnerar stratifierade veck: varje uppsättning innehåller ungefär samma procentandel av prover från varje målklass som den kompletta uppsättningen

ShuffleSplit

Används för att generera ett användardefinierat antal oberoende tåg / testdatadelningar. Prover blandas först och delas sedan upp i ett par tåg- och testuppsättningar.

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 är en variant av ShuffleSplit, som returnerar stratifierade split, dvs som skapar split genom att bevara samma procentandel för varje målklass som i den kompletta uppsättningen.

Andra vikningstekniker som Leave One / p Out och TimeSeriesSplit (en variation av K-fold) finns tillgängliga i biblioteket scikit model_selection.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow