1. 程式人生 > 其它 >分類模型的效能評估——以SAS Logistic迴歸為例: 混淆矩陣

分類模型的效能評估——以SAS Logistic迴歸為例: 混淆矩陣

跑完分類模型(Logistic迴歸、決策樹、神經網路等),我們經常面對一大堆模型評估的報表和指標,如Confusion Matrix、ROC、Lift、Gini、K-S之類(這個單子可以列很長),往往讓很多在業務中需要解釋它們的朋友頭大:“這個模型的Lift是4,表明模型運作良好。——啊,怎麼還要解釋ROC,ROC如何如何,表明模型表現良好……”如果不明白這些評估指標的背後的直覺,就很可能陷入這樣的機械解釋中,不敢多說一句,就怕哪裡說錯。本文就試圖用一個統一的例子(SAS Logistic迴歸),從實際應用而不是理論研究的角度,對以上提到的各個評估指標逐一點評,併力圖表明:

  1. 這些評估指標,都是可以用白話(plain English, 普通話)解釋清楚的;
  2. 它們是可以手算出來的,看到各種軟體包輸出結果,並不是一個無法探究的“黑箱”;
  3. 它們是相關的。你瞭解一個,就很容易瞭解另外一個。

本文從混淆矩陣(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 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

信用評分指幫助貸款機構發放消費信貸的一整套決策模型及其支援技術。一般地,信用評分技術將客戶分為好客戶與壞客戶兩類,比如說,好客戶(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 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)

上式求出的是概率值,如何根據概率值把各個客戶歸類,還需要一個閾值,比如,這裡我們簡單地規定,違約概率超過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_predicted
bad       0.61624       badbad       0.03607       goodgood      0.12437      good
good      0.21680      good
good      0.34833      goodgood      0.69602      badbad       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的客戶,根據我們的模型,卻預測他為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

其中,

  1. a是正確預測到的負例的數量, True Negative(TN,0->0)
  2. b是把負例預測成正例的數量, False Positive(FP, 0->1)
  3. c是把正例預測成負例的數量, False Negative(FN, 1->0)
  4. d是正確預測到的正例的數量, True Positive(TP, 1->1)
  5. a+b是實際上負例的數量,Actual Negative
  6. c+d是實際上正例的個數,Actual Positive
  7. a+c是預測的負例個數,Predicted Negative
  8. 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,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

根據上表,以下就有幾組常用的評估指標(每個指標分中英文兩行):

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.07087

0.54390 0.27397 0.07874

0.53939 0.28767 0.08661

0.52937 0.30137 0.09055

0.51633 0.31507 0.094490.50583 0.32877 0.098430.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,與以上我們通過列聯表計算出來的差不多(閾值0.5)。

以上我們用列聯表求覆蓋率等指標,需要指定一個閾值(threshold)。同樣,我們在valid_roc資料中,看到針對不同的閾值,而產生的相應的覆蓋率。我們還可以看到,隨著閾值的減小(更多的客戶就會被歸為正例),sensitivity和1-Specificity也相應增加(也即Specificity相應減少)。把基於不同的閾值而產生的一系列sensitivity和Specificity描繪到直角座標上,就能更清楚地看到它們的對應關係。由於sensitivity和Specificity的方向剛好相反,我們把sensitivity和1-Specificity描繪到同一個圖中,它們的對應關係,就是傳說中的ROC曲線,全稱是receiver operating characteristic curve,中文叫“接受者操作特性曲線”。

ROC曲線就是不同的閾值下,以下兩個變數的組合:

Sensitivity(覆蓋率,True Positive Rate) 1-Specificity (Specificity, 負例的覆蓋率,True Negative Rate)

二話不說,先把它畫出來(以下指令碼的主體是標紅部分,資料集valid_roc:

axis order=(0 to 1 by .1) label=none length=4in; symbol i=join v=none c=black; symbol2 i=join v=none c=black; proc gplot data = valid_roc; plot _SENSIT_*_1MSPEC_ _1MSPEC_*_1MSPEC_ / overlay vaxis=axis haxis=axis; run; quit;

上圖那條曲線就是ROC曲線,橫軸是1-Specificity,縱軸是Sensitivity。以前提到過,隨著閾值的減小(更多的客戶就會被歸為正例),Sensitivity和1-Specificity也相應增加(也即Specificity相應減少),所以ROC呈遞增態勢(至於ROC曲線凹向原點而非凸向原點,不知道有無直觀的解釋,不提)。那條45度線是作為參照(baseline model)出現的,就是說,ROC的好壞,乃是跟45度線相比的,怎麼講?

回到以前,我們分析valid資料,知道有36.5%的bad客戶(Actual Positive )和63.5%的good客戶(Actual Negative)。這兩個概率是根據以往的資料計算出來的,可以叫做“先驗概率”( prior probability)。後來,我們用logistic迴歸模型,再給每個客戶算了一個bad的概率,這個概率是用模型加以修正的概率,叫做“後驗概率”(Posterior Probability)。

預測

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

如果不用模型,我們就根據原始資料的分佈來指派,隨機地把客戶歸為某個類別,那麼,你得到的True Positive對False Positive之比,應該等於Actual Positive對Actual Negative之比(你做得跟樣本分佈一樣好)——即,d/b=(c+d)/(a+b),可以有(d/c+d)/(b/a+b)=1,而這正好是Sensitivity/(1-Specificity)。在不使用模型的情況下,Sensitivity和1-Specificity之比恆等於1,這就是45度線的來歷。一個模型要有所提升,首先就應該比這個baseline表現要好。ROC曲線就是來評估模型比baseline好壞的一個著名圖例。這個可能不夠直觀,但可以想想線性迴歸的baseline model:

如果不用模型,對因變數的最好估計就是樣本的均值(上圖水平紅線)。綠線是迴歸線(模型),迴歸線與水平線之間的偏離,稱作Explained Variability, 就是由模型解釋了的變動,這個變動(在方差分析裡,又稱作model sum of squares, SSM)越大,模型表現就越好了(決定係數R-square標準)。同樣的類比,ROC曲線與45度線偏離越大,模型的效果就越好。最好好到什麼程度呢?

在最好的情況下,Sensitivity為1(正確預測到的正例就剛好等於實際的正例總數),同時Specificity為1(正確預測到的負例個數就剛好等於實際的負例數),在上圖中,就是左上方的點(0,1)。因此,ROC曲線越往左上方靠攏,Sensitivity和Specificity就越大,模型的預測效果就越好。同樣的思路,你還可以解釋為什麼ROC曲線經過點(0,0)和(1.1),不提。

AUC, Area Under the ROC Curve

ROC曲線是根據與45度線的偏離來判斷模型好壞。圖示的好處是直觀,不足就是不夠精確。到底好在哪裡,好了多少?這就要涉及另一個術語,AUC(Area Under the ROC Curve,ROC曲線下的面積),不過也不是新東西,只是ROC的一個派生而已。

回到先前那張ROC曲線圖。45度線下的面積是0.5,ROC曲線與它偏離越大,ROC曲線就越向左上方靠攏,它下面的面積(AUC)也就應該越大。我們就可以根據AUC的值與0.5相比,來評估一個分類模型的預測效果。

SAS的Logistic迴歸能夠後直接生成AUC值。跑完上面的模型,你可以在結果報告的Association Statistics找到一個叫c的指標,它就是AUC(本例中,c=AUC=0.803,45度線的c=0.5)。

/*注:以上提到的c不是AUC裡面那個’C’。這個c是一個叫Wilcoxon-Mann-Whitney 檢驗的統計量。這個說來話長,不過這個c卻等價於ROC曲線下的面積(AUC)。*/

ROC、AUC:SAS9.2一步到位

SAS9.2有個非常好的新功能,叫ODS Statistical Graphics,有興趣可以去它主頁看看。在SAS9.2平臺提交以下程式碼,Logistic迴歸引數估計和ROC曲線、AUC值等結果就能一起出來(有了上面的鋪墊,就不懼這個黑箱了):

ods graphics on; proc logistic data=train plots(only)=roc; model good_bad=checking history duration savings property; run; ods graphics off;

這個ROC圖貌似還漂亮些,眼神好能看見標出來的AUC是0.8029。 最後提一句,ROC全稱是Receiver Operating Characteristic Curve,中文叫“接受者操作特性曲線”,江湖黑話了(有朋友能不能出來解釋一下,誰是Receiver,為什麼Operating,何謂Characteristic——這個看著好像是Sensitivity和Specificity),不過並不妨礙我們使用ROC作為模型評估的工具。

跟ROC類似,Lift(提升)和Gain(增益)也一樣能簡單地從以前的Confusion Matrix以及Sensitivity、Specificity等資訊中推導而來,也有跟一個baseline model的比較,然後也是很容易畫出來,很容易解釋。

  1. 一些準備

說,混淆矩陣(Confusion Matrix)是我們永遠值得信賴的朋友:

預測

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

幾個術語需要隨時記起:

1. Sensitivity(覆蓋率,True Positive Rate)=正確預測到的正例數/實際正例總數 Recall (True Positive Rate,or Sensitivity) =true positive/total actual positive=d/c+d 2. PV+ (命中率,Precision, Positive Predicted Value) =正確預測到的正例數/預測正例總數 Precision (Positive Predicted Value, PV+) =true positive/ total predicted positive=d/b+d 3. Specificity (負例的覆蓋率,True Negative Rate) =正確預測到的負例個數/實際負例總數 Specificity (True Negative Rate) =true negative/total actual negative=a/a+b

首先記我們valid資料中,正例的比例為pi1(念做pai 1),在我們的例子中,它等於c+d/a+b+c+d=0.365。單獨提出pi1,是因為有時考慮oversampling後的一些小調整,比如正例的比例只有0.001,但我們把它調整為0.365(此時要在SAS proc logistic迴歸的score語句加一個priorevent=0.001選項)。本文不涉及oversampling。現在定義些新變數:

Ptp=proportion of true positives=d/a+b+c+d=(c+d/a+b+c+d)*(d/c+d) =pi1* Sensitivity,正確預測到的正例個數佔總觀測值的比例 Pfp=proportion of false positives=b/a+b+c+d= (a+b/a+b+c+d)*(b/a+b) = (1-c+d/a+b+c+d)*(1-a/a+b) = (1-pi1)*(1- Specificity) ,把負例錯誤地預測成正例的個數佔總數的比例 Depth=proportion allocated to class 1=b+d/a+b+c+d=Ptp+Pfp,預測成正例的比例 PV_plus=Precision (Positive Predicted Value, PV+) = d/b+d=Ptp/depth,正確預測到的正例數佔預測正例總數的比例 Lift= (d/b+d)/(c+d/a+b+c+d)=PV_plus/pi1,提升值,解釋見下節。

以上都可以利用valid_roc資料計算出來:

%let pi1=0.365; data valid_lift; set valid_roc; cutoff=_PROB_; Ptp=&pi1*_SENSIT_; Pfp=(1-&pi1)*_1MSPEC_; depth=Ptp+Pfp; PV_plus=Ptp/depth; lift=PV_plus/&pi1; keep cutoff _SENSIT_ _1MSPEC_ depth PV_plus lift; run;

先前我們說ROC curve是不同閾值下Sensitivity和1-Specificity的軌跡,類似,

Lift chart是不同閾值下Lift和Depth的軌跡 Gains chart是不同閾值下PV+和Depth的軌跡

Lift

Lift = (d/b+d)/(c+d/a+b+c+d)=PV_plus/pi1),這個指標需要多說兩句。它衡量的是,與不利用模型相比,模型的預測能力“變好”了多少。不利用模型,我們只能利用“正例的比例是c+d/a+b+c+d”這個樣本資訊來估計正例的比例(baseline model),而利用模型之後,我們不需要從整個樣本中來挑選正例,只需要從我們預測為正例的那個樣本的子集(b+d)中挑選正例,這時預測的準確率為d/b+d。

顯然,lift(提升指數)越大,模型的執行效果越好。如果這個模型的預測能力跟baseline model一樣,那麼d/b+d就等於c+d/a+b+c+d(lift等於1),這個模型就沒有任何“提升”了(套一句金融市場的話,它的業績沒有跑過市場)。這個概念在資料庫營銷中非常有用,舉個例子

比如說你要向選定的1000人郵寄調查問卷(a+b+c+d=1000)。以往的經驗告訴你大概20%的人會把填好的問卷寄回給你,即1000人中有200人會對你的問卷作出迴應(response,c+d=200),用統計學的術語,我們說baseline response rate是20%(c+d/a+b+c+d=20%)。

如果你現在就漫天郵寄問卷,1000份你期望能收回200份,這可能達不到一次問卷調查所要求的回收率,比如說工作手冊規定郵寄問卷回收率要在25%以上。

通過以前的問卷調查,你收集了關於問卷採訪物件的相關資料,比如說年齡、教育程度之類。利用這些資料,你確定了哪類被訪問者對問卷反應積極。假設你已經利用這些過去的資料建立了模型,這個模型把這1000人分了類,現在你可以從你的千人名單中挑選出反應最積極的100人來(b+d=100),這10%的人的反應率 (response rate)為60%(d/b+d=60%,d=60)。那麼,對這100人的群體(我們稱之為Top 10%),通過運用我們的模型,相對的提升(lift value)就為60%/20%=3;換句話說,與不運用模型而隨機選擇相比,運用模型而挑選,效果提升了3倍。

上面說lift chart是不同閾值下Lift和Depth的軌跡,先畫出來:

symbol i=join v=none c=black; proc gplot data=valid_lift; plot lift*depth; run; quit;

上圖的縱座標是lift,意義已經很清楚。橫座標depth需要多提一句。以前說過,隨著閾值的減小,更多的客戶就會被歸為正例,也就是depth(預測成正例的比例)變大。當閾值設得夠大,只有一小部分觀測值會歸為正例,但這一小部分(一小撮)一定是最具有正例特徵的觀測值集合(用上面資料庫營銷的例子來說,這一部分人群對郵寄問卷反應最為活躍),所以在這個depth下,對應的lift值最大。

同樣,當閾值設定得足夠的小,那麼幾乎所有的觀測值都會被歸為正例(depth幾乎為1)——這時分類的效果就跟baseline model差不多了,相對應的lift值就接近於1。

一個好的分類模型,就是要偏離baseline model足夠遠。在lift圖中,表現就是,在depth為1之前,lift一直保持較高的(大於1的)數值,也即曲線足夠的陡峭。

/*注:在一些應用中(比如信用評分),會根據分類模型的結果,把樣本分成10個數目相同的子集,每一個子集稱為一個decile,其中第一個decile擁有最多的正例特徵,第二個decile次之,依次類推,以上lift和depth組合就可以改寫成lift和decile的組合,也稱作lift圖,含義一樣。剛才提到,“隨著閾值的減小,更多的客戶就會被歸為正例,也就是depth(預測成正例的比例)變大。當閾值設得夠大,只有一小部分觀測值會歸為正例,但這一小部分(第一個decile)一定是最具有正例特徵的觀測值集合。”*/

Gains

Gains (增益) 與 Lift (提升)相當類似:Lift chart是不同閾值下Lift和Depth的軌跡,Gains chart是不同閾值下PV+和Depth的軌跡,而PV+=lift*pi1= d/b+d(見上),所以它們顯而易見的區別就在於縱軸刻度的不同:

symbol i=join v=none c=black; proc gplot data=valid_lift; plot pv_plus*depth; run; quit;

上圖閾值的變化,含義與lift圖一樣。隨著閾值的減小,更多的客戶就會被歸為正例,也就是depth(預測成正例的比例,b+d/a+b+c+d)變大(b+d變大),這樣PV+(d/b+d,正確預測到的正例數佔預測正例總數的比例)就相應減小。當閾值設定得足夠的小,那麼幾乎所有的觀測值都會被歸為正例(depth幾乎為1),那麼PV+就等於資料中正例的比例pi1了(這裡是0.365。在Lift那一節裡,我們說此時分類的效果就跟baseline model差不多,相對應的lift值就接近於1,而PV+=lift*pi1。Lift的baseline model是縱軸上恆等於1的水平線,而Gains的baseline model是縱軸上恆等於pi1的水平線)。顯然,跟lift 圖類似,一個好的分類模型,在閾值變大時,相應的PV+就要變大,曲線足夠陡峭。

/*注:我們一般看到的Gains Chart,圖形是往上走的,咋一看跟上文相反,其實道理一致,只是座標選擇有差別,不提。*/