为什么sklearn中10折交叉验证准确率低于90-10 train_test_split的结果?
可能的原因
1. K折交叉验证代码实现错误
你贴出的K折拆分代码仅对样本名称数组data_sampled做了拆分,没有同步拆分标签数组label_sampled,如果后续训练时没有正确匹配对应折的训练标签,会直接导致模型训练时标签匹配错误,最终测试集表现下降。
此外常见的实现疏漏还包括:K折循环中没有每次重新初始化模型权重,前一折训练后的模型参数被继承到当前折的训练中,拟合逻辑混乱,导致测试得分偏低。
2. 拆分策略差异
你使用的普通KFold不是分层拆分(StratifiedKFold),即便你观察到单次划分的标签分布整体平衡,也可能存在训练集/测试集内的特征分布差异:比如某些和标签强相关的特征组合仅出现在train_test_split的训练集和测试集中,而K折的某次划分刚好把这类特征组合全部分到训练集或测试集中,导致分布偏移。如果你的数据集总样本量较小,这种特征分布的波动会被放大,多次测试也可能出现稳定的得分差。
3. 预处理环节的数据泄露差异
你当前的实现是先对全数据集做欠采样,再做训练测试拆分,这本身已经引入了数据泄露:欠采样时用到了测试集样本的标签信息,会让测试集得分虚高。而两种拆分方式的泄露程度可能不同:
train_test_split是单次随机拆分,测试集样本在欠采样阶段的影响刚好和训练集更匹配,导致得分虚高更明显- K折拆分的测试集样本在欠采样阶段的分布和训练集匹配度更低,因此得分更接近真实的泛化表现
4. 评估环节的统计偏差
你对比的是K折单次划分的结果和单次train_test_split的结果,10折交叉验证的正确用法是取10次测试得分的平均值作为最终结果,单次K折的结果本身就存在波动,你观察到的稳定差异可能刚好是多次随机试验中K折单次结果整体偏低的统计巧合,建议你跑完10折取平均后再和多次train_test_split的平均得分做对比,结果会更准确。
内容的提问来源于stack exchange,提问作者oliver.c
相关产品推荐
相关产品推荐

