Confusion Matrix, 混淆矩陣
一個完美的分類模型就是,如果一個客戶實際上(Actual)屬於類別good,也預測成(Predicted)good,處於類別bad,也就預測成bad。但從上面我們看到,一些實際上是good的客戶,根據我們的模型,卻預測他為bad,對一些原本是bad的客戶,卻預測他為good。我們需要知道,這個模型到底預測對了多少,預測錯了多少,混淆矩陣就把所有這些資訊,都歸到一個表裡:
預測10實1d, True Positivec, False Negativec+d, Actual Positive際0b, False Positivea, True Negativea+b, Actual Negativeb+d, Predicted Positivea+c, Predicted Negative
其中, a是正確預測到的負例的數量, True Negative(TN,0->0) b是把負例預測成正例的數量, False Positive(FP, 0->1) c是把正例預測成負例的數量, False Negative(FN, 1->0) d是正確預測到的正例的數量, True Positive(TP, 1->1) a+b是實際上負例的數量,Actual Negative c+d是實際上正例的個數,Actual Positive a+c是預測的負例個數,Predicted Negative b+d是預測的正例個數,Predicted Positive
以上似乎一下子引入了許多概念,其實不必像咋一看那麼複雜,有必要過一下這裡的概念。實際的資料中,客戶有兩種可能{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,badd, True Positive,48 c, False Negative,98c+d, Actual Positive,146際0,goodb, False Positive,25 a, True Negative,229a+b, Actual Negative,254b+d, Predicted Positive,7 a+c, Predicted Negative,327400
根據上表,以下就有幾組常用的評估指標(每個指標分中英文兩行): 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)。*/
以上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_:閾值,比如以上我們選定的0.5 _SENSIT_:sensitivity(覆蓋率,true positive rate) _1MSPEC_ :1-Specificity,為什麼提供1-Specificity而不是Specificity,下文有講究。
_PROB_ _SENSIT_ _1MSPEC_0.54866 0.26712 0.070870.54390 0.27397 0.078740.53939 0.28767 0.086610.52937 0.30137 0.090550.51633 0.31507 0.094490.50583 0.32877 0.098430.48368 0.36301 0.102360.47445 0.36986 0.10630
如果閾值選定為0.50583,sensitivity(覆蓋率,true positive rate)就為0.32877,Specificity就是1-0.098425=0.901575,與以上我們通過列聯表計算出來的差不多(閾值0.5)。