web-dev-qa-db-fra.com

échantillonnage stratifié sklearn basé sur une colonne

J'ai un fichier CSV assez volumineux contenant des données de révision Amazon que j'ai lues dans une trame de données pandas. Je veux diviser les données 80-20 (train-test) mais en le faisant, je veux s'assurer que les données fractionnées représentent proportionnellement les valeurs d'une colonne (Catégories), c'est-à-dire que toutes les différentes catégories de revues sont présentes à la fois dans les données de train et de test proportionnellement.

Les données ressemblent à ceci:

**ReviewerID**       **ReviewText**        **Categories**       **ProductId**

1212                   good product         Mobile               14444425
1233                   will buy again       drugs                324532
5432                   not recomended       dvd                  789654123 

J'utilise le code suivant pour ce faire:

import pandas as pd
Meta = pd.read_csv('C:\\Users\\xyz\\Desktop\\WM Project\\Joined.csv')
import numpy as np
from sklearn.cross_validation import train_test_split

train, test = train_test_split(Meta.categories, test_size = 0.2, stratify=y)

cela donne l'erreur suivante

NameError: name 'y' is not defined

Comme je suis relativement nouveau à python je ne peux pas comprendre ce que je fais mal ou si ce code va stratifier en fonction des catégories de colonnes. Il semble fonctionner correctement lorsque je supprime l'option stratifier comme ainsi que la colonne des catégories de la répartition des tests de train.

Toute aide serait appréciée.

14
    >>> import pandas as pd
    >>> Meta = pd.read_csv('C:\\Users\\*****\\Downloads\\so\\Book1.csv')
    >>> import numpy as np
    >>> from sklearn.model_selection import train_test_split
    >>> y = Meta.pop('Categories')
    >>> Meta
        ReviewerID      ReviewText  ProductId
        0        1212    good product   14444425
        1        1233  will buy again     324532
        2        5432  not recomended  789654123
    >>> y
        0    Mobile
        1     drugs
        2       dvd
        Name: Categories, dtype: object
    >>> X = Meta
    >>> X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.33, random_state=42, stratify=y)
    >>> X_test
        ReviewerID    ReviewText  ProductId
        0        1212  good product   14444425
18
nEO

sklearn.model_selection.train_test_split

stratifier: semblable à un tableau ou Aucun (la valeur par défaut est Aucun)

Si ce n'est pas le cas, les données sont divisées de manière stratifiée, en utilisant ceci comme étiquettes de classe.

Le long de la documentation de l'API, je pense que vous devez essayer comme X_train, X_test, y_train, y_test = train_test_split(Meta_X, Meta_Y, test_size = 0.2, stratify=Meta_Y).

Meta_X, Meta_Y devrait être attribué correctement par vous (je pense que Meta_Y devrait être Meta.categories en fonction de votre code).

10
su79eu7k