0%

Confusion Matrix in R

Confusion Matrix,及混淆矩阵,用于展示模型预测精度的一种较为常见的方法;其属于分类模型评价方法中的一种,其他还有收益图(Gain),提升图(Lift),ROC等

对于最常见的二元分类来说,它的混淆矩阵是2x2的,以wiki图为例: Confusion Matrix,及混淆矩阵,用于展示模型预测精度的一种较为常见的方法;其属于分类模型评价方法中的一种,其他还有收益图(Gain),提升图(Lift),ROC等

对于最常见的二元分类来说,它的混淆矩阵是2x2的,以wiki图为例:

confusionM

基本术语

从上表中间4个数值,我们能计算多个指标,如:

  • ACC,classification accuracy,准确率,Accuracy = (TP+TN) / (TP+TN+FN+TN)
  • BER,balanced error rate,BER = 1/2 * (FPR+FN/(FN+TP))
  • TPR,true positive rate,灵敏度或者召回率(recall),TPR = TP / (TP+ FN)
  • FPR,false positive rate,FPR = FP / (FP + TN)
  • TNR,true negative rate,特异度,TNR = TN / (FP + TN)
  • PPV,positive predictive value,阳性预测值/精确率,PPV = TP / (TP + FP)
  • NPV,negative predictive value,阴性预测值,NPV = TN / (FN + TN)

上述中一般关注TP,TN,PPV,NPV比较多

灵敏度召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN)。

特异性是针对我们原来的样本而言的,它表示样本中的负类被预测为负类的比例

阳性预测值/精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是对的。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP)。

阴性预测值类似于阳性预测值,它表示的是预测为负的样本中多少是对的。那么预测为正就有两种可能了,一种就是把负类预测为负类(TN),另一种就是把正类预测为负类(FN)。

此外还有:

  • F1 Score,精确率和召回率的调和平均值,F1 = 2 / (1/PPV+1/TPR)
  • Prevalence,正类样本在总样本中所占比例,Prevalence = (FN+TP) / (TP+TN+FN+TN)
  • Null Error Rate,这是如果你总是预测大多数类,你就会错的频率;假如Total=165,TN=50,FP=10,则Null Error Rate = (TN+FP) / Total,因为你总是预测Yes的话,你也只会有60个No的情况下出错,这个可以作为分类器的基准度量
  • Cohen's Kappa,这本质上是对分类器的性能的一种度量,与它仅仅是偶然的性能进行比较。换句话说,如果模型的准确率和零错误率之间有很大的差异,那么模型的Kappa分数就会很高
  • ROC Curve,ROC曲线的AUC值可以用来对模型进行评价,AUC全称为Area Under Curve,表示一条曲线下面的面积。ROC曲线总结了分类器在所有可能阈值上的性能,其纵坐标True Positive Rate(TPR),横坐标False Positive Rate((FPR),当你改变将观察值分配给给定类的阈值时,通过绘制X/Y轴来生成它。

R-计算

以ROCR包中的ROCR.simple数据集为例

library(ROCR)
data(ROCR.simple)
str(ROCR.simple)

如果只想生成一个列联表,则用tablebase函数即可

pred_label <- as.integer(ROCR.simple$predictions > 0.5)
> table(pred_label, ROCR.simple$labels)
          
pred_label  0  1
         0 91 14
         1 16 79

上述中sensitivity <- 79 / (79 + 14)

还可以用更加方便caret包的confusionMatrix()函数

library(caret)
> confusionMatrix(cft, positive = "1", mode = "everything")
Confusion Matrix and Statistics

          
pred_label  0  1
         0 91 14
         1 16 79
                                        
               Accuracy : 0.85          
                 95% CI : (0.793, 0.896)
    No Information Rate : 0.535         
    P-Value [Acc > NIR] : <2e-16        
                                        
                  Kappa : 0.699         
                                        
 Mcnemar's Test P-Value : 0.855         
                                        
            Sensitivity : 0.849         
            Specificity : 0.850         
         Pos Pred Value : 0.832         
         Neg Pred Value : 0.867         
              Precision : 0.832         
                 Recall : 0.849         
                     F1 : 0.840         
             Prevalence : 0.465         
         Detection Rate : 0.395         
   Detection Prevalence : 0.475         
      Balanced Accuracy : 0.850         
                                        
       'Positive' Class : 1 

其输出的结果中:

由于分类0/1符合binomial分布,所以可以计算accuracy的confidence interval,还可以用DescTools包的BinomCI()函数(参考:https://www.dataschool.io/simple-guide-to-confusion-matrix-terminology/),比如想要计算accuracy的wilson confidence interval:

> BinomCI(x = 79 + 91, n = 79 + 16 + 14 + 91, conf.level = 0.95, method = "wilson")
      est lwr.ci upr.ci
[1,] 0.85   0.79   0.89

除了上述的accuracy,Sensitivity和Specificity的置信区间也可以用此函数计算

No Information Rate则是上述中提到的Null Error Rate

> print((91 + 16) / (79 + 14 + 16 + 91))
[1] 0.54

P-Value [Acc > NIR]则是指用binom.test函数来比较"accuracy"是否比"No Information Rate"更好(greater),这里的x是指accuracy人数,n则总人数,p为"No Information Rate"

> binom.test(x = 170, n = 200, p = 0.535, alternative = "greater")

    Exact binomial test

data:  170 and 200
number of successes = 170, number of trials = 200, p-value <2e-16
alternative hypothesis: true probability of success is greater than 0.54
95 percent confidence interval:
 0.8 1.0
sample estimates:
probability of success 
                  0.85 

Kappa值也可以用vcd包的Kappa()函数来计算,有Cohen's kappa(confusionMatrix函数使用这种方法)和weighted kappa两种结果

K <- vcd::Kappa(matrix(c(79, 16, 14, 91), byrow = T, nrow = 2))
> K
           value    ASE    z Pr(>|z|)
Unweighted 0.699 0.0507 13.8 2.62e-43
Weighted   0.699 0.0507 13.8 2.62e-43

Mcnemar's Test P-Value则是用mcnemar.test函数计算所得(跟普通的chi-squared有点差别)

 > mcnemar.test(pred_label, ROCR.simple$labels)

    McNemar's Chi-squared test with continuity correction

data:  pred_label and ROCR.simple$labels
McNemar's chi-squared = 0.03, df = 1, p-value = 0.9

剩下的则是常规评价指标,按照公式计算即可。。。

不过需要注意的是,如果数据集中不同类别呈现不平衡的情况时,混淆矩阵的实用性是非常有限的。比如对信用卡交易是否异常做分类的情形,很可能1万笔交易中只有1笔交易是异常的。一个将将所有交易都判定为正常的分类器,准确率是99.99%。这个数字虽然很高,但却没有任何现实意义。

因此,除了混淆矩阵,我们还需要了解收益图,提升图,KS图以及ROC曲线等方法,它们对混淆矩阵的缺点有所改进

参考资料

  1. https://www.datacamp.com/community/tutorials/confusion-matrix-calculation-r
  2. https://honingds.com/blog/confusion-matrix-in-r/
  3. How to calculate information included in R's confusion matrix
  4. https://www.dataschool.io/simple-guide-to-confusion-matrix-terminology/
  5. Confidence Intervals for Proportions
  6. 分类器评价与在R中的实现:混淆矩阵

本文出自于http://www.bioinfo-scrounger.com转载请注明出处