理论基础(4)分类评价指标

一、二分类问题

阈值调节问题?

image-20220421165422230

  • 准确率 (Accuracy)预测正确的概率(TP+TN)/(TP+TN+FP+FN)
  • 精确率(查准率 Precision ):预测为正的样本中实际为正的样本的概率TP/(TP+FP)
  • 错误发现率(FDR)= 1 - 精确率 = 预测为正的样本中实际为负的样本的概率 【FP/(TP+FP)
  • 召回率(查全率)- Recall实际为正的样本中被预测为正样本的概率TP/(TP+FN)
  • 真正率(TPR) = 灵敏度(召回率) = TP/(TP+FN)
  • 假正率(FPR) = 1- 特异度 = FP/(FP+TN)
  • F1=是准确率和召回率的调和平均值 (2×Precision×Recall)/(Precision+Recall)
  • G-mean \((\mathrm{GM})=\) 是准确率和召回率的几何平均值 \(G-\) mean \(=\sqrt{\text { Recall } \cdot \text { Precision }}\)

image-20220421165436795

1.1 F1

精确率(Precision)和召回率(Recall)之间的关系用图来表达,就是下面的PR曲线。可以发现他们俩的关系是「两难全」的关系。为了综合两者的表现,在两者之间找一个平衡点,就出现了一个 F1分数。

F1=(2×Precision×Recall) /(Precision+Recall)

P意义类似于每通过准确预测得到TP个正例需要TP+FP个预测类别为正例的样本。

R意义类似于每通过成功召回得到TP个正例需要TP+FN个真实类别为正例的样本。

F1度量了给定一批样本,对这一批样本进行预测与召回,最终得到的正例的多少。其中一半的正例是通过预测得到的,一半的正例是通过召回得到的。

有一种把预测所需的预测类别为正例的样本和召回所需的真实类别为正例的样本看作原料,而我们的目标正例样本看作产品的感觉。所以也能解释为什么P跟R其中一者比较低的时候,F1会偏低。因为跟算术平均数不一样,两者不能互相替代,两部分各负责一半。那么加权调和平均Fbeta也可以很好的理解了。

\[ \frac{1}{F_\beta}=\frac{1}{1+\beta^2} \cdot\left(\frac{1}{P}+\frac{\beta^2}{R}\right) \]

各自负责的比例不一样了。因此beta越大,Fbeta越着重考虑召回能力。

1.2 ROC/AUC的概念

(1)灵敏度,特异度,真正率,假正率

在正式介绍ROC/AUC之前,我们还要再介绍两个指标,这两个指标的选择也正是ROC和AUC可以无视样本不平衡的原因。 这两个指标分别是:灵敏度和(1-特异度),也叫做真正率(TPR)和假正率(FPR)。其实我们可以发现灵敏度和召回率是一模一样的,只是名字换了而已。由于我们比较关心正样本,所以需要查看有多少负样本被错误地预测为正样本,所以使用(1-特异度),而不是特异度。

真正率(TPR) = 灵敏度(召回率) = TP/(TP+FN)

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

下面是真正率和假正率的示意,我们发现TPR和FPR分别是基于实际表现1和0出发的,也就是说它们分别在实际的正样本和负样本中来观察相关概率问题。

正因为如此,所以无论样本是否平衡,都不会被影响。还是拿之前的例子,总样本中,90%是正样本,10%是负样本。我们知道用准确率是有水分的,但是用TPR和FPR不一样。这里,TPR只关注90%正样本中有多少是被真正覆盖的,而与那10%毫无关系,同理,FPR只关注10%负样本中有多少是被错误覆盖的,也与那90%毫无关系,

如果我们从实际表现的各个结果角度出发,就可以避免样本不平衡的问题了,这也是为什么选用TPR和FPR作为ROC/AUC的指标的原因。

(2)ROC(接受者操作特征曲线)

ROC(Receiver Operating Characteristic)曲线,又称接受者操作特征曲线。该曲线最早应用于雷达信号检测领域,用于区分信号与噪声。后来人们将其用于评价模型的预测能力,ROC曲线是基于混淆矩阵得出的。

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

(3)AUC的缺陷?

