分类器性能评估(混淆矩阵、PR曲线、ROC曲线)

人工智能 机器学习
精确率和召回率之间存在一种折中关系,提高精确率会降低召回率。到底需要较高的精确率还是较高的召回率,不能一概而论,具体场景具体分析。需要找得对就需要高的精确率,也就是想要的一定是好的;不想把想要的漏掉太多,就需要较高的召回率。

大家好,我是Bryce。

这次和大家分享机器学习涉及到的内容——分类器性能评估,包括准确率、精确率、召回率、PR曲线、ROC曲线等。

一、准确率(Accuracy)

准确率并不是一个很好的分类器性能指标,尤其是当处理的数据集存在偏差时(一些类比其他类多得多)。比如有9个苹果和1个香蕉,那我猜测10个都不是香蕉的准确率也高达90%。

在Python中,准确率指标可以使用cross_val_score()函数评估,同时使用K折交叉验证。具体形式如下,其中,cv=3表示3折。

from sklearn.model_selection import cross_val_score
cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring='accuracy')

二、混淆矩阵

图片

如上图所示,混淆矩阵每一行代表一个实际的结果,每一列代表一个预测的结果。分别有TP、FN、FP、TN四种结果,有Accuracy(准确率)、Precision(精确率)、Sensitivity(召回率或灵敏度)、Specificity(特异度)和Negative Predictive Value(反例预测率)5种衡量指标,它们的计算公式如上图。

还是以苹果、香蕉举例子(苹果为正例,香蕉为反例):

  • TP:真正例,把苹果认成了苹果;
  • FN:伪反例,把苹果认成了香蕉;
  • FP:伪正例,把香蕉认成了苹果;
  • TN:真反例,把香蕉认成了香蕉。

Accuracy(准确率):不管正负例,预测对的占多少。

Precision(精确率):找了这么多正例,找对了多少。

Sensitivity(召回率):有这么多正例,找出了多少。

在Python中计算混淆矩阵比较简单,如下:

from sklearn.metrics import confusion_matrix
confusion_matrix(y_train, y_train_pred)

其中,y_train表示训练值,y_train_pred表示预测值。

衡量指标中用的比较多的是精确率和召回率,它们的值可以在计算出混淆矩阵后,按照上图公式计算,也可以直接调用对应的函数。

from sklearn.metrics import precision_score, recall_score
precision_score(y_train, y_train_pred)
recall_score(y_train, y_train_pred)

其中,precision_score表示精确率,recall_score表示召回率。

F1值

F1值结合了精确率和召回率,是它们的调和平均。普通的平均值平等看待所有值,而调和平均会给小的值更大的权重。要想获得一个高的F1值,精确率和召回率要同时高。

图片

from sklearn.metrics import f1_score
f1_score(y_train, y_train_pred)

精确率和召回率之间存在一种折中关系,提高精确率会降低召回率。到底需要较高的精确率还是较高的召回率,不能一概而论,具体场景具体分析。需要找得对就需要高的精确率,也就是想要的一定是好的;不想把想要的漏掉太多,就需要较高的召回率。

某模型的精确率、召回率与阈值的关系曲线如下,横坐标表示算法判断的阈值(大于阈值为正,否则为负):

from sklearn.metrics import precision_recall_curve
precisions, recalls, thresholds = precision_recall_curve(y_train, y_scores) # y_scores是决策分数,不是预测值

图片

从图中就可以看出精确率和召回率之间的博弈关系。

仔细看我们会发现,召回率曲线比较平滑,而精确率曲线在性能较高时会有波动,这表示提高阈值,精确率并不一定会提高。

精确率和召回率之间的关系曲线(PR曲线)如下:

图片

三、ROC曲线

ROC曲线横坐标为FPR(伪正例率),纵坐标为TPR(真正例率,也即召回率),其中FPR=1-TNR,TNR就是特异性。

from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_train, y_scores)

图片

一个评估分类器好坏的方法是:计算ROC曲线下的面积,roc_auc_score()可实现。面积越大,性能越好,从图来看,就是更靠近左上角。(PR曲线应该尽可能的靠近右上角)

from sklearn.metrics import roc_auc_score
roc_auc_score(y_train, y_scores)

PR曲线还是ROC曲线?

当正例非常少或者你更关注伪正例(FP)而不是伪反例(FN)时,你应该选择PR曲线, 反之则是ROC曲线。

本文转载自微信公众号「且听数据说」,作者「Bryce」,可以通过以下二维码关注。

转载本文请联系「且听数据说」公众号。


责任编辑:武晓燕 来源: 且听数据说
相关推荐

2010-09-29 09:55:05

光纤

2023-09-13 14:45:14

性能测试开发

2024-08-23 09:06:35

机器学习混淆矩阵预测

2009-03-05 18:16:13

2023-06-02 22:36:02

鸿蒙弹簧动画曲线

2022-11-03 16:28:00

Javascript平滑曲线

2021-07-27 05:53:00

Chrome浏览器KPI

2022-07-26 15:04:11

表情包卡片JS

2022-08-12 08:25:13

新兴技术Gartner新兴技术成熟曲线

2012-11-22 09:47:34

服务器虚拟化性能评估IOPS

2016-08-04 16:17:48

虚拟化服务器性能鉴定

2009-11-23 15:41:44

Visual Stud

2013-01-24 17:18:30

2019-08-15 07:33:09

2013-06-03 09:24:34

公有云计算亚马逊EC2API

2020-03-12 08:06:03

黑客网络安全网络攻击

2013-12-27 14:16:43

Android开发Android应用线程

2018-07-19 11:45:08

HTML5混合开发Gartner

2015-10-26 17:20:12

2017-09-13 12:10:55

点赞
收藏

51CTO技术栈公众号