标签归档:混淆矩阵

分类器评价、混淆矩阵与ROC曲线

[box type=”info”]本文转载自阿稳的博客,原文链接请点击此处。本文主要介绍了数据挖掘中分类器的评价指标,以及混淆矩阵、ROC曲线等内容。

作者简介:阿稳,豆瓣,算法工程师。感兴趣的领域:推荐系统,数据挖掘,算法架构及实现的可扩展性,R环境编程。博客http://www.wentrue.net/blog/[/box]

假定你基于贝叶斯理论、神经网络或其他技术建立了自己的分类器。你如何得知自己是否干了一项漂亮的工作呢?你如何得知是否可以把自己的智能模块应用 于生产环境中,并获得同行的景仰以及老板的赞赏呢?评估分类器和创建它同样重要,如同在销售会议上,你会听到大量的夸大之词,但没有评估这就是一堆废话。 本节的目的在于帮助你评估自己的分类器,如果你是一个开发者或产品经理,这会帮助你理解第三方产品的合理与否。

“没有人知道所有的事情”、“人都会犯错”。这些箴言在计算机领域也有其对应的版本:没有一个分类器可以解决所有的问题,也没有一个分类器在所有的 数据集中都能良好地工作。在分类范畴中的学习技术属于有监督学习,“有监督”意味着分类器会利用已知的分类结果历经一个训练的过程,通过这种监督,它会尝 试着学习蕴含在训练数据集中的信息。你可以想象得到,训练数据集与你部署环境中实际数据的相关性会是分类是否成功的关键。

以上两段文字摘自我和陈钢同学翻译、即将出版的《智能web算法》中讲述分类器的一章。

作者试图说明一个问题:分类器的评估与分类器本身同样重要。评估分类器可信度的一个基本工具是混淆矩阵(confusion matrix)。以一个二分类问题作为研究对象,图1的混淆矩阵显示了一个分类器可能会遭遇的所有情况,其中列(positive/negative)对应于实例实际所属的类别,行(true/false)表示分类的正确与否(注,这里的混淆矩阵的结构跟[2]中的定义并不一样,但实际说明的问题是一致的)。

图1 混淆矩阵

其中FP和FN就是我们常说的第一类错误与第二类错误,以这四个基本指标可以衍生出多个分类器评价指标,如图2。还有下文将会用到的TPR=TP/P=TP/(TP+FN)。

图2 指标定义

我们常用的就是分类器的精确度(accuracy),在某些如推荐或信息获取领域还会组合使用precision-recall作为评价指标。因为你用于训练分类器的样本本身就是总体的一个抽样,所以这些指标的数值也仅仅是一种统计上的反映,如果你做多次抽样训练,跟别的随机变量一样,它一样会有期望、方差、置信区间这些概念。理论上说,训练样本量越大,你得到的这些指标的可信度就越高(即它们以某个概率落在的置信区间越窄)。不幸的是,实际中你未必会有那么多的样本,所以机器学习工作者设计出很多种方法来应对数据量不足情况下分类器的训练与评估,如k步交叉检验、留1法、boostrap等等。

以上这些都属于静态的指标,当正负样本不平衡时它会存在着严重的问题。极端情况下比如正负样本比例为1:99(这在有些领域并不少见),那么一个基准分类器只要把所有样本都判为负,它就拥有了99%的精确度,但这时的评价指标是不具有参考价值的。另外就是,现代分类器很多都不是简单地给出一个0或1的分类判定,而是给出一个分类的倾向程度,比如贝叶斯分类器输出的分类概率。对于这些分类器,当你取不同阈值,就可以得到不同的分类结果及分类器评价指标,依此人们又发明出来ROC曲线以及AUC(曲线包围面积)指标来衡量分类器的总体可信度。

