机器学习/深度学习中常见的衡量指标


前言 本文主要介绍了机器学习/深度学习中常用模型指标

​ —- (参考博客)

1. 混淆矩阵

在机器学习领域和统计分类问题中,混淆矩阵是可视化工具,特别用于监督学习,在无监督学习一般叫作匹配矩阵。矩阵的每一列代表一个类实例预测,而每一行表示一个实际的类的实例。如下表所示是一个三分类系统的预测结果(主对角线的值表示系统预测正确,对角线以外的值表示系统预测错误)

    实际的类别    
   
预测的类别 15 12 8
  11 13 10
  9 12 16

在预测分析中,混淆矩阵通常是具有两行两列的表,如下。

    实际的类别  
    Positive(正样本/阳性) Negative(负样本/阴性)
预测的类别 Positive(真) True
实际为正类
预测为正类
False
实际为负类
预测为正类
  Negative(假) False
实际为正类
预测为负类
True
实际为负类
预测为负类

很多评价指标都源自于上表的简化版(下表)

    实际的类别  
    Positive Negative
预测的类别 Positive TP FP
  Negative FN TN

一般而言,系统的TP和TN越高,FP和FN越低越好,这表示系统可以准确地区分正负样本。

2. 准确率(Accuracy)

准确率是表征混淆矩阵中正对角线上被正确分类的样本之和占总样本的比率。

    实际的类别  
    Positive Negative
预测的类别 Positive TP FP
  Negative FN TN

​ $Accuracy = \frac{TP+TN}{TP+FP+TN+FN}$, 也即$Accuracy = \frac{TP+TN}{样本总数}$

3. 精确率(查准率,Precision)

精确率定义为,从模型预测的角度上看,在所有预测为正样本中,标签与真实样本同为正样本的比例,表示模型对于预测正确的置信度。(在下表中,TP占该行的比例,横着看)

    实际的类别  
    Positive Negative
预测的类别 Positive TP FP
  Negative FN TN

​ $Prcision = \frac{TP}{TP+FP}$

4. 召回率(查全率,Recall)

召回率定义为,从真实标签的角度上看,在所有的正样本中,被模型正确地预测为正样本所占的比例

(在下表中,TP占该列的比例,竖着看)

    实际的类别  
    Positive Negative
预测的类别 Positive TP FP
  Negative FN TN

​ $Recall= \frac{TP}{TP+FN}$

5. F1得分(调和精确率与召回率)

观察PrecisionRecall的公式,可以看出这两个公式的分子都相同(同为TP),其计算都是围绕着正样本的预测性能来计算的,同时PrecisionRecall之间存在不可调和的矛盾(由于分类阈值的不同,FPFN的值不同),如下表所示:

样本编号 真实类别 模型预测值 阈值为0 阈值为0.9
1 1 0.9 1 1
2 1 0.8 1 0
3 1 0.7 1 0
4 1 0.6 1 0
5 1 0.5 1 0
6 1 0.4 1 0
7 0 0.3 1 0
8 0 0.2 1 0
9 0 0.1 1 0
10 0 0.05 1 0

当阈值为0时,预测结果如下表所示

阈值为0   实际的类别  
    Positive Negative
预测的类别 Positive 6 4
  Negative 0 0

Precision = 6 / (6 + 10) = 0.6

Recall = 6 / (6 + 0) = 1

当阈值为0.9时,预测结果如下表所示

阈值为0.9   实际的类别  
    Positive Negative
预测的类别 Positive 1 0
  Negative 5 4

Precision = 1 / (1+ 0) = 1

Recall = 1 / (1 + 5) = 0.33

分析上述结果,可以得到以下结论:

为了调和PrecisionRecall的之间的矛盾,将引入F1指标来综合反映模型的性能:

​ $\frac{2}{F1} = \frac{1}{Precision} + \frac{1}{Recall}$, $F1=\frac{2 * Prcision * Recall}{Prcision + Recall}$

此外,还有一个更通用的计算$F_\alpha$值得公式

$F_\alpha=\frac{1+\alpha^2}{\alpha^2Prcision + Recall}Prcision * Recall$

当$\alpha=1$时,即为F1。

6. 真阳性率 - TPR(真正率)

真阳性率TPR(True Positive Rate)定义为预测正确的正样本占实际正样本的比例(给定数据集标签后,统计出正样本个数即可作为分母):

​ $TPR= \frac{TP}{TP+FN}$

可以发现,TPR=Recall

    实际的类别  
    Positive Negative
预测的类别 Positive TP FP
  Negative FN TN

7. 假阳性率 - FPR(假正率)

