分类模型的性能评估——以SAS Logistic回归为例(1): 混淆矩阵
跑完分類模型(Logistic回歸、決策樹、神經(jīng)網(wǎng)絡(luò)等),我們經(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ù)指標的基礎(chǔ)。
數(shù)據(jù)
本文使用一個在信用評分領(lǐng)域非常有名的免費數(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 datagood_bad??? Frequency???? Percent-------------------------------------------bad?????????????? 154????????????? 25.67good???????????? 446????????????? 74.33Valid datagood_bad??? Frequency???? Percent--------------------------------------------bad?????????????? 146????????????? 36.50good???????????? 254????????????? 63.50信用評分指幫助貸款機構(gòu)發(fā)放消費信貸的一整套決策模型及其支持技術(shù)。一般地,信用評分技術(shù)將客戶分為好客戶與壞客戶兩類,比如說,好客戶(good)能夠按期還本付息(履約),違約的就是壞客戶(bad)。具體做法是根據(jù)歷史上每個類別(履約、違約)的若干樣本,從已知的數(shù)據(jù)中考察借款人的哪些特征對其拖欠或違約行為有影響,從而測量借款人的違約風險,為信貸決策提供依據(jù)。Logistic回歸是信用評分領(lǐng)域運用最成熟最廣泛的統(tǒng)計技術(shù)。
約定
在我們的示例數(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ù)估計的結(jié)果:
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)上式求出的是概率值,如何根據(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(套用我們假設(shè)檢驗的黑話,這就犯了“棄真”的錯誤),對一些原本是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????? goodConfusion 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;對照上表,結(jié)果如下:
預測 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ù)挖掘領(lǐng)域常用。因為感興趣的是正例(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_:閾值,比如以上我們選定的0.5
- _SENSIT_:sensitivity(覆蓋率,true positive rate)
- _1MSPEC_ :1-Specificity,為什么提供1-Specificity而不是Specificity,下文有講究。
如果閾值選定為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描繪到直角坐標上,就能更清楚地看到它們的對應關(guān)系。由于sensitivity和Specificity的方向剛好相反,我們把sensitivity和1-Specificity描繪到同一個圖中,它們的對應關(guān)系,就是傳說中的ROC曲線,全稱是receiver operating characteristic curve,中文叫“接受者操作特性曲線”。欲知后事如何,且聽下回分解。
參考資料:
from: http://cos.name/2008/12/measure-classification-model-performance-confusion-matrix/#more-567
總結(jié)
以上是生活随笔為你收集整理的分类模型的性能评估——以SAS Logistic回归为例(1): 混淆矩阵的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LSTM神经网络Demystifying
- 下一篇: 分类模型的性能评估——以SAS Logi