J'ai un ensemble de données assez important sous la forme d'une trame de données et je me demandais comment je pourrais diviser la trame de données en deux échantillons aléatoires (80% et 20%) pour la formation et les tests.
Merci!
python
python-2.7
pandas
dataframe
tooty44
la source
la source
msk
est de DTYPEbool
,df[msk]
,df.iloc[msk]
etdf.loc[msk]
revenir toujours le même résultat.rand
pour< 0.8
donner un sens car il renvoie des nombres aléatoires uniformément répartis entre 0 et 1.in[12]
,in[13]
,in[14]
? Je veux comprendre le code python lui-même icinp.random.rand(len(df))
est un tableau de taillelen(df)
avec des valeurs flottantes réparties de manière aléatoire et uniforme dans la plage [0, 1]. Le< 0.8
applique la comparaison par élément et stocke le résultat en place. Ainsi, les valeurs <0,8 deviennentTrue
et la valeur> = 0,8 deviennentFalse
scikit learn's
train_test_split
est une bonne chose.la source
kf = KFold(n, n_folds=folds) for train_index, test_index in kf: X_train, X_test = X.ix[train_index], X.ix[test_index]
voir l'exemple complet ici: quantstart.com/articles/…from sklearn.model_selection import train_test_split
plutôt.from sklearn.cross_validation import train_test_split
L'échantillon aléatoire des pandas fonctionnera également
la source
random_state
arg?test
ensemble mélangé est souhaité, comme indiqué ici stackoverflow.com/questions/29576430/shuffle-dataframe-rows .test=df.drop(train.index).sample(frac=1.0)
J'utiliserais le propre training_test_split de scikit-learn et le générerais à partir de l'index
la source
cross_validation
module est désormais obsolète:DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
Il existe de nombreuses façons de créer un train / test et même des échantillons de validation.
Cas 1: manière classique
train_test_split
sans aucune option:Cas 2: cas d'un très petit ensemble de données (<500 lignes): afin d'obtenir des résultats pour toutes vos lignes avec cette validation croisée. À la fin, vous aurez une prédiction pour chaque ligne de votre ensemble d'entraînement disponible.
Cas 3a: ensembles de données non équilibrés à des fins de classification. Après le cas 1, voici la solution équivalente:
Cas 3b: ensembles de données déséquilibrés à des fins de classification. Après le cas 2, voici la solution équivalente:
Cas 4: vous devez créer un train / test / ensembles de validation sur le Big Data pour régler les hyperparamètres (60% train, 20% test et 20% val).
la source
Vous pouvez utiliser le code ci-dessous pour créer des échantillons de test et de formation:
La taille du test peut varier en fonction du pourcentage de données que vous souhaitez mettre dans votre jeu de données de test et de formation.
la source
Il existe de nombreuses réponses valables. Ajouter un de plus au groupe. de sklearn.cross_validation import train_test_split
la source
Vous pouvez également envisager une division stratifiée en ensemble de formation et de test. La division Startified génère également des formations et des tests définis de manière aléatoire mais de telle manière que les proportions de classe d'origine sont préservées. Les ensembles de formation et de test reflètent ainsi mieux les propriétés de l'ensemble de données d'origine.
df [train_inds] et df [test_inds] vous donnent les ensembles de formation et de test de votre DataFrame df d'origine.
la source
Si vous devez diviser vos données par rapport à la colonne des étiquettes dans votre ensemble de données, vous pouvez utiliser ceci:
et l'utiliser:
vous pouvez également passer random_state si vous souhaitez contrôler le caractère aléatoire divisé ou utiliser une graine aléatoire globale.
la source
la source
Vous pouvez utiliser ~ (opérateur tilde) pour exclure les lignes échantillonnées à l'aide de df.sample (), laissant les pandas seuls gérer l'échantillonnage et le filtrage des index, pour obtenir deux ensembles.
la source
C'est ce que j'ai écrit lorsque j'avais besoin de diviser un DataFrame. J'ai envisagé d'utiliser l'approche d'Andy ci-dessus, mais je n'aimais pas que je ne puisse pas contrôler exactement la taille des ensembles de données (c'est-à-dire que ce serait parfois 79, parfois 81, etc.).
la source
Sélectionnez simplement la ligne de plage de df comme ceci
la source
df
dans votre extrait de code est (ou devrait être) mélangé, cela améliorera la réponse.Il y a beaucoup de bonnes réponses ci-dessus, donc je veux juste ajouter un autre exemple dans le cas où vous souhaitez spécifier le nombre exact d'échantillons pour le train et les ensembles de test en utilisant uniquement la
numpy
bibliothèque.la source
Pour diviser en plus de deux classes telles que le train, le test et la validation, on peut faire:
Cela mettra environ 70% des données en formation, 15% en test et 15% en validation.
la source
vous devez convertir le cadre de données pandas en tableau numpy, puis reconvertir le tableau numpy en cadre de données
la source
Si vous souhaitez avoir une trame de données et deux trames de données (pas des tableaux numpy), cela devrait faire l'affaire:
la source
Vous pouvez utiliser la fonction df.as_matrix () et créer un tableau Numpy et le passer.
la source
Un peu plus élégant à mon goût est de créer une colonne aléatoire, puis de la diviser, de cette façon, nous pouvons obtenir une division qui conviendra à nos besoins et sera aléatoire.
la source
la source
Pas besoin de convertir en numpy. Il suffit d'utiliser un pandas df pour faire la division et il retournera un pandas df.
Et si vous voulez séparer x de y
la source
Je pense que vous devez également obtenir une copie et non une tranche de trame de données si vous souhaitez ajouter des colonnes plus tard.
la source
Que dis-tu de ça? df est mon dataframe
la source