模型评估指标(Confusion Matrix、ROC、AUC)

1、选择合适的模型评估指标的依据

通常在模型训练完之后,我们想要查看模型训练的效果以验证模型的好坏,并根据评估结果来继续调整模型的参数、特征或者算法,以达到满意的结果。在回归算法中评价模型好坏的指标很明确主要有:拟合优度R2 ,均方误差MSEMSEMSE,均方根误差RMSE,以及平均绝对误差MAE。

但是,在分类算法中评估模型效果的指标往往就不那么明确了。分类算法的评估指标多种多样,在诸多的评价指标中,大部分指标只能片面的反应模型的一部分性能,如果不能合理的运用评估指标,不仅不能发现模型本身的问题,而且会得出错误的结论。一般分类算法评价一个模型最简单也是最常用的指标就是准确率(Accuracy),但是在没有任何前提下准准确率(Accuracy)往往不能反映一个模型性能的好坏,例如在不平衡的数据集上,正类样本占总数的95%,负类样本占总数的5%;那么有一个模型把所有样本全部判断为正类,该模型也能达到95%的准确率,但是这个模型没有任何的意义。

因此,对于一个模型,我们需要从不同的方面去判断它的性能。在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评价结果;这意味着模型的好坏是相对的,什么样的模型是好的,不仅取决于算法和数据,还决定于任务需求。例如医院中检测病人是否有心脏病的模型,即检测出少数类,那么这个模型的目标是将所有有病的人给检测出来,即使会有许多的误诊也在所不惜(将没病检测为有病);又比如在警察追捕罪犯的模型上,该模型的目标是将罪犯准确的识别出来,而不希望有过多的误判(将正常人认为是罪犯)。

所以不同的任务需求,模型的训练目标不同,因此评价模型性能的指标也会有所差异。

也就是说,单纯地追求捕捉出少数类,就会成本太高,而不顾及少数类,又会无法达成模型的效果。所以在现实中,我们往往在寻找捕获少数类的能力和将多数类判错后需要付出的成本的平衡。如果一个模型在能够尽量捕获少数类的情况下,还能够尽量对多数类判断正确,则这个模型就非常优秀了。为了评估这样的能力,我们将引入新的模型评估指标:混淆矩阵和ROC曲线来帮助我们。

2、混淆矩阵(Confusion Matrix)

混淆矩阵是二分类问题的多维衡量指标体系,在样本不平衡时极其有用。在混淆矩阵中,我们将少数类认为是正例,多数类认为是负例。在决策树,随机森林这些普通的分类算法里,即是说少数类是1,多数类是0。在SVM里,就是说少数类是1,多数类是-1。普通的混淆矩阵,一般使用{0,1}来表示。如图所示:


TP:预测为正样本,实际也为正样本的特征数
FP:预测为正样本,实际为负样本的特征数
TN:预测为负样本,实际也为负样本的特征数
FN:预测为负样本,实际为正样本的特征数

混淆矩阵中,永远是真实值在前,预测值在后。其实可以很容易看出,11和00的对角线就是全部预测正确的,01和10的对角线就是全部预测错误的。基于混淆矩阵,我们有六个不同的模型评估指标,这些评估指标的范围都在[0,1]之间,所有以11和00为分子的指标都是越接近1越好,所以以01和10为分子的指标都是越接近0越好。

2.1 模型整体效果:准确率

准确率是分类问题中最为原始的评价指标,准确率的定义是预测正确的结果占总样本的百分比,通常来说越接近1越好。其公式如下:


但是,准确率评价算法有一个明显的弊端问题,就是在数据的类别不均衡,特别是有极偏的数据存在的情况下,准确率这个评价指标是不能客观评价算法的优劣的。例如下面这个例子:

在测试集里,有100个sample,99个反例,只有1个正例。如果我的模型不分青红皂白对任意一个sample都预测是反例,那么我的模型的准确率就为0.99,从数值上看是非常不错的,但事实上,这样的算法没有任何的预测能力,于是我们就应该考虑是不是评价指标出了问题,这时就需要使用其他的评价指标综合评判了。

2.2 捕捉少数类:精确率(Precision)、召回率(Recall)和F1-score

2.2.1 精准率(Precision)

精准率(Precision) 又叫查准率,它是针对预测结果而言的,它的含义是在所有被预测为正的(少数)样本中实际为正的(少数)样本的概率,意思就是在预测为正样本的结果中,我们有多少把握可以预测正确。其公式如下:


在现实的样本不平衡例子中,当每一次将多数类判断错误的成本非常高昂的时候(比如大众召回车辆的例子,警察追捕罪犯),我们会追求高精确度。精确度越低,我们对多数类的判断就会越错误。当然了,如果我们的目标是不计一切代价捕获少数类,那我们并不在意精确度。

2.2.2 召回率(Recall)

