Python 测试列车分层

Python 测试列车分层,python,scikit-learn,Python,Scikit Learn,我正试图按数据帧(约188k行)划分为训练样本和测试样本。列('FLAG')是我的目标变量,包含0或1的值 因为只有大约1300个“FLAG”的值为1,所以我想进行分层拆分,以确保两个样本中都有代表性的1个值 我尝试使用sklearn的train_test_分割功能进行分割: train, test = train_test_split(df, test_size=0.2, stratify=df["FLAG"]) 我的问题是,生成的序列和测试样本分别有177942行和52行。我预计会有150

我正试图按数据帧(约188k行)划分为训练样本和测试样本。列('FLAG')是我的目标变量,包含0或1的值

因为只有大约1300个“FLAG”的值为1,所以我想进行分层拆分,以确保两个样本中都有代表性的1个值

我尝试使用sklearn的train_test_分割功能进行分割:

train, test = train_test_split(df, test_size=0.2, stratify=df["FLAG"])
我的问题是,生成的序列和测试样本分别有177942行和52行。我预计会有150400行和37600行

通过阅读文档()我的理解是,我必须提供我的数据帧、test_大小和包含目标类的列(在我的例子中是“FLAG”)

即使是一个普通的例子:

df = pd.DataFrame(data={'a': np.random.rand(100000), 'b': np.random.rand(100000), 'c': 0})
df.loc[np.random.randint(0, 100000, 1000), 'c'] = 1
tr, ts = train_test_split(df, test_size=.2, stratify=df['c'])
print(tr.shape, ts.shape)
返回:
(93105,3)(38,3)

我的进口清单:

import cx_Oracle
import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np
我的python版本:3.7.0 Sklearn版本:0.20.3
Pandas版本:0.23.4

我的调查表明,问题是由整数溢出引起的。这个问题只发生在Python3.7.x32位上。64位版本工作正常


最后,我切换到64位Python来解决这个问题(之前由于与Oracle软件包无关的依赖关系,我不得不使用32位版本)。

非常有趣。我用随机构造的样本df运行了一些测试,它似乎工作得很好。您应该发布一些示例数据,以便我们重现您的问题。我的示例df:
df=pd.DataFrame(数据={'a':np.random.rand(100000),'b':np.random.rand(100000),'c':0})
。将大约1000个值设置为1:
df.loc[np.random.randint(0,100000,1000),'c']=1
,拆分数据:
tr,ts=train\u test\u split(df,test\u size=.2,stratify=df['c'])
。检查形状:
tr.shape
Out:
(80000,3)
,以及1的数量:
tr.c.sum()
Out:
796
和ts:199。所以你的电脑似乎有问题data@Scotty我试过同样的测试。有趣的是,我的火车测试和你的例子做了同样奇怪的事情。也就是说,我得到了(93105,3)和(38,3)。现在我更困惑了。@tk78:您使用的python和包的版本是什么?你能把所有的导入放在通用代码之前并重新执行吗(例如:也许你的train_test_split被其他包重新定义了,它不是你认为的那个)@vladmihaisima我添加了你要求的信息。顺便说一句:我只是在用虚拟环境测试这个东西。@tk78你的sklean和pandas版本是什么?看起来像个虫子。。。