Python 列车测试分割在分层数据上未按预期工作

Python 列车测试分割在分层数据上未按预期工作,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我试图以分层的方式分割数据。我认为sklearn中的train\u test\u split在不平衡的数据集上不起作用 以下是一个例子: 从sklearn.model\u选择导入列车\u测试\u分割 从收款进口柜台 y=[7]*2+[1]*100+[2]*3+[3]*3+[4]*6+[5]*100+[6]*2+[8]*2 xtrain,xtest=列车试验( y、 分层=y,测试尺寸=0.2, 洗牌=True,随机状态=42 ) 打印(计数器(xtrain)) #计数器({1:80,5:80,2

我试图以分层的方式分割数据。我认为
sklearn
中的
train\u test\u split
在不平衡的数据集上不起作用

以下是一个例子:

从sklearn.model\u选择导入列车\u测试\u分割
从收款进口柜台
y=[7]*2+[1]*100+[2]*3+[3]*3+[4]*6+[5]*100+[6]*2+[8]*2
xtrain,xtest=列车试验(
y、 分层=y,测试尺寸=0.2,
洗牌=True,随机状态=42
)
打印(计数器(xtrain))
#计数器({1:80,5:80,2:2,4:5,8:2,3:2,7:2,6:1})
打印(计数器(xtest))
#计数器({5:20,1:20,6:1,2:1,3:1,4:1})

第1类和第5类按预期方式分布。然而,代表性不足的班级分布不均。第6、2、3、4类分布均匀,但不是第8和第7类。我是否遗漏了正确执行此拆分的内容?

我实际上认为它确实有效。在某些类中,样本太少,无法统计准确

我尝试了以下方法

y=[7]*200+[1]*10000+[2]*300+[3]*300+[4]*600+[5]*10000+[6]*200+[8]*200
输出正确:

>>> Counter({1: 8000, 5: 8000, 4: 480, 2: 240, 3: 240, 6: 160, 7: 160, 8: 160})
Counter({1: 2000, 5: 2000, 4: 120, 2: 60, 3: 60, 6: 40, 7: 40, 8: 40})
致意
-ga97dil

我实际上认为它确实有效。在某些类中,样本太少,无法统计准确

我尝试了以下方法

y=[7]*200+[1]*10000+[2]*300+[3]*300+[4]*600+[5]*10000+[6]*200+[8]*200
输出正确:

>>> Counter({1: 8000, 5: 8000, 4: 480, 2: 240, 3: 240, 6: 160, 7: 160, 8: 160})
Counter({1: 2000, 5: 2000, 4: 120, 2: 60, 3: 60, 6: 40, 7: 40, 8: 40})
致意
-ga97dil

我不认为你遗漏了什么。分层尝试在拆分期间维护每个类的表示。这里唯一的问题是样本大小不够大,您无法在测试大小中看到完整的反映


你可以通过增加8和7的样本量来解决这个问题。

我不认为你遗漏了什么。分层尝试在拆分期间维护每个类的表示。这里唯一的问题是样本大小不够大,您无法在测试大小中看到完整的反映


您可以通过增加8和7的样本量来解决这个问题。

这是非常不平衡的数据集的问题,是的。但是我需要把这些样本放在我的测试集中,即使我的模型只训练了这门课的一个项目。我现在明白你的意思了。遗憾的是,我在sklearn文档中找不到您需要的任何功能。我想到的两个非常幼稚的方法是:1。在调用函数之前,将所有表示形式太低的元素拆分,然后将它们添加到
xtrain
;2.搜索一个随机状态,使所有表示过低的元素都位于
xtrain
中。这是非常不平衡的数据集的问题,是的。但是我需要把这些样本放在我的测试集中,即使我的模型只训练了这门课的一个项目。我现在明白你的意思了。遗憾的是,我在sklearn文档中找不到您需要的任何功能。我想到的两个非常幼稚的方法是:1。在调用函数之前,将所有表示形式太低的元素拆分,然后将它们添加到
xtrain
;2.搜索一个随机状态,使所有表示过低的元素都处于
xtrain
中。