召回率(Recall) 又叫查全率,它是针对原样本而言的,它的含义是在实际为正的(少数)样本中被预测为正(少数)样本的概率,其公式如下:


如果我们希望不计一切代价,找出少数类(比如找出癌症患者),那我们就会追求高召回率,相反如果我们的目标不是尽量捕获少数类,那我们就不需要在意召回率。

注意召回率和精确度的分子是相同的(都是TP(11)),只是分母不同。而召回率和精确度是此消彼长的,两者之间的平衡代表了捕捉少数类的需求和尽量不要误伤多数类的需求的平衡。究竟要偏向于哪一方,取决于我们的业务需求:究竟是误伤多数类的成本更高,还是无法捕捉少数类的代价更高。

2.2.3 P-R曲线(Precision Recall Curve)

P-R曲线(Precision Recall Curve) 正是描述精确率/召回率变化的曲线,P-R曲线定义如下:对于同一个模型,通过调整分类阈值,可以得到不同的P-R值,从而可以得到一条曲线(纵坐标为P,横坐标为R)。通常随着分类阈值从大到小变化(大于阈值认为P),Precision减小,Recall增加。比较两个分类器好坏时,显然是查得又准又全的比较好,也就是的PR曲线越往坐标(1,1)的位置靠近越好。若一个学习器的P-R曲线被另一个学习器完全”包住”,则后者的性能优于前者。当存在交叉时,可以计算曲线围住面积,不太容易判断,但是可以通过平衡点(Break-Even Point,BEP)来判断,当P=R时的取值,平衡点的取值越高,性能更优。。如下图所示:


2.2.4 F1-Score

F1-Score 正如上文所述,Precision和Recall指标有时是此消彼长的,即精准率高了,召回率就下降,在一些场景下要兼顾精准率和召回率,最常见的方法就是F1-Measure,又称F1-Score。F1-Measure是P和R的加权调和平均,即:


2.2.5 sklearn中的混淆矩阵


3、ROC、AUC

ROC以及后面要讲到的AUC,是分类任务中非常常用的评价指标,本文将详细阐述。可能有人会有疑问,既然已经这么多评价标准,为什么还要使用ROC和AUC呢?

因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类别不平衡(Class Imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化,ROC以及AUC可以很好的消除样本类别不平衡对指标结果产生的影响。

另一个原因是,ROC和上面做提到的P-R曲线一样,是一种不依赖于阈值(Threshold)的评价指标,在输出为概率分布的分类模型中,如果仅使用准确率、精确率、召回率作为评价指标进行模型对比时,都必须时基于某一个给定阈值的,对于不同的阈值,各模型的Metrics结果也会有所不同,这样就很难得出一个很置信的结果。

在正式介绍ROC之前,我们还要再介绍两个指标,这两个指标的选择使得ROC可以无视样本的不平衡。这两个指标分别是:灵敏度(sensitivity)和特异度(specificity),也叫做真正率(TPR)和假正率(FPR),具体公式如下。


ROC曲线中的主要两个指标就是真正率TPR和假正率FPR,上面已经解释了这么选择的好处所在。其中横坐标为假正率(FPR),纵坐标为真正率(TPR),下面就是一个标准的ROC曲线图。


以TPR为y轴,以FPR为x轴,我们就直接得到了RoC曲线。从FPR和TPR的定义可以理解,TPR越高,FPR越小,我们的模型和算法就越高效。也就是画出来的RoC曲线越靠近左上越好。如下图左图所示。从几何的角度讲,RoC曲线下方的面积越大越大,则模型越优。所以有时候我们用RoC曲线下的面积,即AUC(Area Under Curve)值来作为算法和模型好坏的标准。

所以总结一下就是TPR越高,同时FPR越低(即ROC曲线越陡),那么模型的性能就越好。

sklearn中的ROC曲线和AUC面积

在sklearn中,我们有帮助我们计算ROC曲线的横坐标假正率FPR,纵坐标Recall和对应的阈值的类sklearn.metrics.roc_curve。同时,我们还有帮助我们计算AUC面积的类sklearn.metrics.roc_auc_score。

sklearn.metrics.roc_auc_score(y_true, y_score, average='macro', sample_weight=None, max_fpr=None, multi_class='raise', labels=None
sklearn.metrics.roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)

举个例子:

from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
area = roc_auc_score(y,clf.decision_function(X))
FPR, recall, thresholds = roc_curve(y,clf.decision_function(X), pos_label=1)

plt.figure()
plt.plot(FPR, recall, color='red',label='ROC curve (area = %0.2f)' % area)
plt.plot([0, 1], [0, 1], color='black',linestyle='--')
plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('Recall')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

此外,至于多分类问题以后遇到了再写。

版权声明:本文为CSDN博主「不会写作文的李华」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40195360/article/details/104834819

最新文章