sklearn的metrics.accuracy_score结果似乎错误

时间:2018-08-02 17:40:34

标签: machine-learning scikit-learn

代码如下:

xtrain, xtest, ytrain, ytest = train_test_split(xx, yy, test_size=0.50)

clf = MultinomialNB(alpha=1.0)
clf.fit(xtrain, ytrain)

predictions = clf.predict(xtest)
print 'score:', metrics.accuracy_score(ytest, predictions)

标准的东西,但这就是问题所在。正如您在下面看到的那样,分数太高了。实际结果(未显示代码,但这只是预测与Y列的基本报告)是该类中预测有3,621行。其中,只有299个实际上是(真实阳性)。绝对没有99%的准确性。

score: 0.9942950664902702

num rows: 644004
  Y == 1: 651
  picked: 3621 | true positives: 299 | false positives: 3322

我不想将其标记为专门与MultinomialNB相关,因为我发现RandomForestClassifier给出相同的结果。问题(或我的问题)似乎与评分功能本身有关。

1 个答案:

答案 0 :(得分:1)

这听起来像是教科书示例,说明了准确性对于严重失衡的数据集没有意义

您提供的汇总统计数据清楚表明您的(测试)数据集严重失衡:在644004个样本中,只有651个属于阳性类别,或者只是 0.1%(我敢打赌您的训练集的组成是相似的。

在这种情况下,很容易证明您获得的准确性确实是现实的(仅是没有意义的);从准确性的定义:

  

acc = (correctly classified samples)/(total samples)

     

= (total samples - FP - FN)/(total samples)

忽略您不提供任何信息的假阴性(FN),我们得到:

(644004 - 3322)/644004
# 0.9948416469462923

,正如所期望的,它仅略高于您报告的准确性(因为我没有考虑到假阴性-FN-,您也肯定会得到它),但仍在99%的范围内。最重要的是您的准确度是正确的,但是没用(即不会告诉您有关模型的任何有用信息)。


您应该开始搜索“类不平衡”,它是一个单独的(且巨大的)子主题,具有其自身的特点。直觉上讲,准确性在这里是没有意义的,因为正如您自己的数据清楚地表明的那样,在数据上训练的分类器中,阳性类别(通常是感兴趣的类别)仅占所有样本的〜0.1%可以报告只需将每个样本归类为阴性类别,就可以达到99.9%的准确度(这并不是这里所发生的事情,但希望您能理解)。特殊的方法和不同的指标(精度,召回率,F1得分等)适用于不平衡的数据集。...