69 votes

différence entre StratifiedKFold et StratifiedShuffleSplit dans sklearn

D'après le titre, je me demande quelle est la différence entre

StratifiedKFold avec le paramètre shuffle = True

StratifiedKFold(n_splits=10, shuffle=True, random_state=0)

et

StratifiéShuffleSplit

StratifiedShuffleSplit(n_splits=10, test_size=’default’, train_size=None, random_state=0)

et quel est l'avantage d'utiliser StratifiedShuffleSplit

5 votes

L'un est un itérateur k-fold, qui divise les données k fois, et l'autre ne les divise qu'une seule fois.

2 votes

Mmm dans StratifiedShuffleSplit vous pouvez définir le nombre de splits... à partir de la page web de sklearn : StratifiedShuffleSplit : Cet objet de validation croisée est une fusion de StratifiedKFold et ShuffleSplit, qui renvoie des plis aléatoires stratifiés. Les plis sont faits en préservant le pourcentage d'échantillons pour chaque classe.

0 votes

Aah oui, ma faute. Mais il est quand même écrit dans la documentation de StratifiedShuffleSplit que vous avez liée que "Cet objet de validation croisée est une fusion de StratifiedKFold et ShuffleSplit, qui renvoie des plis aléatoires stratifiés. Les plis sont réalisés en préservant le pourcentage d'échantillons pour chaque classe."

94voto

Ken Syme Points 1931

Dans KFolds, chaque ensemble de test ne doit pas se chevaucher, même en cas de remaniement. Avec KFolds et shuffle, les données sont mélangées une fois au départ, puis divisées en un nombre de divisions souhaitées. Les données de test sont toujours une des divisions, les données de formation sont le reste.

Dans ShuffleSplit, les données sont mélangées à chaque fois, puis divisées. Cela signifie que les ensembles de tests peuvent se chevaucher entre les divisions.

Voir ce bloc pour un exemple de la différence. Notez le chevauchement des éléments dans les jeux d'essai pour ShuffleSplit.

splits = 5

tx = range(10)
ty = [0] * 5 + [1] * 5

from sklearn.model_selection import StratifiedShuffleSplit, StratifiedKFold
from sklearn import datasets

kfold = StratifiedKFold(n_splits=splits, shuffle=True, random_state=42)
shufflesplit = StratifiedShuffleSplit(n_splits=splits, random_state=42, test_size=2)

print("KFold")
for train_index, test_index in kfold.split(tx, ty):
    print("TRAIN:", train_index, "TEST:", test_index)

print("Shuffle Split")
for train_index, test_index in shufflesplit.split(tx, ty):
    print("TRAIN:", train_index, "TEST:", test_index)

Sortie :

KFold
TRAIN: [0 2 3 4 5 6 7 9] TEST: [1 8]
TRAIN: [0 1 2 3 5 7 8 9] TEST: [4 6]
TRAIN: [0 1 3 4 5 6 8 9] TEST: [2 7]
TRAIN: [1 2 3 4 6 7 8 9] TEST: [0 5]
TRAIN: [0 1 2 4 5 6 7 8] TEST: [3 9]
Shuffle Split
TRAIN: [8 4 1 0 6 5 7 2] TEST: [3 9]
TRAIN: [7 0 3 9 4 5 1 6] TEST: [8 2]
TRAIN: [1 2 5 6 4 8 9 0] TEST: [3 7]
TRAIN: [4 6 7 8 3 5 1 2] TEST: [9 0]
TRAIN: [7 2 6 5 4 3 0 9] TEST: [1 8]

Quant à savoir quand les utiliser, j'ai tendance à utiliser KFolds pour toute validation croisée, et j'utilise ShuffleSplit avec une division de 2 pour mes divisions train/test set. Mais je suis sûr qu'il y a d'autres cas d'utilisation pour les deux.

1 votes

+1 Pour votre grande réponse. Pouvez-vous s'il vous plaît, répondre ma question

69voto

Catbuilts Points 746