优点:目前普遍认为接收器工作特性曲线(ROC)曲线下的面积—AUC是评估分类模型准确性的标准方法。它避免了在阈值选择过程中假定的主观性,当连续的概率得到的分数被转换为二分类标签时,通过总结整体模型表现,其衡量模型区分正负样本的性能优于通过阈值来判断的其他方法(比如准确率、召回率等)。

  • 忽略了预测的概率值和模型的拟合优度
  • AUC反应了太过笼统的信息。无法反应召回率、精确率等在实际业务中经常关心的指标
  • 对FPR和TPR两种错误的代价同等看待
  • 它没有给出模型误差的空间分布信息
  • 最重要的一点,AUC的misleading的问题

auc仅反应模型的排序能力,无法反应模型的拟合优度;auc很多时候无法直接反应细粒度的和业务目标更相关的metric信息,例如 top k的准确率,召回率等等(例如同auc的模型在不同的区间的预测能力是存在差别的);

1.3、K-S曲线

K-S曲线, 又称作洛伦兹曲线。实际上, K-S曲线的数据来源以及本质和ROC曲线是一致的, 只是ROC曲线是把真 正率 \((T P R)\) 和假正率 \((F P R)\) 当作横纵轴, 而K-S曲线是把真正率 \((T P R)\) 和假正率 \((F P R\) ) 都当作是 纵轴,横轴则由选定的阈值来充当。从 K-S 曲线就能衍生出 \(K S\) 值, \(K S=\max (T P R-F P R)\) ,即是两条曲线 之间的最大间隔距离。

K-S曲线的画法:

  1. 排序: 对于二元分类器来说, 模型训练完成之后每个样本都会得到一个类概率值, 把样本按这个类概率值从大 到小进行排序;
  2. 找阈值: 取排序后前 \(10 \% \times k(k=1,2,3, \ldots, 9)\) 处的值(概率值)作为阈值, 分别计算出不同的 \(T P R\)\(F P R\) 值, 以 \(10 \% \times k(k=1,2,3, \ldots, 9)\) 为横坐标, 分别以 \(T P R\)\(F P R\) 值为纵坐标, 就可以画出两个曲 线,这就是K-S曲线,类似于下图。
  3. KS值:从 K-S 曲线就能衍生出 \(K S\) 值, \(K S=\max (T P R-F P R)\) ,即是两条曲线之间的最大间隔距离。KS值越大 表示模型 的区分能力越强。

img

1.4 Lift曲线

Lift曲线它衡量的是,与不利用模型相比,模型的预测能力“变好”了多少,lift(提升指数)越大,模型的运行效果越好。实质上它强调的是投入与产出比

tip:理解Lift可以先看一下Quora上的一篇文章:What's Lift curve?

Lift计算公式:先介绍几个相关的指标,以免混淆:

  • 准确率 (accuracy, ACC) :

\[ A C C=\frac{T P+T N}{F P+F N+T P+T N} \]

  • 正确率(Precision, PRE), 查准率:

\[ P R E=\frac{T P}{T P+F P} \]

  • 真阳性率(True Positive Rate, TPR),灵敏度(Sensitivity),召回率(Recall):

\[ T P R=\frac{T P}{T P+F N} \]

  • 假阳性率(False Positice Rate, FPR), 误诊率( = 1 - 特异度):

\[ F P R=\frac{F P}{F P+T N} \]

Lift计算公式: \[ L i f t=\frac{\frac{T P}{T P+F P}}{\frac{T P+F N}{T P+F P+T N+F N}}=\frac{P R E}{\text { 正例占比 }} \] 根据以上公式可知, Lift指标可以这样理解: 在不使用模型的情况下, 我们用先验概率估计正例的比例, 即上式子分母部分, 以此作为正例的命中率; 利用模型后, 我们不需要从整个样本中来挑选正例, 只需要从我们预测为正例 的那个样本的子集 \(T P+F P\) 中挑选正例, 这时正例的命中率为 \(P R E\), 后者除以前者即可得提升值Lift 。

Lift曲线:

为了作出LIft曲线,首先引入 depth 的概念: \[ \operatorname{depth}=\frac{T P+F P}{T P+F P+T N+F N} \] 从公式可以看出, depth 代表的是预测为正例的样本占整个样本的比例。

