KFolds Cross Validation vs train_test_split

今天我构建了我的第一个随机森林分类器,并正在尝试提升它的性能。我读到交叉验证对于避免数据过拟合并获得更好的结果非常重要。我使用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.74Accuracy Score:  74.74 %.Specificity:  0.69Precision:  0.75Sensitivity:  0.79Matthews correlation coefficient (MCC):  0.49F1 Score:  0.77

TTS:

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

这真的可能吗?还是我的模型设置有误?

另外,使用交叉验证的正确方法是这样的吗?


回答:

很高兴看到你做了详细的记录!

这种差异的原因是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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注