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

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

数据

```Train data
-------------------------------------------
good             446              74.33

Valid data
--------------------------------------------
good             254              63.50```

模型

```proc logistic data=train;

model good_bad=checking history duration savings property;run;```

```Analysis of Maximum Likelihood Estimates

Standard     Wald
Parameter    DF    Estimate       Error     Chi-Square    Pr > ChiSq

Intercept     1      0.6032      0.4466        1.8242        0.1768
checking      1     -0.6536      0.0931       49.3333        <.0001
history         1     -0.4083      0.0980       17.3597        <.0001
duration      1      0.0248     0.00907        7.4820        0.0062
savings        1     -0.2017      0.0745        7.3308        0.0068
property      1      0.3157      0.1052        9.0163        0.0027```

```logit[p(bad)]=log(p/1-p)
=0.6032-0.6536*checking-0.4083*history+0.0248*duration
-0.2017*savings+0.3157*property```

`p=exp(logit)/(exp(logit)+1)`

```data valid_p;

set valid;

logit=0.6032-0.6536*checking-0.4083*history+0.0248*duration-0.2017*savings+0.3157*property;

p=exp(logit)/(exp(logit)+1);

```good_bad       p       good_bad_predicted
good      0.21680      good
good      0.48351      good
good      0.03288      good
good      0.06789      good
good      0.15306      good```

Confusion Matrix, 混淆矩阵

```		预测
1	0

b+d, Predicted Positive	a+c, Predicted Negative```

1. a是正确预测到的负例的数量, True Negative(TN,0->0)
2. b是把负例预测成正例的数量, False Positive(FP, 0->1)
3. c是把正例预测成负例的数量, False Negative(FN, 1->0)
4. d是正确预测到的正例的数量, True Positive(TP, 1->1)
5. a+b是实际上负例的数量，Actual Negative
6. c+d是实际上正例的个数，Actual Positive
7. a+c是预测的负例个数，Predicted Negative
8. b+d是预测的正例个数，Predicted Positive

```proc freq data=valid_p;
run;```

```	预测
1	0

b+d, Predicted Positive,73	a+c, Predicted Negative,327	400```

1. 准确（分类）率VS.误分类率

Accuracy=true positive and true negative/total cases= a+d/a+b+c+d=(48+229)/(48+98+25+229)=69.25%

Error rate=false positive and false negative/total cases=b+c/a+b+c+d=1-Accuracy=30.75%

2. （正例的）覆盖率VS. （正例的）命中率

Recall(True Positive Rate，or Sensitivity)=true positive/total actual positive=d/c+d=48/(48+98)=32.88%

/*注：覆盖率(Recall）这个词比较直观，在数据挖掘领域常用。因为感兴趣的是正例(positive)，比如在信用卡欺诈建模中，我们感兴趣的是有高欺诈倾向的客户，那么我们最高兴看到的就是，用模型正确预测出来的欺诈客户(True Positive)cover到了大多数的实际上的欺诈客户，覆盖率，自然就是一个非常重要的指标。这个覆盖率又称Sensitivity， 这是生物统计学里的标准词汇，SAS系统也接受了（谁有直观解释？）。 以后提到这个概念，就表示为, Sensitivity（覆盖率，True Positive Rate）。 */

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

/*注：这是一个跟覆盖率相对应的指标。对所有的客户，你的模型预测，有b+d个正例，其实只有其中的d个才击中了目标（命中率）。在数据库营销里，你预测到b+d个客户是正例，就给他们邮寄传单发邮件，但只有其中d个会给你反馈（这d个客户才是真正会响应的正例），这样，命中率就是一个非常有价值的指标。 以后提到这个概念，就表示为PV+(命中率，Positive Predicted Value)*。/

3.Specificity VS. PV-

Specificity(True Negative Rate)=true negative/total actual negative=a/a+b=229/(25+229)=90.16%

/*注：Specificity跟Sensitivity（覆盖率，True Positive Rate）类似，或者可以称为“负例的覆盖率”，也是生物统计用语。以后提到这个概念，就表示为Specificity(负例的覆盖率，True Negative Rate) 。*/

Negative predicted value(PV-)=true negative/total predicted negative=a/a+c=229/(98+229)=70.03%

/*注：PV-跟PV+（命中率，Positive Predicted value）类似，或者可以称为“负例的命中率”。 以后提到这个概念，就表示为PV-(负例的命中率，Negative Predicted Value)。*/

```proc freq data=valid_p;

