机器学习:图文详解模型评估指标ROC/AUC

模型训练好,必须要通过各种指标去衡量模型的好坏,也就是模型的泛化能力。模型的评估指标有很多,笔者在刚开始学习的时候,也是搞得焦头烂额,有时候自己理解了,但又很难跟别人解释清楚,所以写下这边文章。本文主要介绍分类的模型的各种评估指标以及ROC和AUC。

1.混淆矩阵

对于二分类的模型,预测结果与实际结果分别可以取0和1。我们用N和P代替0和1,T和F表示预测正确和错误。将他们两两组合,就形成了下图所示的混淆矩阵(注意:组合结果都是针对预测结果而言的)。

P(Positive):代表1
N(Negative):代表0
T(True):代表预测正确
F(False):代表错误

混淆矩阵

TP:预测为1,预测正确,即实际1
FP:预测为1,预测错误,即实际0
FN:预测为0,预测错确,即实际1
TN:预测为0,预测正确即,实际0

2.准确率

准确率的定义是预测正确的结果占总样本的百分比

公式:准确率=(TP+TN)/(TP+TN+FP+FN)
即,绿色部分和 / ( 绿色部分和 + 红色部分和 )
无

实际应用场景中,由于样本不平衡的问题,导致了得到的高准确率结果含有很大的水分。即如果样本不平衡,准确率就会失效。这样就衍生出了另外两个指标:精准率和召回率。

3.精准率

精准率(Precision)又叫查准率,是指在所有被预测为正的样本中实际为正的样本的概率

公式:精准率=TP/(TP+FP)
即,绿色部分 / ( 绿色部分 + 红色部分)
在这里插入图片描述

4.召回率

召回率(Recall)又叫查全率,是指在实际为正的样本中被预测为正样本的概率

公式:召回率=TP/(TP+FN)
即,绿色部分 / (绿色部分 + 红色部分)
在这里插入图片描述

以信用卡逾期为背景,召回率越高,代表实际逾期用户被预测出来的概率越高,它的含义类似:宁可错杀一千,绝不放过一个。所以召回率的提高,往往意味着精准率的下降。

5.F1分数

前面提到,召回率和精准率,也称查全率和查准率,这两个指标,我们希望他们同时都很高,但是事与愿违,他们是对立的、矛盾的,这就要我们去取舍,找到一个平衡点,这就是F1分数。

F1分数找到一个平衡点,让查全率和查准率同时达到最大值。

公式:F1 = 2 * 查准率 * 查全率 / (查准率 + 查全率)

扫描二维码关注公众号,回复: 4596920 查看本文章

6.灵敏度、特异度、真正率、假正率

灵敏度(Sensitivity) = TP/(TP+FN),即实际为正样本预测成正样本的概率
特异度(Specificity) = TN/(FP+TN),即实际为负样本预测成负样本的概率

真正率(TPR) = 灵敏度 = TP/(TP+FN),即实际为正样本预测成正样本的概率
假正率(FPR) = 1- 特异度 = FP/(FP+TN),即实际为负样本预测成正样本的概率

我们可以看出:
召回率 = 灵敏度 = 查全率 = 真正率 = TPR = TP/(TP+FN)
都是指:实际正样本中预测为正样本的概率

灵敏度/真正率:绿色部分 / (绿色部分 + 红色部分)
在这里插入图片描述

(1-特异度)/假正率:绿色部分 / (绿色部分 + 红色部分)
在这里插入图片描述

我们可以看出:

真正率和假正率这两个指标跟正负样本的比例是无关的。
所以当样本比例失衡的情况下,准确率不如这两个指标好用。

7.ROC曲线

ROC(Receiver Operating Characteristic)曲线,又称接受者操作特征曲线。

在这里插入图片描述
这是百度百科的图片,可以看出,ROC曲线的横坐标是假阳性比值(假正率),纵坐标是真阳性比值(真正率)。
假正率反应了模型虚报的响应程度,真正率反应了模型预测响应的覆盖程度。所以我们希望,假正率越小,真正率越高越好,即虚报的少,覆盖的多。也就是说,TPR越高,FPR越低,模型就越好。反应到ROC图形上,也就是取现越陡峭,越朝着左上方突出,模型效果越好。

8.AUC值

AUC是基于ROC曲线的,被称为曲线下面积(Area Under Curve)

如下图所示:
在ROC曲线图上,如果我们连接对角线,它的面积正好是0.5。对角线的实际含义是:随机判断响应与不响应,正负样本覆盖率应该都是50%,表示随机效果。ROC曲线越陡越好,所以理想值就是1,一个正方形,而最差的随机判断都有0.5,所以一般AUC的值是介于0.5到1之间的。
在这里插入图片描述

9.代码实现ROC/AUC

from sklearn import metrics
from sklearn.metrics import auc 
import numpy as np
y = np.array([1, 1, 2, 2])  
scores = np.array([0.1, 0.4, 0.35, 0.8])  
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
metrics.auc(fpr, tpr) 

0.75

猜你喜欢

转载自blog.csdn.net/opp003/article/details/84592757
今日推荐