性能度量用于判定机器学习的结果好坏程度。在比对不同的模型能力的时候,使用不同的性能度量往往会导致不同的评判结果。

在预测任务中,数据集D={(x1,y1),(x2,y2),···(xk,yk)},yi是xi的真实标记。如果评估学习器f的性能,需将f(x)与yi进行比较。

回归任务常用的性能度量

常用“均方误差”作为回归任务的性能度量

E(f;D)=(1/m){f(x1)-y1)+···+f(xm)-ym)}

更一般的,对于数据分布D和概率密度函数p(x),有

E(f;D)=sum(f(x)-y)2)p(x)dx

分类任务常用的性能度量

错误率和精度

错误率和精度是分类任务中最常用的两种性能度量,既适用于二分类任务,也适用于多分类任务。错误率是分类错误的样本数占总数的比例,精度则是分类正确的样本数占总数的比例。对于数据集D,分类错误率定义为

E(f;D)=l/m
其中l是指所有数据集中,f(xi)!=yi的个数

而精度定义为

acc(f;D)=n/m=1-E(f;D)
其中n是指所有数据集中,f(xi)=yi的个数

更一般的,对于数据分布D和概率密度函数p(x),错误率为

E(f;D)=sum(l(x)p(x))
其中,l(x)取值为0或者1,当f(x)=y时取0,当f(x)!=y时取1

精度为

acc(f;D)=sum(l(x)p(x))=1-E(f;D)
其中,l(x)取值为0或者1,当f(x)=y时取1,当f(x)!=y时取0

查准率、查全率与F1

错误率和精度虽然常用,但是不能满足所有需求。以西瓜问题为例,我们用训练好的模型进行判别,显然,错误率指的是有多少比例的西瓜判别错误,但是我们关心的是“好瓜有多大的比例被挑出来了”或者“挑出来的西瓜有多少是好瓜”,这是就需要用到其他的度量。对于此类问题,“查全率”和“查准率”是更为适合的性能度量。

对于二分类问题,可以根据真实结果和预测结果对整体数据进行划分,分为“真正例”,“假正例”,“假反例”和“真反例”。如下表所示:

真实类别 预测为正例 预测为反例
正例 TP(真正例) FN(假反例)
反例 FP(假正例) TN(真反例)

此表称为“混淆矩阵(confusion matrix)”

查准率P和查全率R分别定义为

查准率P
P=TP/(TP+FP)

查全率R
R=TP/(TP+FN)

一般来说, 查准率高的时候,查全率偏低;查全率高的时候,查准率往往降低。以西瓜问题为例:查准率指的是所有预测为好瓜的西瓜中,真正的好瓜所占的比例;查全率指的是真正的好瓜中,有多少好瓜被挑出来了。

以查准率P为纵轴,查全率R为横轴作图,就得到了查准率-查全率曲线,称为“P-R曲线”

P-R曲线
P-R曲线

在比较两个模型的性能时,如果一个学习器的P-R曲线被另外一个学习器P-R曲线包住,那么后者的性能优于前者,如上图,A的性能优于C,B的性能也优于C;如果两个学习器的曲线有交叉点(如A和B),那么难以断定两个学习器性能的优劣,只能在具体的查准率或者查全率条件下进行比较。

然而,在很多情况下,还是希望将AB做出比较,这时可以对比AB的P-R曲线下面积。但是这个值不太容易估量,因此有其他的性能度量来综合考察查准率和查全率。

平衡点

平衡点(Break-Even Point,简称BEP)指得是“P=R”时候的取值,如上图,C的的BEP是0.64,。基于BEP的比较,可以认为学习器A优于B。

F1度量

BEP过于简单,更常用的是F1度量。

F1=2*P*R/(P+R)=2*TP/(样例总数+TP-TN)

F1是基于查准率和查全率的调和平均定义的

1/F1=1/2*(1/P+1/R)

对于特定的应用场景,查准率和查全率的重视度是不一样的。例如在追捕逃犯时,希望尽可能的不遗漏逃犯,因此查全率较为重要;而在搜索引擎的搜索过程中,希望给用户精准的搜索信息,因此查准率更为重要。F1度量的更一般形式——Fβ

Fβ=(1+β2)*P*R/((β2*P)+R)

其中β>0度量了查全率对查准率的相对重要性β=R/Pβ=1时退化为标准的F1。

有时候我们会有多个混淆矩阵,比如我们做了多次训练。我们希望在n个二分类混淆矩阵上考察查准率和查重率。

