机器学习--02算法--06分类器的性能评估

本文介绍分类器的性能评估,不同于回归器的性能评估方式–准确率,分类器有自己的评估方式

一、准确率(Accuracy)

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

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

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

其中,cv=3表示3折。

二、混淆矩阵

在这里插入图片描述

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

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

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值,精确率和召回率要同时高。
F 1 = 2 1 p r e c i s i o n + 1 r e c a l l = 2 ∗ p r e c i s i o n s r e c a l l p r e c i s i o n + r e c a l l = T P T P + F N + F P 2 F_1=\frac{2}{\dfrac{1}{precision}+\dfrac{1}{recall}}=\frac{2*precisionsrecall}{precision+recall}=\frac{TP}{TP+\dfrac{FN+FP}{2}} F1=precision1+recall12=precision+recall2precisionsrecall=TP+2FN+FPTP

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曲线。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值