在机器学习中,二分类 (binary classification) 问题是最常出现且最经典的问题。本文首先解释二分类的样本标签问题,包括正例 (Positive)/反例 (Negative) 和真例 (True)/假例 (False) 这两组集合;紧接着介绍几种常用的分类器评估指标,例如精确度 (precision)、准确率 (accuracy)、敏感性 (sensitivity)、特异性 (specificity)等;最后,讨论对ROC曲线及其衍生的AUC指标的理解,并给出样例。

二分类标签

应用于二分类的样本通常用正例 (Positive, P) 和反例 (Negative, N) 进行标注,作为实际标签。而经过分类器估计后的输出,根据其结果的正确与否,划分为真例 (True, T) 和假 (False, F)两个集合。因此,需要注意的是TF两个集合均包含正例和反例样本。

根据实际标签和预测结果进行两两组合,得到四个子集,分别为真正率 (True positive, TP)、真反例 (True negative, TN)、假正率 (False positive, FP) 和假反例 (False negative, FN),如下表所示。

预测正例 预测反例
实际正例 TP FN
实际反例 FP TN

通过对这四个子集样本的组合,可以得到一些评估指标,用于评价分类器的表现。这里我想强调一下对FN和FP的理解,其中FN指的是实际为反例,但被分类器判断为正例,而FP指的是实际为正例,但被分类器判断为反例,二者的合集为F

评估指标

下面讨论常用的二分类器的评估指标 (index or measure)。定义为所有的样本数量,对应实际标注为正例和反例的样本数;表示分类器估计的标签中正确和错误的样本数。相应的,定义为TP、TN、FP、FN样本的数目。因此,定义如下的评估指标

  • 准确率 (accuracy)
    准确率为分类器预测结果中判断正确的样本占所有样本的比例,即.

  • 精确度 (precision)
    精确度又称为查准率,衡量分类器预测为正的样本中实际为正例的样本比例,即 .

  • 敏感性 (sensitivity)
    敏感性又称为召回率或真正率,衡量实际为正例的样本经过分类器预测后标记正确的样本所占比例,即.

  • F1-score
    F1-score是对精确度和敏感性的结合,因为这两者本质上是矛盾的,通常敏感性越高则精确度会较低。F1-score的表达式为, .

  • 特异性 (specificity)
    特异性是实际标注为反例的样本经过分类器预测正确的样本的比例,即.

  • 假正率 (fasle positive rate)
    假正率表示分类器预测为反例的样本中实际为反例的样本的比例,即.

对于这些评估指标,我的理解见下表,

评估指标 意义
准确率 衡量了分类器总体上的准确性,不考虑样本的实际类别.
精确度 衡量了正例的分类准确性,通常比准确率要高.
敏感性 衡量了分类器对正例的泛化能力,在异常检测中应用较多.
特异性 衡量了分类器对反例的分类准确性.
假正率 与敏感性类似,衡量分类器对反例的泛化能力.

ROC和AUC

以上的评估指标均要求分类器的输出为确定的标签,而分类器通常输出的是样本被判断为正例的概率,为了得到标签,需要设定概率的门限,即大于该门限的概率对应的样本判断为正例,否则为反例。门限的设定,影响分类器的泛化能力。

因此,人们提出了receiver operating characteristic (ROC) 的概念,最早出现二战时检测敌机的雷达分析技术。在信号处理中,有这样一组指标,即捕获率 (catch rate) 和追踪率 (follow rate),前者衡量了系统对于目标信号的捕获能力,后者衡量系统在捕获信号后继续追踪的能力。这两个指标,对应到二分类问题中就是敏感性或真正率 (truu positive rate, TPR)和假正率。

通过TPR和FRP即可求解ROC曲线。对分类器输出的样本概率进行排序,设定概率门限thrs,将高于该门限的样本判断为正例,反之判断为反例。而后,与实际的样本标签进行比较,计算对应该门限的TPR和FPR。记录不同门限处的TPR和FRP,则得到了该分类器的ROC曲线。

如下为ROC曲线的求解算法,

1
2
3
4
5
6
7
Step1. input labels and probs estimated by classifier;
Step2. set thresholding step
Step3. for thrs = 1.0 : step : 0.0
labels_est = zeros(size(labels))
labels_Est[probs > thrs] = 1
calculate fpr and tpr w.r.t. thrs
Step4. Draw the ROC curve

针对不同的分类器,若某个分类器的ROC曲线整体在其他分类器的上方,则可认为该分类器最优。但往往存在ROC曲线交叉的情形,此时通过计算ROC曲线下方的面积,即AUC (area under curve)值来进行对比,AUC数值越大,分类器的分类效果越好,泛化能力越强。

给出一个ROC曲线和AUC的求解样例,具体的代码实现见这里.

首先,设样本的标签和二分类器输出的概率为,

1
2
labels = [1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0]
probs = [0.5, 0.6, 0.2, 0.9, 0.5, 0.3, 0.1, 0.7, 0.3, 0.9, 0.5]

设定thrs的步长为0.1,则求解的TPR和FPR分别为,

1
2
tpr = [0.0, 0.4, 0.4, 0.4, 0.6, 0.8, 1.0, 1.0, 1.0, 1.0, 1.0]
fpr = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.33, 0.33, 0.67, 0.83, 1.0]

最后,求解得到auc=0.967. 下图为该样例的ROC曲线,

scikit-learn也提供了求解auc的函数,其用法如下,

1
2
3
from sklearn import metrics
fpr, tpr, thresholds = metrics.roc_curve(labels+1, p, pos_label=2)
auc = metrics.auc(fpr, tpr)

在我的notebook中,分别给出了我的实现和sklearn.metrics.auc的实现,二者结果相同。最后吐个槽,因为haroopad的bug,这篇是我重新写的!!!

References

[1] 周志华,机器学习,2017 清华大学出版社
[2] 机器学习和统计里面的auc怎么理解?
[3] sklearn.metrics.auc