23

我有一个相当大的 CSV 文件,其中包含我读入熊猫数据框的亚马逊评论数据。我想将数据拆分为 80-20(train-test),但这样做时我想确保拆分数据按比例表示一列(类别)的值,即所有不同类别的评论都存在于火车中并按比例测试数据。

数据如下所示:

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

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

我使用以下代码这样做:

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)

它给出了以下错误

NameError: name 'y' is not defined

由于我对 python 比较陌生,我无法弄清楚我做错了什么,或者这段代码是否会根据列类别进行分层。当我从训练测试拆分中删除分层选项以及类别列时,它似乎工作正常。

任何帮助将不胜感激。

4

3 回答 3

34
    >>> 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
于 2016-05-03T07:24:24.970 回答
11

sklearn.model_selection.train_test_split

分层:类数组或无(默认为无)

如果不是 None,则以分层方式拆分数据,将其用作类标签。

沿着 API 文档,我认为你必须尝试像X_train, X_test, y_train, y_test = train_test_split(Meta_X, Meta_Y, test_size = 0.2, stratify=Meta_Y).

Meta_XMeta_Y应该由你正确分配(我认为Meta_Y应该Meta.categories基于你的代码)。

于 2016-05-03T07:17:40.983 回答
2

我不确定为什么没有人提到 StratifiedShuffleSplit

from sklearn.model_selection import StratifiedShuffleSplit
split = StratifiedShuffleSplit(n_splits=10, test_size=0.2, random_state=42)
for train_index, test_index in split.split(df, df['Categories']):
    strat_train_set = df.loc[train_index]
    strat_test_set = df.loc[test_index]

有关文档,请参阅StratifiedShuffleSplit

于 2021-07-08T18:23:26.490 回答