天天看點

python 繪制lift曲線_二分類模型性能評價(R語言,logistic回歸,ROC曲線,lift曲線,lorenz曲線)...

解決分類問題有多種思路,包括應用支援向量機、決策樹等算法。還有一種較正常的做法是采用廣義線性回歸中的logistic回歸或probit回歸。廣義線性回歸是探索“響應變量的期望”與“自變量”的關系,以實作對非線性關系的某種拟合。這裡面涉及到一個“連接配接函數”和一個“誤差函數”,“響應變量的期望”經過連接配接函數作用後,與“自變量”存線上性關系。選取不同的“連接配接函數”與“誤差函數”可以構造不同的廣義回歸模型。當誤差函數取“二項分布”而連接配接函數取“logit函數”時,就是常見的“logistic回歸模型”,在0-1響應的問題中得到了大量的應用。

logistic回歸的公式可以表示為:

python 繪制lift曲線_二分類模型性能評價(R語言,logistic回歸,ROC曲線,lift曲線,lorenz曲線)...

其中P是響應變量取1的機率,在0-1變量的情形中,這個機率就等于響應變量的期望。

這個公式也可以寫成:

python 繪制lift曲線_二分類模型性能評價(R語言,logistic回歸,ROC曲線,lift曲線,lorenz曲線)...

可以看出,logistic回歸是對0-1響應變量的期望做logit變換,然後與自變量做線性回歸。參數估計采用極大似然估計,顯著性檢驗采用似然比檢驗。

建立模型并根據AIC準則選擇模型後,可以對未知資料集進行預測,進而實作分類。模型預測的結果是得到每一個樣本的響應變量取1的機率,為了得到分類結果,需要設定一個門檻值p0——當p大于p0時,認為該樣本的響應變量為1,否則為0。門檻值大小對模型的預測效果有較大影響,需要進一步考慮。首先必須明确模型預測效果的評價名額。

對于0-1變量的二分類問題,分類的最終結果可以用表格表示為:

python 繪制lift曲線_二分類模型性能評價(R語言,logistic回歸,ROC曲線,lift曲線,lorenz曲線)...

其中,d是“實際為1而預測為1”的樣本個數,c是“實際為1而預測為0”的樣本個數,其餘依此類推。

顯然地,主對角線所占的比重越大,則預測效果越佳,這也是一個基本的評價名額——總體準确率(a+d)/(a+b+c+d)。

通常将上述矩陣稱為“分類矩陣”。一般情況下,我們比較關注響應變量取1的情形,将其稱為Positive(正例),而将響應變量取0的情形稱為Negative(負例)。常見的例子包括生物實驗的響應、營銷推廣的響應以及信用評分中的違約等等。針對不同的問題與目的,我們通常采用ROC曲線與lift曲線作為評價logistic回歸模型的名額。

一、ROC曲線

正因為我們比較關注正例的情形,是以設定了兩個相應的名額:TPR與FPR。

TPR:True Positive Rate,将實際的1正确地預測為1的機率,d/(c+d)。

FPR:False Positive Rate,将實際的0錯誤地預測為1的機率,b/(a+b)。

TPR也稱為Sensitivity(即生物統計學中的敏感度),在這裡也可以稱為“正例的覆寫率”——将實際為1的樣本數找出來的機率。覆寫率是重要的名額,例如若分類的目标是找出潛在的劣質客戶(響應變量取值為1),則覆寫率越大表示越多的劣質客戶被找出。

類似地,1-FPR其實就是“負例的覆寫率”,也就是把負例正确地識别為負例的機率。

TPR與FPR互相影響,而我們希望能夠使TPR盡量地大,而FPR盡量地小。影響TPR與FPR的重要因素就是上文提到的“門檻值”。當門檻值為0時,所有的樣本都被預測為正例,是以TPR=1,而FPR=1。此時的FPR過大,無法實作分類的效果。随着門檻值逐漸增大,被預測為正例的樣本數逐漸減少,TPR和FPR各自減小,當門檻值增大至1時,沒有樣本被預測為正例,此時TPR=0,FPR=0。

由上述變化過程可以看出,TPR與FPR存在同方向變化的關系(這種關系一般是非線性的),即,為了提升TPR(通過降低門檻值),意味着FPR也将得到提升,兩者之間存在類似互相制約的關系。我們希望能夠在犧牲較少FPR的基礎上盡可能地提高TPR,由此畫出了ROC曲線。

ROC曲線的全稱為“接受者操作特性曲線”(receiver operating

characteristic),其基本形式為:

python 繪制lift曲線_二分類模型性能評價(R語言,logistic回歸,ROC曲線,lift曲線,lorenz曲線)...

當預測效果較好時,ROC曲線凸向左上角的頂點。平移圖中對角線,與ROC曲線相切,可以得到TPR較大而FPR較小的點。模型效果越好,則ROC曲線越遠離對角線,極端的情形是ROC曲線經過(0,1)點,即将正例全部預測為正例而将負例全部預測為負例。ROC曲線下的面積可以定量地評價模型的效果,記作AUC,AUC越大則模型效果越好。

由于ROC曲線描述了在TPR與FPR之間的取舍,是以我一般将其了解為投入産出曲線,receive of

cost。(事實上我了解錯了。相對而言lorenz曲線更适合這個名字。當然啦其實FPR可以了解為另一種cost。2010.10.15)