ROC曲线最初源于20世纪70年代的信号检测理论,描述的是分类混淆矩阵中FPR-TPR两个量之间的相对变化情况。如果二元分类器输出的是对正样本的一个分类概率值,当取不同阈值时会得到不同的混淆矩阵,对应于ROC曲线上的一个点。那么ROC曲线就反映了FPR与TPR之间权衡的情况,通俗地来说,即在TPR随着FPR递增的情况下,谁增长得更快,快多少的问题。TPR增长得越快,曲线越往上屈,AUC就越大,反映了模型的分类性能就越好。当正负样本不平衡时,这种模型评价方式比起一般的精确度评价方式的好处尤其显著。一个典型的ROC曲线如图3所示(来自[2])。

图3 ROC曲线

[1] 《智能web算法》
[2] http://en.wikipedia.org/wiki/Receiver_operating_characteristic

分类模型的性能评估——以SAS Logistic回归为例(3): Lift和Gain

书接前文。跟ROC类似,Lift(提升)和Gain(增益)也一样能简单地从以前的Confusion Matrix以及Sensitivity、Specificity等信息中推导而来,也有跟一个baseline model的比较,然后也是很容易画出来,很容易解释。以下先修知识,包括所需的数据集:

  1. 分类模型的性能评估——以SAS Logistic回归为例(1): 混淆矩阵
  2. 分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC

一些准备

说,混淆矩阵(Confusion Matrix)是我们永远值得信赖的朋友:

预测
1 0
1 d, True Positive c, False Negative c+d, Actual Positive
0 b, False Positive a, True Negative a+b, Actual Negative
b+d, Predicted Positive a+c, Predicted Negative

几个术语需要随时记起:

1. Sensitivity(覆盖率,True Positive Rate)=正确预测到的正例数/实际正例总数

Recall (True Positive Rate,or Sensitivity) =true positive/total actual positive=d/c+d

2. PV+ (命中率,Precision, Positive Predicted Value) =正确预测到的正例数/预测正例总数

Precision (Positive Predicted Value, PV+) =true positive/ total predicted positive=d/b+d

3. Specificity (负例的覆盖率,True Negative Rate) =正确预测到的负例个数/实际负例总数

Specificity (True Negative Rate) =true negative/total actual negative=a/a+b

首先记我们valid数据中,正例的比例为pi1(念做pai 1),在我们的例子中,它等于c+d/a+b+c+d=0.365。单独提出pi1,是因为有时考虑oversampling后的一些小调整,比如正例的比例只有0.001,但我们把它调整为0.365(此时要在SAS proc logistic回归的score语句加一个priorevent=0.001选项)。本文不涉及oversampling。现在定义些新变量:

Ptp=proportion of true positives=d/a+b+c+d=(c+d/a+b+c+d)*(d/c+d) =pi1* Sensitivity,正确预测到的正例个数占总观测值的比例

Pfp=proportion of false positives=b/a+b+c+d= (a+b/a+b+c+d)*(b/a+b) = (1-c+d/a+b+c+d)*(1-a/a+b) = (1-pi1)*(1- Specificity) ,把负例错误地预测成正例的个数占总数的比例

Depth=proportion allocated to class 1=b+d/a+b+c+d=Ptp+Pfp,预测成正例的比例

PV_plus=Precision (Positive Predicted Value, PV+) = d/b+d=Ptp/depth,正确预测到的正例数占预测正例总数的比例

Lift= (d/b+d)/(c+d/a+b+c+d)=PV_plus/pi1,提升值,解释见下节。

以上都可以利用valid_roc数据计算出来:

%let pi1=0.365;

data valid_lift;

set valid_roc;

cutoff=_PROB_;

Ptp=&pi1*_SENSIT_;

Pfp=(1-&pi1)*_1MSPEC_;

depth=Ptp+Pfp;

PV_plus=Ptp/depth;

lift=PV_plus/&pi1;

keep cutoff _SENSIT_ _1MSPEC_ depth PV_plus lift;

run;

先前我们说ROC curve是不同阈值下Sensitivity和1-Specificity的轨迹,类似,

Lift chart是不同阈值下Lift和Depth的轨迹

