如何使用交叉验证检测过拟合:差异阈值应该是多少?

Posted

技术标签:

【中文标题】如何使用交叉验证检测过拟合:差异阈值应该是多少?【英文标题】:How to detect overfitting with Cross Validation: What should be the difference threshold? 【发布时间】:2020-03-22 14:31:28 【问题描述】:

在建立分类模型后,我通过准确率、精确度和召回率对其进行了评估。为了检查过度拟合,我使用了 K 折交叉验证。我知道,如果我的模型分数与我的交叉验证分数相差很大,那么我的模型就过拟合了。但是,我坚持如何定义阈值。就像分数的差异实际上会推断出模型过度拟合。例如,这里有 3 个拆分(3 Fold CV,shuffle= True,random_state= 42)以及它们在 Logistic 回归模型上的各自得分:

Split Number  1
Accuracy= 0.9454545454545454
Precision= 0.94375
Recall= 1.0

Split Number  2
Accuracy= 0.9757575757575757
Precision= 0.9753086419753086
Recall= 1.0

Split Number  3
Accuracy= 0.9695121951219512
Precision= 0.9691358024691358
Recall= 1.0  

直接训练没有 CV 的 Logistic Regression 模型:

Accuracy= 0.9530201342281879
Precision= 0.952054794520548
Recall= 1.0

那么我如何决定我的分数需要变化多少才能推断出过度拟合的情况?

【问题讨论】:

【参考方案1】:

我假设您使用的是Cross-validation:

这将拆分您的训练和测试数据。

现在你可能已经实现了类似的东西:

from sklearn.model_selection import cross_validate
from sklearn.metrics import recall_score
scoring = ['precision_macro', 'recall_macro']
clf = svm.SVC(kernel='linear', C=1, random_state=0)
scores = cross_validate(clf, iris.data, iris.target, scoring=scoring,cv=5)

所以现在您只计算测试分数,这在所有 3 种情况下都非常好。

第一个选项是:

return_train_score 默认设置为 False 以节省计算 时间。要评估训练集的分数,您还需要 设置为真

您还可以在此处查看折叠的训练分数。如果您会看到训练集的准确度为 1.0,那么这就是过度拟合。

另一个选项是: 进行更多拆分。那么你可以确定算法没有过拟合,如果每个测试分数都具有很高的准确率,那么你做得很好。

您是否添加了基线?我会假设它是二元分类,并且我感觉数据集高度不平衡,因此 0.96 的准确度通常可能不是那么好,因为您的虚拟分类(始终为一类)将具有 0.95 的准确度。

【讨论】:

我的火车分数是 0.99710 但是,它是一个基于 Bag of Word 特征运行的分类模型,用于评论分析。课堂上也没有不平衡。对于正面和负面情绪,桶大小分别为 400 和 30。那么,上面的训练分数是否推断出过度拟合?

以上是关于如何使用交叉验证检测过拟合:差异阈值应该是多少?的主要内容,如果未能解决你的问题,请参考以下文章

在调整参数时识别交叉验证的 SVM 中的过拟合

,带你明白什么是过拟合,欠拟合以及交叉验证

交叉验证iris数据集

交叉验证iris数据集

什么是过拟合,如何避免?

这个分类模型是不是过拟合?