python - 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 给出了相同的结果。问题(或我的问题)似乎与评分功能本身有关。
解决方案
这听起来像是一个教科书示例,说明为什么准确性对于严重不平衡的数据集没有意义。
从您提供的汇总统计数据中可以清楚地看出您的(测试)数据集严重不平衡:在 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 分数等)适用于不平衡的数据集......
推荐阅读
- python - Tkinter窗口到pdf
- python - 将数据从 I2C 传感器发送到本地 SQL 数据库的 Python 代码
- excel - 在Visual Basic中从位置到结尾删除字符串的一部分
- spring - 向 Spring Boot 应用程序添加网关功能
- javascript - Angular 自动转义 HTML
- dockerfile - yaml:第 8 行:没有找到预期的密钥
- c - 警告:从不兼容的指针类型 const int (*)[3] 分配给 int **
- python - 使用 PyPy 时 DeepCopy 很慢
- python - 在python中使用for循环迭代的有序多线程
- vue.js - vuejs中的分页?