Gains chart是不同阈值下PV+和Depth的轨迹

Lift

Lift = (d/b+d)/(c+d/a+b+c+d)=PV_plus/pi1),这个指标需要多说两句。它衡量的是,与不利用模型相比,模型的预测能力“变好”了多少。不利用模型,我们只能利用“正例的比例是c+d/a+b+c+d”这个样本信息来估计正例的比例(baseline model),而利用模型之后,我们不需要从整个样本中来挑选正例,只需要从我们预测为正例的那个样本的子集(b+d)中挑选正例,这时预测的准确率为d/b+d。

显然,lift(提升指数)越大,模型的运行效果越好。如果这个模型的预测能力跟baseline model一样,那么d/b+d就等于c+d/a+b+c+d(lift等于1),这个模型就没有任何“提升”了(套一句金融市场的话,它的业绩没有跑过市场)。这个概念在数据库营销中非常有用,举个例子

比如说你要向选定的1000人邮寄调查问卷(a+b+c+d=1000)。以往的经验告诉你大概20%的人会把填好的问卷寄回给你,即1000人中有200人会对你的问卷作出回应(response,c+d=200),用统计学的术语,我们说baseline response rate是20%(c+d/a+b+c+d=20%)。

如果你现在就漫天邮寄问卷,1000份你期望能收回200份,这可能达不到一次问卷调查所要求的回收率,比如说工作手册规定邮寄问卷回收率要在25%以上。

通过以前的问卷调查,你收集了关于问卷采访对象的相关资料,比如说年龄、教育程度之类。利用这些数据,你确定了哪类被访问者对问卷反应积极。假设你已经利用这些过去的数据建立了模型,这个模型把这1000人分了类,现在你可以从你的千人名单中挑选出反应最积极的100人来(b+d=100),这10%的人的反应率 (response rate)为60%(d/b+d=60%,d=60)。那么,对这100人的群体(我们称之为Top 10%),通过运用我们的模型,相对的提升(lift value)就为60%/20%=3;换句话说,与不运用模型而随机选择相比,运用模型而挑选,效果提升了3倍。

上面说lift chart是不同阈值下Lift和Depth的轨迹,先画出来:

symbol i=join v=none c=black;

proc gplot data=valid_lift;

plot lift*depth;

run; quit;

lift

上图的纵坐标是lift,意义已经很清楚。横坐标depth需要多提一句。以前说过,随着阈值的减小,更多的客户就会被归为正例,也就是depth(预测成正例的比例)变大。当阈值设得够大,只有一小部分观测值会归为正例,但这一小部分(一小撮)一定是最具有正例特征的观测值集合(用上面数据库营销的例子来说,这一部分人群对邮寄问卷反应最为活跃),所以在这个depth下,对应的lift值最大。

同样,当阈值设定得足够的小,那么几乎所有的观测值都会被归为正例(depth几乎为1)——这时分类的效果就跟baseline model差不多了,相对应的lift值就接近于1。

一个好的分类模型,就是要偏离baseline model足够远。在lift图中,表现就是,在depth为1之前,lift一直保持较高的(大于1的)数值,也即曲线足够的陡峭。

/*注:在一些应用中(比如信用评分),会根据分类模型的结果,把样本分成10个数目相同的子集,每一个子集称为一个decile,其中第一个decile拥有最多的正例特征,第二个decile次之,依次类推,以上lift和depth组合就可以改写成lift和decile的组合,也称作lift图,含义一样。刚才提到,“随着阈值的减小,更多的客户就会被归为正例,也就是depth(预测成正例的比例)变大。当阈值设得够大,只有一小部分观测值会归为正例,但这一小部分(第一个decile)一定是最具有正例特征的观测值集合。”*/

Gains

Gains (增益) 与 Lift (提升)相当类似:Lift chart是不同阈值下Lift和Depth的轨迹,Gains chart是不同阈值下PV+和Depth的轨迹,而PV+=lift*pi1= d/b+d(见上),所以它们显而易见的区别就在于纵轴刻度的不同:

symbol i=join v=none c=black;

proc gplot data=valid_lift;

plot pv_plus*depth;

run; quit;

gains

上图阈值的变化,含义与lift图一样。随着阈值的减小,更多的客户就会被归为正例,也就是depth(预测成正例的比例,b+d/a+b+c+d)变大(b+d变大),这样PV+(d/b+d,正确预测到的正例数占预测正例总数的比例)就相应减小。当阈值设定得足够的小,那么几乎所有的观测值都会被归为正例(depth几乎为1),那么PV+就等于数据中正例的比例pi1了(这里是0.365。在Lift那一节里,我们说此时分类的效果就跟baseline model差不多,相对应的lift值就接近于1,而PV+=lift*pi1。Lift的baseline model是纵轴上恒等于1的水平线,而Gains的baseline model是纵轴上恒等于pi1的水平线)。显然,跟lift 图类似,一个好的分类模型,在阈值变大时,相应的PV+就要变大,曲线足够陡峭。

/*注:我们一般看到的Gains Chart,图形是往上走的,咋一看跟上文相反,其实道理一致,只是坐标选择有差别,不提。*/

总结和下期预告:K-S

以上提到的ROC、Lift、Gains,都是基于混淆矩阵及其派生出来的几个指标(Sensitivity和Specificity等等)。如果愿意,你随意组合几个指标,展示到二维空间,就是一种跟ROC平行的评估图。比如,你plot Sensitivity*Depth一把,就出一个新图了,——很不幸,这个图叫做Lorentz Curve(劳伦兹曲线),不过你还可以尝试一下别的组合,然后凑一个合理的解释。

Gains chart是不同阈值下PV+和Depth的轨迹(Lift与之类似),而ROC是sensitivity和1-Specificity的对应,前面还提到,Sensitivity(覆盖率,True Positive Rate)在欺诈监控方面更有用(所以ROC更适合出现在这个场合),而PV+在数据库营销里面更有用(这里多用Gains/Lift)。

混淆矩阵告一段落。接下来将是K-S(Kolmogorov-Smirnov)。参考资料同上一篇

分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC

ROC

上回我们提到,ROC曲线就是不同的阈值下,以下两个变量的组合(如果对Sensitivity和Specificity两个术语没有概念,不妨返回,分类模型的性能评估——以SAS Logistic回归为例(1): 混淆矩阵,强烈建议读者对着看):

Sensitivity(覆盖率,True Positive Rate)

1-Specificity (Specificity, 负例的覆盖率,True Negative Rate)

继续阅读分类模型的性能评估——以SAS Logistic回归为例(2): ROC和AUC

分类模型的性能评估——以SAS Logistic回归为例(1): 混淆矩阵

跑完分类模型(Logistic回归、决策树、神经网络等),我们经常面对一大堆模型评估的报表和指标,如Confusion Matrix、ROC、Lift、Gini、K-S之类(这个单子可以列很长),往往让很多在业务中需要解释它们的朋友头大:“这个模型的Lift是4,表明模型运作良好。——啊,怎么还要解释ROC,ROC如何如何,表明模型表现良好……”如果不明白这些评估指标的背后的直觉,就很可能陷入这样的机械解释中,不敢多说一句,就怕哪里说错。本文就试图用一个统一的例子(SAS Logistic回归),从实际应用而不是理论研究的角度,对以上提到的各个评估指标逐一点评,并力图表明:

  1. 这些评估指标,都是可以用白话(plain English, 普通话)解释清楚的;
  2. 它们是可以手算出来的,看到各种软件包输出结果,并不是一个无法探究的“黑箱”;
  3. 它们是相关的。你了解一个,就很容易了解另外一个。

本文从混淆矩阵(Confusion Matrix,或分类矩阵,Classification Matrix)开始,它最简单,而且是大多数指标的基础。

继续阅读分类模型的性能评估——以SAS Logistic回归为例(1): 混淆矩阵