Skip to main content
 首页 » 编程设计

python之为什么交叉验证结果显示准确率很高,但存在过拟合

2025年05月04日15lvdongjie

我正在使用随机树算法来解决二元分类问题。训练集包含 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())) 

Accuracy (random forest): 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; recall_score 0.0

confusion_matrix [[7279 1] [ 322 0]]

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

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

请您参考如下方法:

(总体)准确性对于像您这样的不平衡数据集来说几乎是无用的衡量标准,因为它计算的是正确预测的百分比。在您的情况下,想象一个什么也学不到的分类器,但总是预测“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 .

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