Ricerca…


Convalida incrociata

Imparare i parametri di una funzione di predizione e testarla sugli stessi dati è un errore metodologico: un modello che ripeterebbe semplicemente le etichette dei campioni che aveva appena visto avrebbe un punteggio perfetto ma non riuscirebbe a prevedere qualcosa di utile su ancora- dati non visti. Questa situazione è chiamata overfitting . Per evitarlo, è pratica comune eseguire un esperimento di apprendimento automatico (supervisionato) per X_test, y_test una parte dei dati disponibili come test set X_test, y_test . Si noti che la parola "esperimento" non è destinata a denotare solo l'uso accademico, perché anche nelle impostazioni commerciali l'apprendimento automatico inizia di solito sperimentalmente.

In scikit, impara una divisione casuale in allenamento e i set di test possono essere rapidamente calcolati con la funzione helper train_test_split . Carichiamo il set di dati dell'iride per adattarlo a una macchina vettoriale di supporto lineare:

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

Ora possiamo campionare rapidamente un set di allenamento mentre tratteniamo il 40% dei dati per testare (valutare) il nostro classificatore:

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

Ora, dopo aver impostato i set di allenamento e di test, usiamolo:

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

K-Fold Cross Validation

La cross-validation K-fold è un processo sistematico per ripetere più volte la procedura di split treno / test, al fine di ridurre la varianza associata a una singola prova di split treno / test. In pratica dividi l'intero set di dati in "pieghe" uguali alle dimensioni di K, e ogni piega viene usata una volta per testare il modello e K-1 volte per addestrare il modello.

Le tecniche di piegatura multiple sono disponibili con la libreria scikit. Il loro utilizzo dipende dalle caratteristiche dei dati di input. Alcuni esempi sono

K-Fold

In pratica dividi l'intero set di dati in "pieghe" uguali alle dimensioni di K, e ogni piega viene usata una volta per testare il modello e K-1 volte per addestrare il modello.

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 è una variazione di k-fold che restituisce pieghe stratificate: ogni set contiene approssimativamente la stessa percentuale di campioni di ciascuna classe di destinazione del set completo

ShuffleSplit

Utilizzato per generare un numero definito dall'utente di scissioni di serie di dati indipendenti treno / prova. I campioni vengono prima mescolati e quindi suddivisi in un paio di treni e set di test.

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 è una variazione di ShuffleSplit, che restituisce suddivisioni stratificate, vale a dire che crea divisioni mantenendo la stessa percentuale per ogni classe di destinazione come nel set completo.

Altre tecniche di piegatura come Leave One / p Out e TimeSeriesSplit (una variazione di K-fold) sono disponibili nella libreria del modello sci_selection.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow