在机器学习中,二分类 (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