为啥交叉验证结果显示高准确率而存在过度拟合?

Posted

技术标签:

【中文标题】为啥交叉验证结果显示高准确率而存在过度拟合?【英文标题】:Why cross validation result shows high accuracy while there is overfitting?为什么交叉验证结果显示高准确率而存在过度拟合? 【发布时间】:2016-07-02 06:54:45 【问题描述】:

我正在使用随机树算法来解决二元分类问题。训练集包含 70k 个值作为“0”类,只有 3k 个作为“1”。此外,X_test 的预测结果应该给出相同数量的“0”和“1”。

clf = RandomForestClassifier(random_state=1, n_estimators=350, min_samples_split=6, min_samples_leaf=2)
scores = cross_validation.cross_val_score(clf, x_train, y_train, cv=cv) 
print("Accuracy (random forest): +/-".format(scores.mean(), scores.std()))

准确度(随机森林):0.960755941369/1.40500919606e-06

clf.fit(x_train, y_train)
prediction_final = clf.predict(X_test) # this return Target values: 76k Zeroes and only 15 ones 


#x_test is 10% of x_train set
preds_test = clf.predict(x_test)
print "precision_score", precision_score(y_test, preds_final)
print "recall_score", recall_score(y_test, preds_final)  

precision_score 0.0; 召回分数 0.0

confusion_matrix [[7279 1] [322 0]]

据我所知,存在过拟合问题,但为什么交叉验证没有检测到呢?甚至标准偏差也非常低。那么我该如何解决这个问题呢?

附:我尝试用“0”取 3k 行,用“1”取 3k 行——作为训练集,模型要好得多,但这不是解决方案。

【问题讨论】:

precision_score 0.0; recall_score 0.0 这肯定会敲响你的警钟。你检查过训练集和测试集是否合理? @cel 实际上这些套组取自 kaggle 比赛,这就是为什么它们是合理的。关键是我不知道如何处理他们 你看过混淆矩阵了吗? 【参考方案1】:

(总体)准确度对于像您这样的不平衡数据集几乎是无用的度量,因为它计算正确预测的百分比。在您的情况下,想象一个分类器什么都不会学习,但总是预测“0”。由于您有 70k 个零且只有 3k 个零,因此该分类器的准确度得分将达到 70/73 = 95.9%

检查Confusion Matrix 通常有助于披露这样的“分类器”。

因此,您绝对应该使用另一种度量来量化分类质量。 平均准确度是一个选项,因为它计算所有类的平均准确度。在二进制分类的情况下,也称为Balanced Accuracy,计算结果为(TP/P + TN/N)/2,所以上面想象的分类器总是预测“0”,只会得分(100% + 0%) / 2 = 50%。但是,该措施似乎未在scikit-learn 中实施。虽然您可以自己实现这样的评分功能,但使用其他predefined scorers 之一可能会更容易和更快。

例如,您可以通过将scoring = 'f1' 传递给cross_validation.cross_val_score 来计算F1 Score 而不是准确度。 F1 分数同时考虑了准确率和召回率。

【讨论】:

现在我明白了,我知道precision_score和recall,但忘记了F1 Score,这似乎是解决方案)

以上是关于为啥交叉验证结果显示高准确率而存在过度拟合?的主要内容,如果未能解决你的问题,请参考以下文章

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

KFold 交叉验证不能修复过度拟合

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

如何使用 GridSearchCV 测试回归交叉验证中的过度拟合?

为啥我的交叉验证始终比训练测试分割表现更好?

如何同时使用交叉验证和提前停止?