Posted on 2008/12/25 by 胡江堂
跑完分類模型(Logistic迴歸、決策樹、神經網路等),我們經常面對一大堆模型評估的報表和指標,如Confusion Matrix、ROC、Lift、Gini、K-S之類(這個單子可以列很長),往往讓很多在業務中需要解釋它們的朋友頭大:“這個模型的Lift是4,表明模型運作良好。——啊,怎麼還要解釋ROC,ROC如何如何,表明模型表現良好……”如果不明白這些評估指標的背後的直覺,就很可能陷入這樣的機械解釋中,不敢多說一句,就怕哪裡說錯。本文就試圖用一個統一的例子(SAS Logistic迴歸),從實際應用而不是理論研究的角度,對以上提到的各個評估指標逐一點評,并力圖表明:
- 這些評估指標,都是可以用白話(plain English, 普通話)解釋清楚的;
- 它們是可以手算出來的,看到各種軟體包輸出結果,並不是一個無法探究的“黑箱”;
- 它們是相關的。你瞭解一個,就很容易瞭解另外一個。
本文從混淆矩陣(Confusion Matrix,或分類矩陣,Classification Matrix)開始,它最簡單,而且是大多數指標的基礎。
資料
本文使用一個在信用評分領域非常有名的免費資料集,German Credit Dataset,你可以在UCI Machine Learning Repository找到(下載;資料描述)。另外,你還可以在SAS系統的Enterprise
Miner的示範資料集中找到該資料的一個版本(dmagecr.sas7bdat)。以下把這個資料分為兩部分,訓練資料train和驗證資料valid,所有的評估指標都是在valid資料中計算(純粹為了示範評估指標,在train資料裡計算也未嘗不可),我們感興趣的二分變數是good_bad,取值為{good, bad}:
Train datagood_bad Frequency Percent-------------------------------------------bad 154 25.67good 446 74.33Valid datagood_bad Frequency Percent--------------------------------------------bad 146 36.50good 254 63.50
信用評分指協助貸款機構發放消費信貸的一整套決策模型及其支援技術。一般地,信用評分技術將客戶分為好客戶與壞客戶兩類,比如說,好客戶(good)能夠按期還本付息(履約),違約的就是壞客戶(bad)。具體做法是根據曆史上每個類別(履約、違約)的若干樣本,從已知的資料中考察借款人的哪些特徵對其拖欠或違約行為有影響,從而測量借款人的違約風險,為信貸決策提供依據。Logistic迴歸是信用評分領域運用最成熟最廣泛的統計技術。
約定
在我們的樣本資料中,要考察的二分變數是good_bad,我們把感興趣的那個取值bad(我們想計算違約的機率),稱作正例(Positive, 1),另外那個取值(good)稱作負例(Negative, 0)。在SAS的Logistic迴歸中,預設按二分類取值的升序排列取第一個為positive,所以預設的就是求bad的機率。(若需要求good的機率,需要特別指定)。
模型
如果沒有特別說明,以下所有的SAS代碼都在SAS 9.1.3 SP4系統中調試並運行成功(在產生ROC曲線時,我還會提到SAS9.2的新功能)。
proc logistic data=train;model good_bad=checking history duration savings property;run;
這個資料很整齊,能做出很漂亮的模型,以下就直接貼出參數估計的結果:
Analysis of Maximum Likelihood EstimatesStandard WaldParameter DF Estimate Error Chi-Square Pr > ChiSqIntercept 1 0.6032 0.4466 1.8242 0.1768checking 1 -0.6536 0.0931 49.3333 <.0001history 1 -0.4083 0.0980 17.3597 <.0001duration 1 0.0248 0.00907 7.4820 0.0062savings 1 -0.2017 0.0745 7.3308 0.0068property 1 0.3157 0.1052 9.0163 0.0027
迴歸方程就是:
logit[p(bad)]=log(p/1-p) =0.6032-0.6536*checking-0.4083*history+0.0248*duration -0.2017*savings+0.3157*property
用下面的公式就可以求出正例的機率(bad的機率):
p=exp(logit)/(exp(logit)+1)
上式求出的是機率值,如何根據機率值把各個客戶歸類,還需要一個閾值,比如,這裡我們簡單地規定,違約機率超過0.5的就歸為bad,其餘為good。把上述公式代入valid資料中,
data valid_p;set valid;logit=0.6032-0.6536*checking-0.4083*history+0.0248*duration-0.2017*savings+0.3157*property;p=exp(logit)/(exp(logit)+1);if p<0.5 then good_bad_predicted='good';else good_bad_predicted='bad';keep good_bad p good_bad_predicted;run;
從下面的局部的資料valid_p可以看到,一些實際上是good的客戶,根據我們的模型(閾值p取0.5),卻預測他為bad(套用我們假設檢驗的黑話,這就犯了“棄真”的錯誤),對一些原本是bad的客戶,卻預測他為good(“取偽”錯誤),當然,對更多的客戶,good還預測成good,bad還預測成bad:
good_bad p good_bad_predictedbad 0.61624 badbad 0.03607 goodgood 0.12437 goodgood 0.21680 goodgood 0.34833 goodgood 0.69602 badbad 0.68873 badgood 0.48351 goodgood 0.03288 goodgood 0.06789 goodgood 0.61195 badgood 0.15306 good
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;
對照上表,結果如下:
預測10實1,badd, True Positive,48c, False Negative,98c+d, Actual Positive,146際0,goodb, False Positive,25a, True Negative,229a+b, Actual Negative,254b+d, Predicted Positive,73a+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)。
下期預告:ROC
以上我們用列聯表求覆蓋率等指標,需要指定一個閾值(threshold)。同樣,我們在valid_roc資料中,看到針對不同的閾值,而產生的相應的覆蓋率。我們還可以看到,隨著閾值的減小(更多的客戶就會被歸為正例),sensitivity和1-Specificity也相應增加(也即Specificity相應減少)。把基於不同的閾值而產生的一系列sensitivity和Specificity描繪到直角座標上,就能更清楚地看到它們的對應關係。由於sensitivity和Specificity的方向剛好相反,我們把sensitivity和1-Specificity描繪到同一個圖中,它們的對應關係,就是傳說中的ROC曲線,全稱是receiver
operating characteristic curve,中文叫“接受者操作特性曲線”。欲知後事如何,且聽下回分解。
參考資料:
- Mithat Gonen. 2007. Analyzing Receiver Operating Characteristic Curves with SAS. Cary, NC: SAS Institute Inc.
- Dan Kelly, etc. 2007. Predictive Modeling Using Logistic Regression Course Notes. Cary, NC: SAS Institute Inc.
- Confusion Matrix, seehttp://www2.cs.uregina.ca/~dbd/cs831/notes/confusion_matrix/confusion_matrix.html
This entry was posted in 資料採礦與機器學習, 生物與醫學統計, 統計軟體 and
tagged Confusion Matrix,Logistic迴歸, SAS, Sensitiveity, Specificity, 分類模型, 命中率, 資料採礦, 混淆矩陣, 覆蓋率 by 胡江堂.
Bookmark the permalink.