当阈值为 0 时, 所有的样本都被预测为正例, 因此 \(\operatorname{depth}=1\), 于是 \(L i f t=1\), 模型末起提升作用。随着阈值逐 渐增大, 被预测为正例的样本数逐渐减少, depth 减小, 而较少的预测正例样本中的真实正例比例逐渐增大。当阈 值增大至1时, 没有样本被预测为正例, 此时 depth \(=0\), 而 Lift \(=0\) 。由此可见, Lift 与 depth 存在相反方 向变化的关系。在此基础上作出 Lift 图:

img

一般要求, 在尽量大的 depth 下得到尽量大的 Lift, 所以 Lift 曲线的右半部分应该尽量陡峭。

1.5 P-R曲线

  • 精确率(查准率)- Precision :预测为正的样本中实际为正的样本的概率TP/(TP+FP)

  • 召回率(查全率)- Recall实际为正的样本中被预测为正样本的概率TP/(TP+FN)

P-R曲线刻画查准率查全率(召回率)之间的关系,查准率指的是在所有预测为正例的数据中,真正例所占的比例,查全率是指预测为真正例的数据占所有正例数据的比例。查准率和查全率是一对矛盾的度量,一般来说,查准率高时,查全率往往偏低,查全率高时,查准率往往偏低。

在很多情况下,我们可以根据学习器的预测结果对样例进行排序,排在前面的是学习器认为最可能是正例的样本,排在后面的是学习器认为最不可能是正例的样本,按此顺序逐个把样本作为正例进行预测,则每次可计算当前的查全率和查准率,以查准率为y轴,以查全率为x轴,可以画出下面的P-R曲线。

img

如果一个学习器的P-R曲线被另一个学习器的P-R曲线完全包住,则可断言后者的性能优于前者,当然我们可以根据曲线下方的面积大小来进行比较,但更常用的是平衡点或者是F1值。

  • 平衡点(BEP)是查准率=查全率时的取值,如果这个值较大,则说明学习器的性能较好。F1值越大,我们可以认为该学习器的性能较好。
  • F1度量BEP过于简单,这个平衡点是建立在”查准率=查全率“的前提下,无法满足实际不同场景的应用。

我们先来引入加权调和平均: \(F_\beta\) : \[ \frac{1}{F_\beta}=\frac{1}{1+\beta^2}\left(\frac{1}{P}+\frac{\beta^2}{R}\right) \text { 公式 }(1) \] 加权调和平均与算术平均 \(\frac{P+R}{2}\) 和几何平均 \(\sqrt{P+R}\) 相比, 调和平均更重视较小值(这可以从倒数上看出 来)。当 \(\beta=1\), 即F1是基于查准率和查全率的调和平均定义的, \(\mathrm{F} 1\) 的公式如下: \[ \frac{1}{F_1}=\frac{1}{2}\left(\frac{1}{P}+\frac{1}{R}\right) \] 我们把公式求倒数,即可得: \[ F 1=\frac{2 * P * R}{P+R} \] 在一些应用中, 对查准率和查全率的重视程度不同。例如在商品推荐中, 为了尽可能少打扰用户, 更希望推荐的内 容确实是用户感兴趣的, 此时查准率更重要; 而在罪犯信息检索或者病人检查系统中, 更希望尽可能少的漏判, 此 时查全率更重要。F1度量的一般形式是 \(F_\beta\) ,能让我们自定义对查准率/查全率的不同偏好: \[ F_\beta=\frac{\left(1+\beta^2\right) * P * R}{\left(\beta^2 * P\right)+R} \] 其中, \(\beta>0\) 度量了查全率对查准率的相对重要性 (不明白的同学可以回看公式1), \(\beta=1\) 时退化为标准F1, \(\beta>1\) 时查全率有更大影响; \(\beta<1\) 时, 查准率有更大影响。

1.6 对数损失(Log Loss)

AUC ROC考虑用于确定模型性能的预测概率然而, AUC ROC存在问题, 它只考虑概率的顺序, 因此没有考虑模型预测更可能为正样本的更高概率的能力(即考虑了大小, 但没有考虑更高精度)。在这种情况下, 我们可以使用对数损失, 即每个实例的正例预测概率的对数的负平均值。

