以下是代码:
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.9942950664902702num rows: 644004 Y == 1: 651 picked: 3621 | true positives: 299 | false positives: 3322
我不想将这个问题特意标记为与MultinomialNB相关,因为我发现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分数等)…