```proc logistic data=train;

model good_bad=checking history duration savings property;

score data=valid outroc=valid_roc;run;```

• _PROB_:阈值，比如以上我们选定的0.5
• _SENSIT_：sensitivity（覆盖率，true positive rate）
• _1MSPEC_ ：1-Specificity，为什么提供1-Specificity而不是Specificity，下文有讲究。
```_PROB_ _SENSIT_ _1MSPEC_

0.54866 0.26712 0.07087

0.54390 0.27397 0.07874

0.53939 0.28767 0.08661

0.52937 0.30137 0.09055

0.51633 0.31507 0.094490.50583 0.32877 0.098430.48368 0.36301 0.10236

0.47445 0.36986 0.10630```

ROC曲线就是不同的阈值下，以下两个变量的组合：

Sensitivity（覆盖率，True Positive Rate） 1-Specificity (Specificity, 负例的覆盖率，True Negative Rate)

axis order=(0 to 1 by .1) label=none length=4in; symbol i=join v=none c=black; symbol2 i=join v=none c=black; proc gplot data = valid_roc; plot _SENSIT_*_1MSPEC_ _1MSPEC_*_1MSPEC_ / overlay vaxis=axis haxis=axis; run; quit;

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

AUC, Area Under the ROC Curve

ROC曲线是根据与45度线的偏离来判断模型好坏。图示的好处是直观，不足就是不够精确。到底好在哪里，好了多少？这就要涉及另一个术语，AUC(Area Under the ROC Curve，ROC曲线下的面积)，不过也不是新东西，只是ROC的一个派生而已。

SAS的Logistic回归能够后直接生成AUC值。跑完上面的模型，你可以在结果报告的Association Statistics找到一个叫c的指标，它就是AUC（本例中，c=AUC=0.803，45度线的c=0.5）。

/*注：以上提到的c不是AUC里面那个’C’。这个c是一个叫Wilcoxon-Mann-Whitney 检验的统计量。这个说来话长，不过这个c却等价于ROC曲线下的面积（AUC）。*/

ROC、AUC：SAS9.2一步到位

SAS9.2有个非常好的新功能，叫ODS Statistical Graphics，有兴趣可以去它主页看看。在SAS9.2平台提交以下代码，Logistic回归参数估计和ROC曲线、AUC值等结果就能一起出来（有了上面的铺垫，就不惧这个黑箱了）：

ods graphics on; proc logistic data=train plots(only)=roc; model good_bad=checking history duration savings property; run; ods graphics off;

1. 一些准备

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

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，提升值，解释见下节。

%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;

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。

symbol i=join v=none c=black; proc gplot data=valid_lift; plot lift*depth; run; quit;

/*注：在一些应用中（比如信用评分），会根据分类模型的结果，把样本分成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 Chart，图形是往上走的，咋一看跟上文相反，其实道理一致，只是坐标选择有差别，不提。*/

822 篇文章214 人订阅

0 条评论

相关文章

3302

1363

2596

5544

【资源】17个最受欢迎的机器学习应用标准数据集

【新智元导读】学好机器学习的关键是用许多不同的数据集来实践。本文介绍了10个最受欢迎的标准机器学习数据集和7个时间序列数据集，既有回归问题也有分类问题，并提供了...

86015

22810

5122

决策树案例：基于python的商品购买能力预测系统

1 决策树/判定树（decision tree) ---- 1 决策树（Dicision Tree）是机器学习有监督算法中分类算法的一种，有关机器学习中分类和...

7557

【谷歌大脑力作】RNN最新技术：注意力增强 RNN，四大模型

【新智元导读】谷歌大脑团队的Chris Olah & Shan Carter 整理了 2016 年递归神经网络（RNN）的发展，总结了神经图灵机、注意力界面、自...

4505

非均衡数据处理--如何学习？

Sampling技术比较直观，就是怎么把样本变成均衡的。 我们知道不均衡数据， 最重要的还是收集minority数据。 但是一般这是一个长期的过程。 那么， ...

1272