假阳性率 - FPR(False Positive Rate)预测错误的正样本占实际负类的比例(给定数据集标签后,统计出负样本个数即可作为分母

​ $FPR= \frac{FP}{TP+FN}$

    实际的类别  
    Positive Negative
预测的类别 Positive TP FP
  Negative FN TN

对比TPR和FPR的计算公式可知,其分母要么是全部的正样本,要么是全部的负样本,增加正样本的个数,不会影响FPR的计算,反之依然,二者互不干扰,因此 常说TPR和FPR对于样本不平衡不敏感

8. KS

KS(Kolmogorov-Smirnov)值,计算公式如下,KS能够反映出模型最优的区分效果,以及对应的阈值:

​ $KS = max(TPR - FPR)$

9. 灵敏度 - Sensitivity

计算结果与TPR, Recall相同。在医学诊断中,“阳性”可以表示“染病”,“阴性”可以表示“健康”。

包括医学诊断检验的许多测试中,灵敏度是指真阳性没有被忽视的程度(所以伪阴性很少),而特异度是真阴性确实鉴别的程度(所以伪阳性很少)。因此,一个高灵敏度的检验很少忽略真阳性(例如:即使有异常仍然检验为无异常);而高特异度检验则很少将不是检验目标的其他东西鉴别为阳性(例如:检验出一种非常相似的细菌却将其误判为目标细菌)。一个高灵敏度高特异度的检验表示其两方面都做得好,所以这个检验“很少忽略它正在寻找的目标并且很少将其他东西误判为目标。”

10. 特异度 - Specificity

特异度的计算如下图所示:

​ $特异度 = \frac{TN}{FP + TN}$

    实际的类别  
    Positive Negative
预测的类别 Positive TP FP
  Negative FN TN

特异度 = TN / (TN + FP) = 1 - FPR

从点到线 - ROC曲线

由于混淆矩阵是在确定了一个阈值后生成的,因此,利用不同的阈值就可以得到多组(FPR, TPR)点,将这些点依次连接起来,就构成了ROC曲线(没有必要先遍历阈值,如从0~1之间,将阈值切分1000等分,可以直接根据样本预测值从大到小排序,依次遍历样本即可,得到数据中的阈值),受试者工作特征曲线ROC曲线的横坐标是FPR,纵坐标是TPR。

下面通过一个论文中的一个例子来说明ROC是怎么画出来的,数据如下,一共20个样本,正样本10个,负样本10个,每个样本具有不同的模型预测值(得分),根据模型预测值从大到小进行排序;

Inst # Class Score Inst# Class Score
1 p .9 11 p .4
2 p .8 12 n .39
3 n .7 13 p .38
4 p .6 14 n .37
5 p .55 15 n .36
6 p .54 16 n .35
7 n .53 17 p .34
8 n .52 18 n .33
9 p .51 19 p .30
10 n .505 20 n .1

ROC曲线流程:假定L为带标签和模型预测值的数据集,其中正样本个数为P,负样本个数为N,样本$i$的模型分记为$f(i)$,用$R$存放(FPR, TPR)点:

  1. 根据模型预测值对数据集L进行从大到小排序,得到$L_{sort}$,第一个样本记为$i=1$,由于TPR和FPR的分母已知,故只需要初始化分子TP,FP为0,模型预测值的阈值初始化为$f_{pre}=\infin$;

  2. 依次对$L_{sort}$的样本进行遍历:

    2.1)如果满足$f(i)\neq f_{pre}$(相邻样本的模型预测值取值不相同),则$R.append(\frac{FP}{N},\frac{TP}{P})$,更新

    $f(i)=f_{pre}$;

    2.2)如果$L_{sort}[i]$的真实标签和预测标签都为正样本,那么$TP = TP + 1$,否则$FP = FP + 1$更新样本下标$i=i+1$;

  3. 将最后一个点加入到$R.append((1,1))$

有了上述的计算流程,对于上述数据,前几个点的FPR,TPR取值如下:

  1. 当阈值为$\infin$,显然TP=0,FP=0,(0,0),计算过程:
    • 对于FPR和TPR处处相等,那么ROC会是一条直线(理解为,模型会将一半的正样本,负样本预测错误,相当于随机猜测了);
    • 对于点(1,1),阈值为$-\infin$,由于样本模型预测值子啊[0,1]之间,那么所有样本被预测为正样本(混淆矩阵第二行全为0),TP=P(正样本个数),FP=N(负样本个数)。
    • 对于点(0,0),阈值为$\infin$,所有样本都被预测为负样本(混淆矩阵第一行全为0),TP=0,FP=0;
    • 阈值越小时,召回率\TPR就越高,FPR也越高。
  2. 遍历第一个样本,阈值设置为0.9,将样本预测值标签设为正,和真实标签都为正样本,因此$TPR=\frac{1}{10} = 0.1, FPR = 0, (0,0.1)$;
  3. 遍历到第二个样本,阈值设置为0.8,$TPR=\frac{2}{10} = 0.2, FPR = 0, (0,0.2)$;
  4. 遍历到第三个样本,阈值设置为0.7,将样本预测值标签设为正,和真实标签不同,$FP=1,TPR=\frac{2}{10} = 0.2, FPR = \frac{1}{10}, (0.1,0.2)$;

最终整个ROC曲线如下图所示:

由于样本个数有限,可以发现ROC曲线其实是一个阶跃形状,了解到这一点,有助于计算ROC曲线下的面积(AUC)。

从点到线 - PRC曲线

Precision - Recall 曲线,简称PRC,其横坐标为Recall,纵坐标为Precision,曲线的绘制方式与ROC类似。

ROC - AUC (ROC曲线下的面积)

计算方式1

AUC是ROC曲线下的面积,直接根据整个定义,对ROC计算流程进行简单改进,就可以得到AUC的计算流程:

其中上述$TRAPEZOID(X_1,X_2,Y_1,Y_2)$是计算梯形面积的过程:

$base = X_1 - X_2 $

$height = \frac{Y_1+Y_2}{2}$

$area = base \times height$

计算方式2

AUC实际上是模型将正样本排在负样本前面的概率,随机从正负样本中分别选出一个样本,构成样本对,样本对中正样本的模型预测值大于负样本模型预测值的占比,即为AUC

sklearn计算的接口

接口 说明
confusion_matrix 计算混淆矩阵来评估分类的准确性
accuracy_score 模型准确度(Accuracy)
f1_score 计算F1得分
precision_recall_curve 针对不同的概率阈值计算精度(precision),召回率对
precision_score 计算精确度
recall_score 计算召回率
roc_auc_score 计算特征曲线(ROC AUC)下预测分数的计算区域
roc_curve 计算ROC

总结

Table of Contents