分类器评价与在R中的实现:混淆矩阵
分類模型評價一般有以下幾種方法:混淆矩陣(Confusion Matrix)、收益圖(Gain Chart)、提升圖(Lift Chart)、KS圖(KS Chart)、接受者操作特性曲線(ROC Chart)。“分類模型評價與在R中的實現”系列中將逐個介紹。
本篇介紹最基礎的混淆矩陣。
一、混淆矩陣簡介
混淆矩陣將分類預測結果與實際目標進行比較,并匯總成NXN列聯表(N為分類類型數)。
以二元分類為例:
<td ?colspan="2">Confusion Matrix| ? | Target | ? | |
| ? | ? | Positive | Negative |
| Model | Positive | True Positives(TP) | False Positives(FP) |
| Negative | False Negatives(FN) | True Negatives(TN) | |
| ? | ? | Positive Samples(P) | Negative Samples(N) |
由上表可以計算的指標有:
Accuracy = (TP+TN)/(P+N)
Error Rate = 1 – Accuracy = (FP+FN)/(P+N)
False Positive Rate = Fallout = FP/N
True Positive Rate = Recall = Sensitivity = TP/P
False Negative Rate = Miss = FN/P
True Negative Rate = Specificity = TN/N
Positive Predictive Value = Precision = TP/(TP+FP)
Negative Predictive Value = TN/(TN+FN)
Prediction-conditioned Fallout = FP/(TP+FP)
Prediction-conditioned Miss = FN/(TN+FN)
Rate of Positive Predictions = Detection Prevalence = (TP+FP)/(P+N)
Rate of Negative Predictions = (TN+FN)/(P+N)
Prevalence = (TP+FN)/(P+N)
Detection Rate = TP/(P+N)
Balanced Accuracy = (Sensitivity+Specificity)/2
是不是感覺這些貨已經組合完所有的分子/分母了?沒關系,其實只要知道TP和TN越高越好就好了。
二、在R中計算混淆矩陣
這次使用ROCR包中的ROCR.simple數據集,其中prediction是預測值,labels為真實值。
require(ROCR) data(ROCR.simple) str(ROCR.simple) ## List of 2 ## $ predictions: num [1:200] 0.613 0.364 0.432 0.14 0.385 ... ## $ labels : num [1:200] 1 1 0 0 0 1 1 1 1 0 ...1 用table()直接計算
在確定好閥值后,可以直接用table函數計算列聯表,再根據之前的公式計算各個指標。假設我們認為prediciton>0.5的都預測為1,其余為0.
pred.class <- as.integer(ROCR.simple$predictions > 0.5) print(cft <- table(pred.class, ROCR.simple$labels)) ## ## pred.class 0 1 ## 0 91 14 ## 1 16 79通過對混淆矩陣中數值的計算可以得到:
tp <- cft[2, 2] tn <- cft[1, 1] fp <- cft[2, 1] fn <- cft[1, 2] print(accuracy <- (tp + tn)/(tp + tn + fp + fn)) ## [1] 0.85 print(sensitivity <- tp/(tp + fn)) ## [1] 0.8495 print(specificity <- tn/(tn + fp)) ## [1] 0.85052 用confusionMatrix()算
如果不想手動算,可以借助caret包中的confusionMatrix函數計算。該函數既可以用混淆矩陣的結果,也可以直接輸入預測/目標兩列原始數據計算上述值。只要確定好positive分類是那個,就能得出跟之前一樣的結果。
require(caret) confusionMatrix(cft, positive = "1") confusionMatrix(pred.class, ROCR.simple$labels, positive = "1") ## Confusion Matrix and Statistics ## ## Reference ## Prediction 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 ## Prevalence : 0.465 ## Detection Rate : 0.395 ## Detection Prevalence : 0.475 ## Balanced Accuracy : 0.850 ## ## 'Positive' Class : 1 ##三、混淆矩陣的缺點
1 需要自己確定閥值
可以看到,混淆矩陣4個值的確定都依賴于最直線我們主觀設定的0.5。如果只依靠混淆矩陣這種原始的方法,那么不經過繁瑣的試錯我們無法確認哪個閥值是最好的。
2不平衡數據魯棒性不好
一些positive事件發生概率極小的不平衡數據集(imbalanced data),混淆矩陣可能效果不好。比如對信用卡交易是否異常做分類的情形,很可能1w筆交易中只有1筆交易是異常的。一個將將所有交易都判定為正常的分類器,準確率是99.99%。這個數字雖然很高,但是沒有任何現實意義。
在之前列舉的各種分類模型評價方法中,收益圖(Gain Chart)、提升圖(Lift Chart)、KS圖(KS Chart)、接受者操作特性曲線(ROC Chart)都對混淆矩陣的缺點的有改進。參考后續。
from:?http://iccm.cc/classification-model-evaluation-confusion-matrix/
總結
以上是生活随笔為你收集整理的分类器评价与在R中的实现:混淆矩阵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用FLANN进行特征点匹配
- 下一篇: 分类器评价与在R中的实现:ROC图与AU