跑完分類模型(Logistic回歸、決策樹、神經(jīng)網(wǎng)絡等),我們經(jīng)常面對一大堆模型評估的報表和指標,如Confusion Matrix、ROC、Lift、Gini、K-S之類(這個單子可以列很長),往往讓很多在業(yè)務中需要解釋它們的朋友頭大:“這個模型的Lift是4,表明模型運作良好。——啊,怎么還要解釋ROC,ROC如何如何,表明模型表現(xiàn)良好……”如果不明白這些評估指標的背后的直覺,就很可能陷入這樣的機械解釋中,不敢多說一句,就怕哪里說錯。本文就試圖用一個統(tǒng)一的例子(SAS Logistic回歸),從實際應用而不是理論研究的角度,對以上提到的各個評估指標逐一點評,并力圖表明:
本文從混淆矩陣(Confusion Matrix,或分類矩陣,Classification Matrix)開始,它最簡單,而且是大多數(shù)指標的基礎。 數(shù)據(jù)本文使用一個在信用評分領域非常有名的免費數(shù)據(jù)集,German Credit Dataset,你可以在UCI Machine Learning Repository找到(下載;數(shù)據(jù)描述)。另外,你還可以在SAS系統(tǒng)的Enterprise Miner的演示數(shù)據(jù)集中找到該數(shù)據(jù)的一個版本(dmagecr.sas7bdat)。以下把這個數(shù)據(jù)分為兩部分,訓練數(shù)據(jù)train和驗證數(shù)據(jù)valid,所有的評估指標都是在valid數(shù)據(jù)中計算(純粹為了演示評估指標,在train數(shù)據(jù)里計算也未嘗不可),我們感興趣的二分變量是good_bad,取值為{good, bad}: Train data good_bad Frequency Percent ------------------------------------------- bad 154 25.67 good 446 74.33 Valid data good_bad Frequency Percent -------------------------------------------- bad 146 36.50 good 254 63.50 信用評分指幫助貸款機構發(fā)放消費信貸的一整套決策模型及其支持技術。一般地,信用評分技術將客戶分為好客戶與壞客戶兩類,比如說,好客戶(good)能夠按期還本付息(履約),違約的就是壞客戶(bad)。具體做法是根據(jù)歷史上每個類別(履約、違約)的若干樣本,從已知的數(shù)據(jù)中考察借款人的哪些特征對其拖欠或違約行為有影響,從而測量借款人的違約風險,為信貸決策提供依據(jù)。Logistic回歸是信用評分領域運用最成熟最廣泛的統(tǒng)計技術。 約定在我們的示例數(shù)據(jù)中,要考察的二分變量是good_bad,我們把感興趣的那個取值bad(我們想計算違約的概率),稱作正例(Positive, 1),另外那個取值(good)稱作負例(Negative, 0)。在SAS的Logistic回歸中,默認按二分類取值的升序排列取第一個為positive,所以默認的就是求bad的概率。(若需要求good的概率,需要特別指定)。 模型如果沒有特別說明,以下所有的SAS代碼都在SAS 9.1.3 SP4系統(tǒng)中調(diào)試并運行成功(在生成ROC曲線時,我還會提到SAS9.2的新功能)。 proc logistic data=train; model good_bad=checking history duration savings property; run; 這個數(shù)據(jù)很整齊,能做出很漂亮的模型,以下就直接貼出參數(shù)估計的結果: Analysis of Maximum Likelihood Estimates Standard Wald Parameter DF Estimate Error Chi-Square Pr > ChiSq Intercept 1 0.6032 0.4466 1.8242 0.1768 checking 1 -0.6536 0.0931 49.3333 <.0001 history 1 -0.4083 0.0980 17.3597 <.0001 duration 1 0.0248 0.00907 7.4820 0.0062 savings 1 -0.2017 0.0745 7.3308 0.0068 property 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) 上式求出的是概率值,如何根據(jù)概率值把各個客戶歸類,還需要一個閾值,比如,這里我們簡單地規(guī)定,違約概率超過0.5的就歸為bad,其余為good。把上述公式代入valid數(shù)據(jù)中, 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; 從下面的局部的數(shù)據(jù)valid_p可以看到,一些實際上是good的客戶,根據(jù)我們的模型(閾值p取0.5),卻預測他為bad(套用我們假設檢驗的黑話,這就犯了“棄真”的錯誤),對一些原本是bad的客戶,卻預測他為good(“取偽”錯誤),當然,對更多的客戶,good還預測成good,bad還預測成bad: good_bad p good_bad_predicted bad 0.61624 bad bad 0.03607 good good 0.12437 good good 0.21680 good good 0.34833 good good 0.69602 bad bad 0.68873 bad good 0.48351 good good 0.03288 good good 0.06789 good good 0.61195 bad good 0.15306 good Confusion Matrix, 混淆矩陣一個完美的分類模型就是,如果一個客戶實際上(Actual)屬于類別good,也預測成(Predicted)good,處于類別bad,也就預測成bad。但從上面我們看到,一些實際上是good的客戶,根據(jù)我們的模型,卻預測他為bad,對一些原本是bad的客戶,卻預測他為good。我們需要知道,這個模型到底預測對了多少,預測錯了多少,混淆矩陣就把所有這些信息,都歸到一個表里: 預測 1 0 實 1 d, True Positive c, False Negative c+d, Actual Positive 際 0 b, False Positive a, True Negative a+b, Actual Negative b+d, Predicted Positive a+c, Predicted Negative 其中,
以上似乎一下子引入了許多概念,其實不必像咋一看那么復雜,有必要過一下這里的概念。實際的數(shù)據(jù)中,客戶有兩種可能{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得到以上數(shù)字: proc freq data=valid_p; tables good_bad*good_bad_predicted/nopercent nocol norow; run; 對照上表,結果如下: 預測 1 0 實 1,bad d, True Positive,48 c, False Negative,98 c+d, Actual Positive,146 際 0,good b, False Positive,25 a, True Negative,229 a+b, Actual Negative,254 b+d, Predicted Positive,73 a+c, Predicted Negative,327 400 根據(jù)上表,以下就有幾組常用的評估指標(每個指標分中英文兩行): 1. 準確(分類)率VS.誤分類率準確(分類)率=正確預測的正反例數(shù)/總數(shù) Accuracy=true positive and true negative/total cases= a+d/a+b+c+d=(48+229)/(48+98+25+229)=69.25% 誤分類率=錯誤預測的正反例數(shù)/總數(shù) Error rate=false positive and false negative/total cases=b+c/a+b+c+d=1-Accuracy=30.75% 2. (正例的)覆蓋率VS. (正例的)命中率覆蓋率=正確預測到的正例數(shù)/實際正例總數(shù), Recall(True Positive Rate,or Sensitivity)=true positive/total actual positive=d/c+d=48/(48+98)=32.88% /*注:覆蓋率(Recall)這個詞比較直觀,在數(shù)據(jù)挖掘領域常用。因為感興趣的是正例(positive),比如在信用卡欺詐建模中,我們感興趣的是有高欺詐傾向的客戶,那么我們最高興看到的就是,用模型正確預測出來的欺詐客戶(True Positive)cover到了大多數(shù)的實際上的欺詐客戶,覆蓋率,自然就是一個非常重要的指標。這個覆蓋率又稱Sensitivity, 這是生物統(tǒng)計學里的標準詞匯,SAS系統(tǒng)也接受了(誰有直觀解釋?)。 以后提到這個概念,就表示為, Sensitivity(覆蓋率,True Positive Rate)。 */ 命中率=正確預測到的正例數(shù)/預測正例總數(shù) Precision(Positive Predicted Value,PV+)=true positive/ total predicted positive=d/b+d=48/(48+25)=65.75% /*注:這是一個跟覆蓋率相對應的指標。對所有的客戶,你的模型預測,有b+d個正例,其實只有其中的d個才擊中了目標(命中率)。在數(shù)據(jù)庫營銷里,你預測到b+d個客戶是正例,就給他們郵寄傳單發(fā)郵件,但只有其中d個會給你反饋(這d個客戶才是真正會響應的正例),這樣,命中率就是一個非常有價值的指標。 以后提到這個概念,就表示為PV+(命中率,Positive Predicted Value)*。/ 3.Specificity VS. PV-負例的覆蓋率=正確預測到的負例個數(shù)/實際負例總數(shù) Specificity(True Negative Rate)=true negative/total actual negative=a/a+b=229/(25+229)=90.16% /*注:Specificity跟Sensitivity(覆蓋率,True Positive Rate)類似,或者可以稱為“負例的覆蓋率”,也是生物統(tǒng)計用語。以后提到這個概念,就表示為Specificity(負例的覆蓋率,True Negative Rate) 。*/ 負例的命中率=正確預測到的負例個數(shù)/預測負例總數(shù) 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; 數(shù)據(jù)valid_roc中有幾個我們感興趣的變量:
_PROB_ _SENSIT_ _1MSPEC_
0.54866 0.26712 0.07087
0.54390 0.27397 0.07874
0.53939 0.28767 0.08661
0.52937 0.30137 0.09055
0.51633 0.31507 0.09449
0.50583 0.32877 0.09843
0.48368 0.36301 0.10236
0.47445 0.36986 0.10630
如果閾值選定為0.50583,sensitivity(覆蓋率,true positive rate)就為0.32877,Specificity就是1-0.098425=0.901575,與以上我們通過列聯(lián)表計算出來的差不多(閾值0.5)。 下期預告:ROC以上我們用列聯(lián)表求覆蓋率等指標,需要指定一個閾值(threshold)。同樣,我們在valid_roc數(shù)據(jù)中,看到針對不同的閾值,而產(chǎn)生的相應的覆蓋率。我們還可以看到,隨著閾值的減小(更多的客戶就會被歸為正例),sensitivity和1-Specificity也相應增加(也即Specificity相應減少)。把基于不同的閾值而產(chǎn)生的一系列sensitivity和Specificity描繪到直角坐標上,就能更清楚地看到它們的對應關系。由于sensitivity和Specificity的方向剛好相反,我們把sensitivity和1-Specificity描繪到同一個圖中,它們的對應關系,就是傳說中的ROC曲線,全稱是receiver operating characteristic curve,中文叫“接受者操作特性曲線”。欲知后事如何,且聽下回分解。 參考資料:
|
|
來自: kieojk > 《數(shù)據(jù)挖掘》