我是sklearn的一个相对较新的用户,并且在sklearn.model_selection的train_test_split中遇到了一些意想不到的行为.我有一个熊猫数据框,我想分成一个训练和测试集.我想将数据分层至少2个,但理想情况下我的数据框中有4列.
当我尝试这样做时,sklearn没有警告,但后来我发现我的最终数据集中有重复的行.我创建了一个示例测试来显示此行为:
from sklearn.model_selection import train_test_split
a = np.array([i for i in range(1000000)])
b = [i%10 for i in a]
c = [i%5 for i in a]
df = pd.DataFrame({'a':a, 'b':b, 'c':c})
Run Code Online (Sandbox Code Playgroud)
如果我按任一列分层,它似乎按预期工作:
train, test = train_test_split(df, test_size=0.2, random_state=0, stratify=df[['b']])
print(len(train.a.values)) # prints 800000
print(len(set(train.a.values))) # prints 800000
train, test = train_test_split(df, test_size=0.2, random_state=0, stratify=df[['c']])
print(len(train.a.values)) # prints 800000
print(len(set(train.a.values))) # prints 800000
Run Code Online (Sandbox Code Playgroud)
但是当我尝试按两列分层时,我得到重复的值:
train, test = train_test_split(df, test_size=0.2, random_state=0, stratify=df[['b', 'c']])
print(len(train.a.values)) # prints 800000
print(len(set(train.a.values))) # prints 640000
Run Code Online (Sandbox Code Playgroud) 我有一个包含亚马逊评论数据的相当大的CSV文件,我将其读入大熊猫数据框.我想将数据分成80-20(训练测试),但在这样做时我想确保分割数据按比例代表一列(类别)的值,即所有不同类别的评论都存在于列车中并按比例测试数据.
数据如下所示:
**ReviewerID** **ReviewText** **Categories** **ProductId**
1212 good product Mobile 14444425
1233 will buy again drugs 324532
5432 not recomended dvd 789654123
Run Code Online (Sandbox Code Playgroud)
我使用以下代码来执行此操作:
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)
Run Code Online (Sandbox Code Playgroud)
它给出了以下错误
NameError: name 'y' is not defined
Run Code Online (Sandbox Code Playgroud)
因为我对python相对较新,所以我无法弄清楚我做错了什么,或者这个代码是否会根据列类别进行分层.当我从train-test split中删除了stratify选项以及categories列时,它似乎工作正常.
任何帮助将不胜感激.