【问题标题】: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

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

【问题讨论】:

    标签: python machine-learning classification cross-validation


    【解决方案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。那么,上面的训练分数是否推断出过度拟合?
    猜你喜欢
    • 2016-04-27
    • 2021-06-12
    • 2023-03-27
    • 1970-01-01
    • 2019-09-17
    • 2020-03-26
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多