Solution Numpy. Nous allons d'abord mélanger l'ensemble des données ( df.sample(frac=1, random_state=42)
), puis nous avons divisé notre ensemble de données en plusieurs parties :
- 60 % - train set,
- 20% - ensemble de validation,
- 20% - jeu d'essai
In [305]: train, validate, test = \
np.split(df.sample(frac=1, random_state=42),
[int(.6*len(df)), int(.8*len(df))])
In [306]: train
Out[306]:
A B C D E
0 0.046919 0.792216 0.206294 0.440346 0.038960
2 0.301010 0.625697 0.604724 0.936968 0.870064
1 0.642237 0.690403 0.813658 0.525379 0.396053
9 0.488484 0.389640 0.599637 0.122919 0.106505
8 0.842717 0.793315 0.554084 0.100361 0.367465
7 0.185214 0.603661 0.217677 0.281780 0.938540
In [307]: validate
Out[307]:
A B C D E
5 0.806176 0.008896 0.362878 0.058903 0.026328
6 0.145777 0.485765 0.589272 0.806329 0.703479
In [308]: test
Out[308]:
A B C D E
4 0.521640 0.332210 0.370177 0.859169 0.401087
3 0.333348 0.964011 0.083498 0.670386 0.169619
[int(.6*len(df)), int(.8*len(df))]
- est un indices_or_sections
pour numpy.split() .
Voici une petite démo pour np.split()
Utilisation - divisons un tableau de 20 éléments en les parties suivantes : 80%, 10%, 10% :
In [45]: a = np.arange(1, 21)
In [46]: a
Out[46]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
In [47]: np.split(a, [int(.8 * len(a)), int(.9 * len(a))])
Out[47]:
[array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]),
array([17, 18]),
array([19, 20])]
6 votes
Cela ne répond pas à votre question spécifique, mais je pense que l'approche la plus standard pour cela serait de diviser en deux ensembles, formation et test, et d'exécuter une validation croisée sur l'ensemble de formation, éliminant ainsi le besoin d'un ensemble de "développement" autonome.
1 votes
Cette question a déjà été soulevée et, pour autant que je sache, il n'existe pas encore de méthode intégrée pour cela.
5 votes
Je suggère l'article de Hastie et al. Les éléments de l'apprentissage statistique pour une discussion sur les raisons d'utiliser trois ensembles au lieu de deux ( web.stanford.edu/~hastie/local.ftp/Springer/OLD/ Chapitre sur l'évaluation et la sélection des modèles)
2 votes
David Dans certains modèles, pour éviter l'overfitting, il est nécessaire de disposer de trois ensembles au lieu de deux, car dans vos choix de conception, vous réglez en quelque sorte les paramètres pour améliorer les performances sur l'ensemble de test. Pour éviter cela, un ensemble de développement est nécessaire. Ainsi, l'utilisation de la validation croisée ne sera pas suffisante.
1 votes
@CentAu Je ne comprends pas. Vous ajustez votre modèle dans le cadre d'une validation croisée, puis vous effectuez un test final avec votre ensemble de tests pour vous assurer que vos résultats de CV sont conformes. Il y a des cas d'utilisation où la validation croisée n'est pas une bonne solution, comme lorsqu'il y a des biais ou des fuites inhérents aux données (ex : prévision), mais vous ne chercheriez pas une fonction générale pour diviser votre ensemble de données en trois morceaux aléatoires si c'était le cas.
0 votes
@David Ah je vois. Si vous vous réglez sur CV et que vous évaluez ensuite sur le jeu de test final, tout va bien alors. J'ai mal interprété votre commentaire. +1
6 votes
@ayhan, une URL corrigée pour ce livre est statweb.stanford.edu/~tibs/ElemStatLearn/printings/ , chapitre 7 (p. 219).
0 votes
Utilisation de
train_test_split
deux fois, c'est deux lignes de code. Si vous ne voulez absolument qu'une seule ligne de code, il suffit de les intégrer dans une fonction. De cette façon, vous conservez les avantages de l'utilisation d'une fonction bien testée avec le soutien de la communauté, etc.1 votes
De plus, il n'y a rien de magique dans le chiffre 3. Vous pourriez en principe avoir besoin d'un quatrième ensemble (et d'un cinquième et...) à un stade ultérieur si vous avez besoin de faire plus de couches de validation croisée et de tester avec plus de modèles qui ont déjà été testés avec l'ensemble "test" existant. Ainsi, le fait d'avoir une implémentation dans
sklearn
qui est spécifique à exactement 3 séries n'est peut-être pas la bonne solution. Il pourrait cependant être judicieux d'avoir une implémentation qui peut se diviser en n ensembles. Vous pourriez créer le vôtre en appelant récursivementtrain_test_split
.