Recherche…


Validation croisée

Apprendre les paramètres d'une fonction de prédiction et les tester sur les mêmes données est une erreur méthodologique: un modèle qui ne ferait que répéter les étiquettes des échantillons qu'il vient de voir aurait un score parfait mais ne pourrait rien prédire d'utile- données invisibles Cette situation s’appelle overfitting . Pour l'éviter, il est courant lors d'une expérience d'apprentissage automatique (supervisé) de conserver une partie des données disponibles sous la forme d'un ensemble de test X_test, y_test . Notez que le mot «expérience» n’est pas destiné à désigner uniquement une utilisation académique, car même dans les environnements commerciaux, l’apprentissage automatique commence expérimentalement.

Dans scikit-learn, la fonction helper train_test_split permet de calculer rapidement un fractionnement aléatoire en jeux d’entraînement et en tests. Chargez le jeu de données de l'iris pour l'adapter à une machine à vecteur de support linéaire:

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

Nous pouvons maintenant échantillonner rapidement un ensemble d'entraînement en conservant 40% des données pour tester (évaluer) notre classificateur:

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

Maintenant, après avoir des ensembles de train et de test, utilisons-les:

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

Validation croisée K-Fold

La validation croisée K-fold est un processus systématique de répétition répétée de la procédure de fractionnement train / test afin de réduire la variance associée à un seul essai de séparation train / test. Vous divisez essentiellement le jeu de données entier en K de taille égale "plis", et chaque fois est utilisé une fois pour tester le modèle et K-1 fois pour entraîner le modèle.

Plusieurs techniques de pliage sont disponibles avec la bibliothèque scikit. Leur utilisation dépend des caractéristiques des données d'entrée. Certains exemples sont

K-Fold

Vous divisez essentiellement le jeu de données entier en K de taille égale "plis", et chaque fois est utilisé une fois pour tester le modèle et K-1 fois pour entraîner le modèle.

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 est une variation de k-fold qui renvoie des plis stratifiés: chaque ensemble contient approximativement le même pourcentage d'échantillons de chaque classe cible que l'ensemble complet

ShuffleSplit

Utilisé pour générer un nombre défini par l'utilisateur de groupes de données de train / test indépendants. Les échantillons sont d'abord mélangés puis divisés en une paire de trains et de jeux de 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 est une variante de ShuffleSplit, qui renvoie des divisions stratifiées, c'est-à-dire qui créent des divisions en conservant le même pourcentage pour chaque classe cible que dans l'ensemble complet.

D'autres techniques de pliage telles que Leave One / p Out et TimeSeriesSplit (une variante de K-fold) sont disponibles dans la bibliothèque scikit model_selection.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow