一个完美的分类模型就是,如果一个客户实际上(Actual)属于类别good,也预测成(Predicted)good,处于类别bad,也就预测成bad。但从上面我们看到,一些实际上是good的客户,根据我们的模型,却预测他为bad,对一些原本是bad的客户,却预测他为good。我们需要知道,这个模型到底预测对了多少,预测错了多少,混淆矩阵就把所有这些信息,都归到一个表里:
预测 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
其中,
以上似乎一下子引入了许多概念,其实不必像咋一看那么复杂,有必要过一下这里的概念。实际的数据中,客户有两种可能{good, bad},模型预测同样这两种可能,可能匹配可能不匹配。匹配的好说,0->0(读作,实际是Negative,预测成Negative),或者 1->1(读作,实际是Positive,预测成Positive),这就是True Negative(其中Negative是指预测成Negative)和True Positive(其中Positive是指预测成Positive)的情况。
同样,犯错也有两种情况。实际是Positive,预测成Negative (1->0) ,这就是False Negative;实际是Negative,预测成Positive (0->1) ,这就是False Positive;
我们可以通过SAS的proc freq得到以上数字:
proc freq data=valid_p; tables good_bad*good_bad_predicted/nopercent nocol norow; run;
对照上表,结果如下:
预测 1 0 实 1,bad d, True Positive,48 c, False Negative,98 c+d, Actual Positive,146 际 0,good b, False Positive,25 a, True Negative,229 a+b, Actual Negative,254 b+d, Predicted Positive,7 a+c, Predicted Negative,327 400
根据上表,以下就有几组常用的评估指标(每个指标分中英文两行):
准确(分类)率=正确预测的正反例数/总数
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%
覆盖率=正确预测到的正例数/实际正例总数,
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)*。/
负例的覆盖率=正确预测到的负例个数/实际负例总数
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)。*/
以上6个指标,可以方便地由上面的提到的proc freq得到:
proc freq data=valid_p; tables good_bad*good_bad_predicted ; run;
其中,准确率=12.00%+57.25%=69.25% ,覆盖率=32.88% ,命中率=65.75% ,Specificity=90.16%,PV-=70.03% 。
或者,我们可以通过SAS logistic回归的打分程序(score)得到一系列的Sensitivity和Specificity,
proc logistic data=train; model good_bad=checking history duration savings property; score data=valid outroc=valid_roc; run;
数据valid_roc中有几个我们感兴趣的变量:
_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.09449
0.50583 0.32877 0.09843
0.48368 0.36301 0.10236
0.47445 0.36986 0.10630
如果阈值选定为0.50583,sensitivity(覆盖率,true positive rate)就为0.32877,Specificity就是1-0.098425=0.901575,与以上我们通过列联表计算出来的差不多(阈值0.5)。