首页 > 解决方案 > sklearn 的 metrics.accuracy_score 的结果似乎是错误的

问题描述

这是代码:

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 列的基本报告)是预测有 3621 行在类中。其中,只有 299 个实际上是(真正的阳性)。没有什么能比得上 99% 的准确率。

score: 0.9942950664902702

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

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

标签: pythonmachine-learningscikit-learn

解决方案


这听起来像是一个教科书示例,说明为什么准确性对于严重不平衡的数据集没有意义

从您提供的汇总统计数据中可以清楚地看出您的(测试)数据集严重不平衡:在 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 分数等)适用于不平衡的数据集......


推荐阅读