split_test_train 和交叉验证之间的分数差异很大 (10%)

Big difference in score (10%) between a split_test_train and a cross validation

我有一个分类问题: 2,500 行。 25000 列 88种不同类分布不均

然后发生了一件非常奇怪的事情:

当我 运行 十几个不同的拆分测试火车时,我总是得到 60% 左右的分数...

当我 运行 交叉验证时,我总是得到 50% 左右的分数。 这里的屏幕: 此外,它与 类 的不平等分布无关,因为当我在 TTS 上放置 stratify=y 时,我保持在 60% 左右,而当我放置 StratifiedKFold 时,我保持在 50% 左右。

要记住哪个分数?为什么不同?对我来说,一份 CV 只是一连串的测试列车拆分,彼此之间的拆分不同,因此没有任何理由可以证明这种分数差异是合理的。

第一个代码示例 return 5 个值,然后您在 4/5 的数据上学习,在 1/5 上有效。 第二个sample learn on 5/6 and valid on 1/6, 效果更好

也许你可以试试for k in range(5),看看你们的分数是否还有很大的差距?

简答:将 shuffle=True 添加到您的 KFold 中: cross_val_score(森林,X,y,cv=KFold(shuffle=True))

长答案:连续的 TrainTestSplit 与经典 KFold 的交叉验证之间的区别在于,在火车和测试集之间进行拆分之前,TTS 中存在混合。 分数的差异可能是由于您的数据集以有偏见的方式排序。 因此,只需将 shuffle=True 添加到您的 KFold(或您的 StratifiedKFold,这就是您需要做的全部)。