我今天刚刚建立了我的第一个random forest classifier
,我正在努力提高其性能。我正在阅读cross-validation
如何避免overfitting
数据的重要性,从而获得更好的结果。我使用StratifiedKFold
实施了sklearn
,但令人惊讶的是,这种方法的准确性较低。我看过很多帖子,建议cross-validating
比train_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
这实际上可行吗?或者我错误地设置了我的模型?
另外,这是使用交叉验证的正确方法吗?
答案 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/
有关更深入的来源,请参阅“模型评估和选择” 这里的章节(引用内容的来源):
答案 1 :(得分:2)
交叉验证倾向于对数据中的选择偏差进行校正。所以,例如如果您专注于AUC指标并在TTS方法中获得较低的AUC分数,则意味着您的TTS存在偏差。
您可能希望进行分析以找出这种偏差(例如,您可以更多地关注日期功能(确保您不使用将来预测过去)或尝试在与您相关的数据中发现任何类型的泄漏商业逻辑)
总的来说,分数的差异在我看来并不那么令人担心。所以,代码似乎没问题,分数的这种差异是可能的。
顺便说一下,你无论如何都没有描述问题/数据,但是你使用了Stratified KFold CV,所以我假设你有一个不平衡的数据集,但如果没有,序数KFold CV可能值得尝试。在您的TTS中,您没有实现类平衡,但它是由Stratified CV 完成的