分类器性能评价
上回说到为S(x)选取阈值ST,在此之前我们先引入评价一个分类器性能的指标。因为阈值的选取是与性能指标密切相关的。
用C(x)表示一个分类器,对于一个样本Xi,它输出+1或者-1。输出+1表示判别为正样本,-1表示判别为负样本。
测试数据有P个正样本,N个负样本,根据分类器C的输出统计出下表。其中TP表示正样本输出+1的个数,FP表示负样本输出为+1个数。
| 实际类别 | |
分类器输出 | +1 | -1 |
+1 | TP | FP |
-1 | FN | TN |
通常我们可以定义指标包括:
(1)准确率,表示C输出+1的样本中实际为正样本的比例,即
Precision = TP/(TP+FP)
(2)召回率,表示正样本被C输出+1的比例,即
Recall = TP/(TP+FN)
(3)虚警率,也叫错误接受率,表示负样本被C输出为+1的比例,英文可以用False alarm/acceptance/positive rate,计算如下
FalseAlarmRate =FP/(FP+TN)
(4)拒绝率,表示正样本被C输出为-1的比例,即
RejectRate = FN/(TP+FN)
(5)F1-score,用一个指标衡量分类器C的性能,由准确率和召回率计算得来,值越大说明性能越好,计算如下:
F1 = 2*Precision*Recall /( Precison + Recall )
一般而言,可以用准确率和召回率来反映分类器的性能,二者的值都是越高越好,也可以计算出F1-score来表示。召回率和拒绝率只需给出一个,二者的和为1。
多数情况下一个分类器C的Precision和Recall是此起彼伏的关系,例如要求Precision高,也就是让分类器C对输出+1的门槛提高,虚警率低,则Recall就会低,因为门槛提高了会导致能通过C的正样本数目减少。
阈值的选取
再回到前面的问题上来,如何为S(Xi)选取合适的ST值来形成分类器?
我们的选择是让Recall为一个比较高的值例如Recall=0.995,也就是让0.995的正样本都要能够通过分类器,被判别为+1。
此外我们还设置一个相对较高的FalseAlarmRate=0.5,也就是允许分类器把一半的负样本错判为正样本。
有人肯定在想,为什么设置这么高的虚警率,设置低一些多好。前面我们说过这是一个两难的问题,选择了高的Recall,也就是相当于降低门槛,难免会有更多的负样本也通过门槛,也就是FalseAlarmRate变高。
虽然我们集合了多个弱分类器的输出,仍然不能达到这样的性能。
好了,既然已经设定了性能指标,继续看如何选取合适的阈值ST。
把P个正样本的S(x)值计算出来,形成数组S[P],对数组S[P]进行从小到大排序。因为已经设置了Recall值,也就是要确保数组S[P]的值有Recall比例是大于ST的,显然阈值ST应该选取为ST=S[P*(1-Recall)],因为从P*(1-Recall)后面的值都比它大。
得到ST后就可以构造分类器H(x)
H(x) = S(x) > ST ? +1 :-1
计算H(x)在负样本集上的虚警率值falsealarm,低于设置FalseAlarmRate则停止构造更多的弱分类器。
我们把最后得到的H(x)叫做一个强分类器,Strong classifier。