KFolds交叉验证与train_test_split

时间:2018-03-06 15:24:49

标签: python machine-learning scikit-learn cross-validation

我今天刚刚建立了我的第一个random forest classifier,我正在努力提高其性能。我正在阅读cross-validation如何避免overfitting数据的重要性,从而获得更好的结果。我使用StratifiedKFold实施了sklearn,但令人惊讶的是,这种方法的准确性较低。我看过很多帖子,建议cross-validatingtrain_test_split更有效率。

估算:

rf = RandomForestClassifier(n_estimators=100, random_state=42)

K-折:

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 个答案:

答案 0 :(得分:3)

很高兴见到你记录了自己!

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

  

在验证方法中,只有观察的一部分 - 那些   包含在训练集中而不是验证中   set - 用于拟合模型。由于统计方法倾向于执行   在训练较少的观察时更糟糕,这表明了   验证集错误率可能倾向于高估测试错误率   适用于整个数据集的模型。

结果可能会有很大不同:

  

验证估算   测试错误率的变化可能是高度可变的,具体取决于   哪些观察结果包含在训练集中以及哪些观察结果   观察结果包含在验证集中

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

此处,您对TTS方法的结果存在更多偏差,在分析结果时应牢记这一点。也许你对Test / Validation set samples

也很幸运

再一次,关于这个话题的更多信息,请参阅一篇精彩的,初学者友好的文章: https://codesachin.wordpress.com/2015/08/30/cross-validation-and-the-bias-variance-tradeoff-for-dummies/

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

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

答案 1 :(得分:2)

交叉验证倾向于对数据中的选择偏差进行校正。所以,例如如果您专注于AUC指标并在TTS方法中获得较低的AUC分数,则意味着您的TTS存在偏差。

您可能希望进行分析以找出这种偏差(例如,您可以更多地关注日期功能(确保您不使用将来预测过去)或尝试在与您相关的数据中发现任何类型的泄漏商业逻辑)

总的来说,分数的差异在我看来并不那么令人担心。所以,代码似乎没问题,分数的这种差异是可能的。

顺便说一下,你无论如何都没有描述问题/数据,但是你使用了Stratified KFold CV,所以我假设你有一个不平衡的数据集,但如果没有,序数KFold CV可能值得尝试。在您的TTS中,您没有实现类平衡,但它是由Stratified CV

完成的