对数损失 (Logistic Loss, logloss) 是对预测概率的似然估计,其标准形式为: \[ \log \operatorname{loss}=\log P(Y \mid X) \] 对数损失最小化本质是上利用样本中的已知分布, 求解拟合这种分布的最佳模型参数, 使这种分布出现概率最大。

对数损失对应的二分类的计算公式为: \[ \log \operatorname{loss}=-\frac{1}{N} \sum_{i=1}^N\left(y_i \log \hat{y}_i+\left(1-y_i\right) \log \left(1-\hat{y}_i\right)\right), \quad y \in[0,1] \] 其中 \(\mathrm{N}\) 为样本数, \(\hat{y}_i\) 为预测为 1 的概率。对数损失在多分类问题中也可以使用,其计算公式为: \[ \log \operatorname{loss}=-\frac{1}{N} \frac{1}{C} \sum_{i=1}^N \sum_{j=1}^C\left(y_{i j} \log \hat{y_{i j}}\right), \quad y \in[0,1] \] 其中, \(\mathrm{N}\) 为样本数, C为类别数, logloss衡量的是预测概率分布和真实概率分布的差异性, 取值越小越好。

1.7 多分类

很多时候我们有多个二分类混洧矩阵,例如进行多次训练测试,每次得到一个混淆矩阵;或是在多个数据集上进 行训练测试,希望估计算法的全局性能; 或者是执行分类任务, 每两两类别的组合都对应一个混淆矩阵; 总之是在 \(\mathrm{n}\) 个分类混淆矩阵上综合考察查准率和查全率

  • 宏观: 在各个混淆军阵上分别计算出查准率和查全率, 记为 \((P 1, R 1),(P 2, R 2), \ldots(\mathrm{Pn}, \mathrm{Rn})\), 在计算平均值, 这样 就得到“宏观查准率"(macro-P), “宏观查全率”(macro-R)、“宏观F1"(macro-F1):

\[ \begin{gathered} \text { macro }-P=\frac{1}{n} \sum_{i=1}^n P_i \\ \text { macro }-R=\frac{1}{n} \sum_{i=1}^n R_i \\ \text { macro }-F 1=\frac{2 * \text { macro }-P * \text { macro }-R}{\text { macro }-P+\text { macro }-R} \end{gathered} \]

  • 微观:将个混淆矩阵对应的元素进行平均, 得到TP、FP、TN、FN的平均值, 分别记为 \(\overline{T P} 、 \overline{F P} 、 \overline{F N}\)\(\overline{T N}\), 再基于这些平均值计算出“微观查准率"(micro-P), “微观查全率”(micro-R)、“微观F1"(micro-F1):

\[ \begin{gathered} \text { micro }-P=\frac{\overline{T P}}{\overline{T P}+\overline{F P}} \\ \text { micro }-R=\frac{\overline{T P}}{\overline{T P}+\overline{F N}} \\ \text { micro }-F 1=\frac{2 * \text { micro }-P * \text { micro }-R}{\text { micro }-P+\text { micro }-R} \end{gathered} \]

二、评分总结(sklearn)

sklearn.metrics - 回归/分类模型的评估方法:https://zhuanlan.zhihu.com/p/408078074

2.1 分类模型

accuracy_score

分类准确率分数是指所有分类正确的百分比。分类准确率这一衡量分类器的标准比较容易理解,但是它不能告诉你响应值的潜在分布,并且它也不能告诉你分类器犯错的类型。所以在使用的时候,一般需要搭配matplotlib等数据可视化工具来观察预测的分类情况,与实际的结果做更加直观的比较。

1
2
3
4
5
6
7
8
import numpy as np  
from sklearn.metrics import accuracy_score
y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
accuracy_score(y_true, y_pred) # 默认normalization = True
>>> 0.5
accuracy_score(y_true, y_pred, normalize=False)
>>> 2
recall_score

召回率 =提取出的正确信息条数 /样本中的信息条数。通俗地说,就是所有准确的条目有多少被检索出来了。

1
2
recall_score(y_true, y_pred, labels=None, pos_label=1,average='binary', sample_weight=None)
参数average : string, [None, ‘micro’, ‘macro’(default), ‘samples’, ‘weighted’]