當我們分類的目标是将正例識别出來時(例如識别有違約傾向的信用卡客戶),我們關注TPR,此時ROC曲線是評價模型效果的準繩。

二、lift曲線

在營銷推廣活動(例如DM信)中,我們的首要目标并不是盡可能多地找出那些潛在客戶,而是提高客戶的響應率。客戶響應率是影響投入産出比的重要因素。此時,我們關注的不再是TPR(覆寫率),而是另一個名額:命中率。

回顧前面介紹的分類矩陣,正例的命中率是指預測為正例的樣本中的真實正例的比例,即d/(b+d),一般記作PV。

在不使用模型的情況下,我們用先驗機率估計正例的比例,即(c+d)/(a+b+c+d),可以記為k。

定義提升值lift=PV/k。

lift揭示了logistic模型的效果。例如,若經驗告訴我們10000個消費者中有1000個是我們的潛在客戶,則我們向這10000個消費者發放傳單的效率是10%(即客戶的響應率是10%),k=(c+d)/(a+b+c+d)=10%。通過對這10000個消費者進行研究,建立logistic回歸模型進行分類,我們得到有可能比較積極的1000個消費者,b+d=1000。如果此時這1000個消費者中有300個是我們的潛在客戶,d=300,則命中率PV為30%。

此時,我們的提升值lift=30%/10%=3,客戶的響應率提升至原先的三倍,提高了投入産出比。

為了畫lift圖,需要定義一個新的概念depth深度,這是預測為正例的比例,(b+d)/(a+b+c+d)。

與ROC曲線中的TPR和FPR相同,lift和depth也都受到門檻值的影響。

當門檻值為0時,所有的樣本都被預測為正例,是以depth=1,而PV=d/(b+d)=(0+d)/(0+b+0+d)=k,于是lift=1,模型未起提升作用。随着門檻值逐漸增大,被預測為正例的樣本數逐漸減少,depth減小,而較少的預測正例樣本中的真實正例比例逐漸增大。當門檻值增大至1時,沒有樣本被預測為正例,此時depth=0,而lift=0/0。

由此可見,lift與depth存在相反方向變化的關系。在此基礎上作出lift圖:

python 繪制lift曲線_二分類模型性能評價(R語言,logistic回歸,ROC曲線,lift曲線,lorenz曲線)...

與ROC曲線不同,lift曲線凸向(0,1)點。我們希望在盡量大的depth下得到盡量大的lift(當然要大于1),也就是說這條曲線的右半部分應該盡量陡峭。

至此,我們對ROC曲線和lift曲線進行了描述。這兩個名額都能夠評價logistic回歸模型的效果,隻是分别适用于不同的問題:

如果是類似信用評分的問題,希望能夠盡可能完全地識别出那些有違約風險的客戶(不使一人漏網),我們需要考慮盡量增大TPR(覆寫率),同時減小FPR(減少誤殺),是以選擇ROC曲線及相應的AUC作為名額;

如果是做類似資料庫精确營銷的項目,希望能夠通過對全體消費者的分類而得到具有較高響應率的客戶群,進而提高投入産出比,我們需要考慮盡量提高lift(提升度),同時depth不能太小(如果隻給一個消費者發放傳單,雖然響應率較大,卻無法得到足夠多的響應),是以選擇lift曲線作為名額。

按照慣例,我們來做一個試驗。試驗的問題來自我的畢業論文,研究高爐鐵水矽品質分數的波動情況。

簡單地說,我們的響應變量是高爐鐵水矽品質分數的波動方向,記作SI0,當其取1時,表示本爐鐵水矽品質分數比上一爐小,當其取0時,表示本爐鐵水矽品質分數比上一爐大。(之是以這樣設定,是因為通常情況下更需要關注爐溫向涼的情形。)自變量選取為前一爐矽品質分數、前一爐料速、前一爐風量、前兩爐料速。

選取了350爐資料,分為兩組,分别用于模組化與預測

a=data[1:250,]

b=data[251:350,]

a[1:3,]

SI0

SI1

LS1

FL1         LS21

1 0.5825 0.8998203

0.9494003 0.78213472   0 0.5000

0.7933116 0.9334815 0.89982033

0 0.5700 0.7205215 0.8978194 0.7933116

建立logistic回歸模型

glm.logit=glm(SI0~.,data=a,family=binomial(link=logit))

summary(glm.logit)

計算預測值

p=predict(glm.logit,b)

p=exp(p)/(1+exp(p))

将門檻值定為0.5,得到分類結果

b$SI0pred=1*(p>0.5)

計算頻數

table(b[,c(1,6)])

SI0predSI0

1

28   18

1

12   42于是

TPR=77.8%

FPR=39.1%

PV=70%

k=54%

lift=1.3

繪制ROC曲線

TPR=rep(0,1000)

FPR=rep(0,1000)

for(i in 1:1000){

p0=i/1000;

SI0.true=b$SI0

SI0.pred=1*(p>p0)

TPR[i]=sum(SI0.pred*SI0.true)/sum(SI0.true)

FPR[i]=sum(SI0.pred*(1-SI0.true))/sum(1-SI0.true)}

plot(FPR,TPR,type="l",col=2)

points(c(0,1),c(0,1),type="l",lty=2)

python 繪制lift曲線_二分類模型性能評價(R語言,logistic回歸,ROC曲線,lift曲線,lorenz曲線)...