KFolds交叉验证与train_test_split

7
我今天刚构建了我的第一个随机森林分类器,并且正在尝试提高其性能。我阅读了关于如何使用交叉验证来避免数据过拟合并获得更好结果的文章。我使用了sklearn中的StratifiedKFold方法实现了交叉验证,但令人惊讶的是,这种方法的准确性反而较低。我已经阅读了很多帖子,建议使用交叉验证比train_test_split更有效。
评估器:
rf = RandomForestClassifier(n_estimators=100, random_state=42)

K-Fold:

ss = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)
for train_index, test_index in ss.split(features, labels):
    train_features, test_features = features[train_index], features[test_index]
    train_labels, test_labels = labels[train_index], labels[test_index]

TTS:

train_feature, test_feature, train_label, test_label = \
    train_test_split(features, labels, train_size=0.8, test_size=0.2, random_state=42)

以下是结果:
CV:
AUROC:  0.74
Accuracy Score:  74.74 %.
Specificity:  0.69
Precision:  0.75
Sensitivity:  0.79
Matthews correlation coefficient (MCC):  0.49
F1 Score:  0.77

TTS:

AUROC:  0.76
Accuracy Score:  76.23 %.
Specificity:  0.77
Precision:  0.79
Sensitivity:  0.76
Matthews correlation coefficient (MCC):  0.52
F1 Score:  0.77

这真的可能吗?还是我错误地设置了我的模型?

此外,这是使用交叉验证的正确方式吗?

2个回答

7

很高兴看到您记录下了这些!

造成这种差异的原因是TTS方法引入了偏差(因为您并未使用所有观察结果进行测试),这解释了差异。

在验证方法中,仅使用一部分观测值(那些包含在训练集而不是验证集中)来拟合模型。由于统计方法在使用较少观测值进行训练时倾向于表现更差,这表明验证集误差率可能会高估在整个数据集上拟合的模型的测试误差率。

而且结果可能会有很大的变化:

测试误差率的验证估计可以高度变化,具体取决于训练集中包含哪些观测值以及验证集中包含哪些观测值。

交叉验证通过使用所有可用数据来处理此问题,从而消除了偏差。

在分析结果时,请记住TTS方法所持有的更多的偏差。也许在采样测试/验证集时你运气很好。

关于这个话题的更多内容在这里有一个很棒、适合初学者的文章:

https://codesachin.wordpress.com/2015/08/30/cross-validation-and-the-bias-variance-tradeoff-for-dummies/

更深入的资料,请参阅这里的“模型评估和选择”章节(引用内容的来源):

https://web.stanford.edu/~hastie/Papers/ESLII.pdf


谢谢您再次的帮助!基本上,使用交叉验证可以更好地确保所获得结果不存在统计偏差(或者偏差较小)。此外,这是否是使用交叉验证技术的正确方式? - David
谢谢提供参考资料。 - David
通过使用CV,您可以确保测试误差没有偏差,并降低结果的变异性。至于代码,我使用R,所以我不是完全确定,但这似乎相当不错。 - Clement Lombard
嗨,我刚刚读到为了避免过拟合,应该减少方差并增加偏差。这是否意味着 TTS 将会更受青睐? - David
2
是的,你需要将数据分成K个集合,然后在K-1个集合上进行训练,在剩余的一个集合上进行测试。你需要重复这个过程K次,每次更换测试集,以便最终每个集合都会成为一次测试集和K-1次训练集。 然后,你需要对K个结果取平均值,得到K-Fold CV的结果。 - Clement Lombard
显示剩余3条评论

3
交叉验证的作用是在您的数据中应用选择偏差校正。因此,例如,如果您专注于AUC指标并在TTS方法中获得较低的AUC分数,则意味着您的TTS中存在偏差。
您可能需要进行分析以确定此偏差(例如,可以更加关注日期特征(确保不使用未来预测过去),或者尝试查找与业务逻辑相关的任何数据泄漏)。
总的来说,得分上的差异似乎不太值得担心。所以,代码看起来还可以,这种得分差异是可能的。
顺便说一下,您没有描述问题/数据,但是您使用了分层k折交叉验证,因此我假设您有一个不平衡的数据集,但如果没有,有序k折交叉验证可能值得一试。在TTS中,您没有实现类平衡,但是Stratified CV已经完成了此任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接