Confusion Matrix,及混淆矩阵,用于展示模型预测精度的一种较为常见的方法;其属于分类模型评价方法中的一种,其他还有收益图(Gain),提升图(Lift),ROC等
对于最常见的二元分类来说,它的混淆矩阵是2x2
的,以wiki图为例: Confusion Matrix,及混淆矩阵,用于展示模型预测精度的一种较为常见的方法;其属于分类模型评价方法中的一种,其他还有收益图(Gain),提升图(Lift),ROC等
对于最常见的二元分类来说,它的混淆矩阵是2x2
的,以wiki图为例:
基本术语
从上表中间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)
如果只想生成一个列联表,则用table
base函数即可
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曲线等方法,它们对混淆矩阵的缺点有所改进
参考资料
- https://www.datacamp.com/community/tutorials/confusion-matrix-calculation-r
- https://honingds.com/blog/confusion-matrix-in-r/
- How to calculate information included in R's confusion matrix
- https://www.dataschool.io/simple-guide-to-confusion-matrix-terminology/
- Confidence Intervals for Proportions
- 分类器评价与在R中的实现:混淆矩阵
本文出自于http://www.bioinfo-scrounger.com转载请注明出处