@Ken Syme a déjà une très bonne réponse. Je veux juste ajouter quelque chose.

  • StratifiedKFold est une variante de KFold . Premièrement, StratifiedKFold mélange vos données, après quoi il divise les données en n_splits pièces et fait. Maintenant, il utilisera chaque pièce comme un ensemble de test. Notez que il ne mélange les données qu'une seule fois et toujours avant le fractionnement.

Avec shuffle = True les données sont mélangées par votre random_state . Sinon, les données sont mélangées par np.random (par défaut). Par exemple, avec n_splits = 4 et vos données ont 3 classes (étiquette) pour y (variable dépendante). 4 ensembles de test couvrent toutes les données sans aucun chevauchement.

enter image description here

  • D'un autre côté, StratifiedShuffleSplit est une variante de ShuffleSplit . Premièrement, StratifiedShuffleSplit mélange vos données, et ensuite il divise aussi les données en n_splits pièces. Cependant, ce n'est pas encore terminé. Après cette étape, StratifiedShuffleSplit choisit une pièce à utiliser comme jeu de test. Ensuite, il répète le même processus n_splits - 1 d'autres fois, pour obtenir n_splits - 1 d'autres ensembles de tests. Regardez l'image ci-dessous, avec les mêmes données, mais cette fois, les 4 ensembles de test ne couvrent pas toutes les données, c'est-à-dire qu'il y a des chevauchements entre les ensembles de test.

enter image description here

Donc, la différence ici est que StratifiedKFold ne mélange et ne divise qu'une fois, donc les ensembles de test ne se chevauchent pas. alors que StratifiedShuffleSplit se mélange à chaque fois avant de se diviser, et il divise n_splits parfois, les ensembles de tests peuvent se chevaucher .

  • Note Les deux méthodes utilisent le "pli stratifié" (c'est pourquoi "stratifié" apparaît dans les deux noms). Cela signifie que chaque partie préserve le même pourcentage d'échantillons de chaque classe (étiquette) que les données originales. Vous pouvez en savoir plus à l'adresse suivante documents de validation croisée

7 votes

Explication parfaite ! !!

11voto

Black Raven Points 21

Sortir des exemples de KFold, StratifiedKFold, StratifiedShuffleSplit : Output examples of KFold, StratifiedKFold, StratifiedShuffleSplit

La sortie illustrée ci-dessus est une extension de @Ken Syme Le code de l'entreprise :

from sklearn.model_selection import KFold, StratifiedKFold, StratifiedShuffleSplit
SEED = 43
SPLIT = 3

X_train = [0,1,2,3,4,5,6,7,8]
y_train = [0,0,0,0,0,0,1,1,1]   # note 6,7,8 are labelled class '1'

print("KFold, shuffle=False (default)")
kf = KFold(n_splits=SPLIT, random_state=SEED)
for train_index, test_index in kf.split(X_train, y_train):
    print("TRAIN:", train_index, "TEST:", test_index)

print("KFold, shuffle=True")
kf = KFold(n_splits=SPLIT, shuffle=True, random_state=SEED)
for train_index, test_index in kf.split(X_train, y_train):
    print("TRAIN:", train_index, "TEST:", test_index)

print("\nStratifiedKFold, shuffle=False (default)")
skf = StratifiedKFold(n_splits=SPLIT, random_state=SEED)
for train_index, test_index in skf.split(X_train, y_train):
    print("TRAIN:", train_index, "TEST:", test_index)

print("StratifiedKFold, shuffle=True")
skf = StratifiedKFold(n_splits=SPLIT, shuffle=True, random_state=SEED)
for train_index, test_index in skf.split(X_train, y_train):
    print("TRAIN:", train_index, "TEST:", test_index)

print("\nStratifiedShuffleSplit")
sss = StratifiedShuffleSplit(n_splits=SPLIT, random_state=SEED, test_size=3)
for train_index, test_index in sss.split(X_train, y_train):
    print("TRAIN:", train_index, "TEST:", test_index)

print("\nStratifiedShuffleSplit (can customise test_size)")
sss = StratifiedShuffleSplit(n_splits=SPLIT, random_state=SEED, test_size=2)
for train_index, test_index in sss.split(X_train, y_train):
    print("TRAIN:", train_index, "TEST:", test_index)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X