代码如下:
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给出相同的结果。问题(或我的问题)似乎与评分功能本身有关。
答案 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得分等)适用于不平衡的数据集。...