scikit-learn
Modellval
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.