将一个二分类matrics拓展到多分类或多标签问题时,我们可以将数据看成多个二分类问题的集合,每个类都是一个二分类。接着,我们可以通过跨多个分类计算每个二分类metrics得分的均值,这在一些情况下很有用。你可以使用average参数来指定。

  • macro:计算二分类metrics的均值,为每个类给出相同权重的分值。
  • weighted:对于不均衡数量的类来说,计算二分类metrics的平均,通过在每个类的score上进行加权实现。
  • micro:给出了每个样本类以及它对整个metrics的贡献的pair(sample-weight),而非对整个类的metrics求和,它会每个类的metrics上的权重及因子进行求和,来计算整个份额。
  • samples:应用在multilabel问题上。它不会计算每个类,相反,它会在评估数据中,通过计算真实类和预测类的差异的metrics,来求平均(sample_weight-weighted)
  • average:average=None将返回一个数组,它包含了每个类的得分.
roc_curve

ROC曲线指受试者工作特征曲线/接收器操作特性(receiver operating characteristic,ROC)曲线,是反映灵敏性和特效性连续变量的综合指标,是用构图法揭示敏感性和特异性的相互关系,它通过将连续变量设定出多个不同的临界值,从而计算出一系列敏感性和特异性。ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真正例率(也就是灵敏度)(True Positive Rate,TPR)为纵坐标,假正例率(1-特效性)(False Positive Rate,FPR)为横坐标绘制的曲线。

通过ROC我们可以观察到模型正确识别的正例的比例与模型错误地把负例数据识别成正例的比例之间的权衡。TPR的增加以FPR的增加为代价。ROC曲线下的面积是模型准确率的度量,AUC(Area under roc curve)。

TPR = TP /(TP + FN) (正样本预测数 / 正样本实际数

FPR = FP /(FP + TN) (负样本预测数 /负样本实际数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np  
from sklearn import metrics
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)
fpr
>>> array([0. , 0.5, 0.5, 1. ])
tpr
>>> array([0.5, 0.5, 1. , 1. ])
thresholds
>>> array([0.8 , 0.4 , 0.35, 0.1 ])

# check auc score
from sklearn.metrics import auc
metrics.auc(fpr, tpr)
>>> 0.75

# 也可以直接根据预测值+真实值来计算出auc值,略过roc的计算过程
‘’‘
sklearn.metrics.roc_auc_score(y_true, y_score, average='macro', sample_weight=None)
average : string, [None, ‘micro’, ‘macro’(default), ‘samples’, ‘weighted’]
’‘’
# 真实值(必须是二值)、预测值(可以是0/1,也可以是proba值)
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
roc_auc_score(y_true, y_scores)
>>> 0.75
confusion metric

混淆矩阵(confusion matrix),又称为可能性表格或是错误矩阵。它是一种特定的矩阵用来呈现算法性能的可视化效果。其每一列代表预测值,每一行代表的是实际的类别。

1
confusion_matric(y_true, y_pred, labels=None, pos_label=1, average='binary', sample_weight=None)
precision_score
1
precision_score(y_true, y_pred, labels=None, pos_label=1, average='binary')
preview

三、评价指标Q&A

精度指标存在的问题
  • 有倾向性的问题。比如,判断空中的飞行物是导弹还是其他飞行物,很显然为了减少损失,我们更倾向于相信是导弹而采用相应的防护措施。此时判断为导弹实际上是其他飞行物与判断为其他飞行物实际上是导弹这两种情况的重要性是不一样的;
  • 样本类别数量严重不均衡的情况。比如银行客户样本中好客户990个,坏客户10个。如果一个模型直接把所有客户都判断为好客户,得到精度为99%,但这显然是没有意义的。
为什么 ROC 和 AUC 都能应用于非均衡的分类问题?

ROC曲线只与横坐标 (FPR) 和 纵坐标 (TPR) 有关系 。我们可以发现TPR只是正样本中预测正确的概率,而FPR只是负样本中预测错误的概率,和正负样本的比例没有关系。因此 ROC 的值与实际的正负样本比例无关,因此既可以用于均衡问题,也可以用于非均衡问题。而 AUC 的几何意义为ROC曲线下的面积,因此也和实际的正负样本比例无关。

参考文献