为啥交叉验证结果显示高准确率而存在过度拟合?
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,这似乎是解决方案)以上是关于为啥交叉验证结果显示高准确率而存在过度拟合?的主要内容,如果未能解决你的问题,请参考以下文章