在机器学习中,二分类 (binary classification) 问题是最常出现且最经典的问题。本文首先解释二分类的样本标签问题,包括正例 (Positive)/反例 (Negative) 和真例 (True)/假例 (False) 这两组集合;紧接着介绍几种常用的分类器评估指标,例如精确度 (precision)、准确率 (accuracy)、敏感性 (sensitivity)、特异性 (specificity)等;最后,讨论对ROC曲线及其衍生的AUC指标的理解,并给出样例。
二分类标签
应用于二分类的样本通常用正例 (Positive, P) 和反例 (Negative, N) 进行标注,作为实际标签。而经过分类器估计后的输出,根据其结果的正确与否,划分为真例 (True, T) 和假 (False, F)两个集合。因此,需要注意的是T
和F
两个集合均包含正例和反例样本。
根据实际标签和预测结果进行两两组合,得到四个子集,分别为真正率 (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
Comment and share