一种直接的做法是在各混淆矩阵上分别求出查准率和查全率(P1,R1)···(Pn,Rn),再求其平均,这称之为“宏查准率(macro-P)”、”宏查全率(macro-R)”以及“宏F1(macro-F1)”

另一种做法是先将个混淆矩阵对应元素进行平均,得到TP、FP、TN、FN的平均值,之后根据平均值求“微查准率(micro-P)”、”微查全率(micro-R)”以及”微F1(micro-F1)”

ROC与AUC

分类任务一般是如下流程:经过一定的训练之后,对于测试集的每一个数据,学习器给出相应的输出预测值,然后将这个预测值与某一个阈值(Threshold)进行比较,若大于阈值则为正例,否则为反例。例如,假设学习器输出的预测值范围为[0.0,1.0],阈值为0.7,那么学习器输出预测值大于0.7的为正例,反之则为反例。

实际上,我们可以根据输出预测值进行排序,“最可能”的是正例排在前面,而“最不可能的”排在后面,然后使用阈值作为“截断点”将样本分类。

在不同的场景中,我们可以根据任务需求不一来确定截断点。因此,排序的好坏体现了学习器在不同任务下的“期望泛化性能”的好坏。ROC曲线则是从这个角度出来来研究学习器泛化性能的有力工具。

ROC全称为“受试者工作特征(Receiver Operating Characteristic)”曲线。ROC曲线的纵轴是“真正例率”(True Positive Rate,简称TPR)”,横轴为“假正例率(False Positive Rate,简称FPR)”,两种分别定义为:

真正例率
TPR=TP/(TP+FN)

假正例率
FPR=FP/(TN+FP)

真正例率指的是真实正例中有多少被预测为正例,假正例率指的是真实反例中有多少被预测为正例。

ROC曲线和AUC示意图
ROC曲线和AUC示意图

对角线对应于“随机猜想”模型。点(0,1)则是所有正例都排在反例前面的“理想模型”。在实际情况中,通常是利用有限个测试样例来绘制ROC曲线,此时只能获得有限个坐标点,得不到圆滑的曲线(上图右侧)。

与P-R曲线类似,如果学习器A的ROC曲线被学习器B完全“包住”,那么后者性能优于前者。但是当两个曲线有交点时,则需要比较曲线下的面积**AUC(Area Under ROC Curve)**。

AUC可以由ROC曲线的每个坐标点与横轴围成的矩形面积求和得到。

代价敏感错误率与代价曲线

现实生活中会有这样的场景,不同类型造成的错误后果不同。比如门禁,错误的把可通过人员挡在门外,会使得用户体验不佳,但是如果把不可通过人员进入则会造成严重的安全事故。为了权衡不同错误导致的不同损失,可以给每个错误设立一定的权重,称之为“非均等代价(unequal cost)”。

以二分类为例,可以设定一个“代价矩阵(cost matrix)”。如下表,其中costij代表将第i类预测为第j类样本的代价。一般来说,costii=0。

真实类别 预测为第0类 预测为第1类
第0类 0 cost01
第1类 cost10 0

根据上表,”代价敏感(cost-sensitive)“定义为

E(f;D;cost)=(1/m)*sum(l*cost01+n*cost10)
其中,l为真实类别中第0类而预测为第0类的数据个数,n为真实类别中第1类而预测为第1类的数据个数

在非均等代价下,ROC不能直接反映出学习器的期望总体代价,而”代价曲线“则可以到达该目的。代价曲线的横轴是取值为[0,1]的正例概率代价:

P(+)cost=p*cost01/(p*cost01+(1-p)*cost10)

其中,p是样例为正例的概率;纵轴是取值为[0,1]的归一化代价。

costnorm=FNR*p*cost01+FPR*(1-p)*cost10/(p*cost01+(1-p)*cost10)

其中,FPR为ROC曲线中的假正例率,FNR=1-TPR是假反例率。代价曲线的绘制很简单:

ROC曲线上的每一个点对应了代价平面的一条线段,假设ROC曲线上的坐标为(TPR, FPR),则可相应计算出FNR,然后在代价平面上绘制从(0,FPR)到(1,FNR)的线段。如此将ROC曲线上的每一个点转化成代价平面上的一条线段,然后取所有线段的下界,围城的面积就是在所有条件下学习器的期望总体代价。

代价曲线与期望总体代价
代价曲线与期望总体代价