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

我不想将其标记为与多项式NB相关,因为我发现RandomForestClassifier给出了相同的结果。这个问题(或我的问题(似乎与评分函数本身有关。

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

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

最新更新