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.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分数等)…

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注