我想了解如何用二进制目标变量分割不平衡的数据集,其中87%的样本为负,13%的样本为正。现在,我知道,在进行任何类型的重采样以避免信息泄漏之前,您应该始终将数据分割成训练和测试集,但是怎样才能提供更好的结果--随机train_test_split或StratifiedShuffleSplit?普遍的看法是,在数据集不平衡的情况下,后者的表现似乎优于前者。顺便问一下,StratifiedShuffleSplit是如何工作的?
此外,如何考虑交叉验证集和如何处理它?
它是否还应包含相同数量的阳性和阴性样本,按照在培训集上进行的抽样?
发布于 2019-10-29 22:07:08
Grzegorz的答案找到了问题的根源--如果未来的数据--这个模型将用于对其进行预测--具有相同的分布,那么按类%分层是有意义的。
我想添加的一件事是,我通常使用普通的train_test_split函数,只需将类标签传递给它的分层参数,如下所示:
train_test_split(X, y, random_state=0, stratify=y, shuffle=True)这将对数据集进行洗牌,并匹配train_test_split结果中类的%s。
发布于 2019-10-10 17:50:41
这都取决于你的目标是什么。例如,如果您部署了一个模型,您希望测试数据(例如流数据)具有相同的pos/neg分布,那么对您的拆分进行分层是有意义的。这样,你就偏袒你的学习过程,把更多的东西贴上负面的标签。另一方面,如果你被告知给出更多的权重来检测稀疏的正例子,那么你可能想要尝试一个相等的分布。
发布于 2019-10-30 03:09:41
对于大型数据集,非分层分裂通常是可以的。您必须考虑在测试集和训练集之间存在显着差异的可能性。对我来说,数以千计的记录中有13%可能没有问题,但在100份记录中,有13%可能是问题。
马克的回答解释了分层是如何运作的。StratifiedShuffleSplit只是在交叉验证的上下文中通过创建一个生成器来多次拆分它,从而简化了这一点。您还可以将random_state传递给它,以便在每次迭代中分块保持一致,这对于超参数调优非常重要。查看文档中的示例。
https://datascience.stackexchange.com/questions/61549
复制相似问题