为什么交叉验证结果在过度拟合时显示出高精度?

时间:2016-03-16 11:51:44

标签: python python-2.7 machine-learning scikit-learn random-forest

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

     

confusion_matrix [[7279 1]    [322 0]]

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

P.S。我试图用“0”和3k用“1”取3k行 - 作为训练集,模型要好得多,但这不是解决方案。

1 个答案:

答案 0 :(得分:6)

(总体)准确度对于像您这样的非平衡数据集来说几乎是无用的度量,因为它计算了正确预测的百分比。在你的情况下,想象一个不会学到任何东西的分类器,但总是预测" 0"。由于您有70k零且只有3k,所以该分类器的准确度得分为70/73 = 95.9%

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

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

例如,您可以将scikit-learn传递给scoring = 'f1'来计算F1 Score而不是精确度。 F1得分考虑了精确度和召回率。