1. 程式人生 > >【詳解】銀行信用評分卡中的WOE在幹什麼?WOE的意義?為什麼可以使用WOE值代替原來的特徵值來做LR的訓練輸入資料

【詳解】銀行信用評分卡中的WOE在幹什麼?WOE的意義?為什麼可以使用WOE值代替原來的特徵值來做LR的訓練輸入資料

其實我是帶著這個問題發現這篇帖子的

為什麼可以使用WOE值代替原來的特徵值來做LR的訓練輸入資料

以下為原文

https://zhuanlan.zhihu.com/p/30026040

WOE & IV

woe全稱叫Weight of Evidence,常用在風險評估、授信評分卡等領域。

IV全稱是Information value,可通過woe加權求和得到,衡量自變數對應變數的預測能力。

雖然網上到處都是神經網路、xgboost的文章,但當下的建模過程中(至少在金融風控領域)並沒有完全擺脫logistic模型,原因大致有以下幾點:

  1. logistic模型客群變化的敏感度不如其他高複雜度模型,因此穩健更好,魯棒性更強。
  2. 模型直觀。係數含義好闡述、易理解。對金融領域高管以及銀行出身的建模專家,變數係數可以跟他們的業內知識做交叉驗證,更容易讓人信服。
  3. 也是基於2的模型直觀性,當模型效果衰減的時候,logistic模型能更好的診斷病因。

IV值我相信相關領域的人都用過,所以本文不展開講。

本文主要講的是WOE具有什麼意義,或者說我們能從WOE中獲得什麼資訊。

-------------------------------------本文目錄-------------------------------------

一、 WOE的意義

二、 如何計算WOE

三、 WOE的單調性

---1. WOE做差(引入)

---2. Odds Ratio

----------a. OR的計算

----------b. OR在邏輯迴歸中的意義

----------c. OR的估計值與WOE

---3. 回到正題(WOE單調意義)

四、 WOE呈線性&WOE編碼的意義

五、 淺談WOE與貝葉斯


一、先總結WOE的意義(這樣才有看下去的動力

計算woe(以及IV)的意義我所知的有以下幾點:

  • IV值可以衡量各變數對y的預測能力,用於篩選變數。
  • 對離散型變數,woe可以觀察各個level間的跳轉對odds的提升是否呈線性,而IV可以衡量變數整體(而不是每個level)的預測能力。
當你有千級別或者萬級別的欄位時,建模前計算IV值是很有必要的。以地區郵編為例,level很多,每個level下樣本少,常規的處理是用dummy encoding將n個level的變數拆成n-1個啞變數,然後建模做檢驗,得到這n-1個啞變數的顯著性,再對n-1個啞變數做聚類等處理才能feed in model。如果到最後你不管怎麼處理都不太好feed進model,那就白忙了,場面會相當的尷尬。這個時候就體現了事先計算IV值來篩選變數的重要性了。
  • 對連續型變數,woe和IV值為分箱的合理性提供了一定的依據。
分箱處理連續型變數會有資訊損失,但由於絕大多數情況下連續型變數對odds的提升都不是線性的,這裡能產生的負面影響遠比資訊損失要大,因此一般都需要做分箱處理。
  • 用woe編碼可以處理缺失值問題。
  • 歡迎補充

二、如何計算WOE

以信用評分卡的建模場景為例:X是客戶樣本欄位,Y表示客戶逾期與否,其中Y=1代表逾期,Y=0代表未逾期。 我們希望能用客戶已知的資訊來預測客戶借款後發生逾期的概率,以此來決定是否放貸。

下面我們拿Age(年齡)這個變數來計算相關的woe ,首先對每個level分層統計【表1】:

然後計算各分層的好壞佔比【表2】

最後通過好壞佔比計算woe【表3】

以上三個表就是計算woe的過程,簡單易懂。

接下來我們講講woe該怎麼用以及有什麼意義。


三、WOE的單調性(涉及odds ratio)

3.1 WOE做差是什麼?

當我們算完woe的時候,我們關注的點一般會有這幾個:woe是否單調、woe是否呈線性、以及IV值的大小。 這裡講一下單調和線性的意義,主要跟logistic迴歸中的odds ratio相關。

 

剛接觸woe的時候,為了研究它的單調性是什麼,我嘗試著將WOE做差,發現得到的結果跟Odds Ratio的形式很像,都是列聯表交叉乘做商:

\begin{equation} \begin{aligned} WOE_{Age_{1}}-WOE_{Age_{2}}&=ln(\frac{Bad\%_{Age_{1}}}{Good\%_{Age_{1}}})-ln(\frac{Bad\%_{Age_{2}}}{Good\%_{Age_{2}}})\\ &=ln(\frac{Bad\%_{Age_{1}}}{Bad\%_{Age_{2}}}*\frac{Good\%_{Age_{2}}}{Good\%_{Age_{1}}})\\ &=ln(\frac{\#Bad_{Age_{1}}}{\#Bad_{Age_{2}}}*\frac{\#Good_{Age_{2}}}{\#Good_{Age_{1}}}) \end{aligned} \end{equation}


3.2 Odds Ratio(OR)

為了瞭解WOE,這裡分三步簡單講一下Odds Ratio(優勢比)。

a. OR的計算

首先要知道Odds(優勢),指的是事件發生和不發生的比例,即:

Odds=\frac{p}{1-p}

下面我們設定這個事件為客戶逾期,即Y=1。那麼 Age=Age_{1} 時的Odds為:

\begin{equation} \begin{aligned} Odds_{Age_{1}}&=\frac{P(Y=1|Age=Age_{1})}{P(Y=0|Age=Age_{1})}\\ \end{aligned} \end{equation}

而Odds Ratio則是兩組odds的比值,比如 Age_{1} 和 Age_{2} 之間的Odds Ratio為:

\begin{equation} \begin{aligned} OR_{Age2/Age1}&=\frac{Odds_{Age_{2}}}{Odds_{Age_{1}}}\\ &=\frac{P(Y=1|Age=Age_{2})/P(Y=0|Age=Age_{2})}{P(Y=1|Age=Age_{1})/P(Y=0|Age=Age_{1})} \\ \end{aligned} \end{equation}

 

b. OR在邏輯迴歸中的意義

Odds和Odds ratio在logistic中非常值得重視,因為他們跟引數的interpretation密切相關。

logistic迴歸中:

\begin{equation} \begin{aligned} ln\frac{p}{1-p}&=\beta_{0}x_{0}+\beta_{1}x_{1}+...+\beta_{n}x_{n} \end{aligned} \end{equation}

【OR的意義】當 x_{i} 增加1個單位時,odds將變為原來的 e^{a_{i}} 

\begin{equation} \begin{aligned} OR_{x_{i}+1/x_{i}}&=\frac{Odds_{2}}{Odds_{1}}=\frac{p_{1}/(1-p_{1})}{p_{2}/(1-p_{2})}\\ &=\frac{e^{\sum_{j\ne i}{\beta_{j}x_{j}}+\beta_{i}(x_{i}+1)}}{e^{\sum_{j\ne i}{\beta_{j}x_{j}}+\beta_{i}x_{i}}}\\ &=e^{\beta_{i}} \end{aligned} \end{equation}

OR在logistic中的意義在上面講完了,下面來講下OR是怎麼和WOE聯絡起來的。

 

c. OR的估計值(Marginal OR)與WOE

一般的,我們可以通過列聯表計算Odds和Odds Ratio的估計值。

【值得注意的是】通過列聯表算得的 \widehat{OR} 是指Marginal OR,大家可以將Marginal OR理解為模型 y\sim x_{i} 的 e^{\beta_{i}} ,這是個單變量回歸模型。本文中涉及WOE的OR指的都是Marginal OR。而多元迴歸中的 e^{\beta_{i}} 對應的是Conditional OR。兩者是不一樣的。

\begin{equation} \begin{aligned} \widehat{Odds_{Age_{1}}}&=\frac{\#(Y=1)_{Age_{1}}}{\#(Y=0)_{Age_{1}}} =\frac{\#Bad_{Age_{1}}}{\#Good_{Age_{1}}}\\ \widehat{OR_{Age_{2}/Age_{1}}}&=\frac{\widehat{Odds_{Age_{2}}}}{\widehat{Odds_{Age_{1}}}}\\ &=\frac{\#Bad_{Age_{2}}}{\#Bad_{Age_{1}}}*\frac{\#Good_{Age_{1}}}{\#Good_{Age_{2}}} \\ ln(\widehat{OR_{Age_{2}/Age_{1}}})&=WOE_{Age_{1}}-WOE_{Age_{2}}\\ &=\beta \quad in \quad Y\sim Age, Age\in \{Age_{1},Age_{2} \} \end{aligned} \end{equation}


3.3 回到正題

結合上面OR的知識,WOE單調實際上就意味著當 Age_{i} 從Age_{1} \rightarrow Age_{2} \rightarrow Age_{3}\rightarrow Age_{4}\rightarrow Age_{5} 單調上升時,相應的 Odds_{Age_{i}} 也呈現單調遞增(遞減), P(Y=1|Age_{i}) 也呈單調遞增(遞減)。

 

我們可以用一個更簡潔的公式概括上面的計算過程:

\underbrace{ln\frac{P(Y=1|Age_{i})}{P(Y=0|Age_{i})}}_{ln(Odds_{Age_{i}})} =\underbrace{ln\frac{P(Y=1)}{P(Y=0)}}_{sample\_odds(常數)}+\underbrace{ln\frac{P(Age_{i}|Y=1)}{P(Age_{i}|Y=0)}}_{WOE_{Age_{i}}}

從上式可以看出, ln(Odds_{Age_{i}}) 和 WOE_{Age_{i}} 只差了一個常數。也就是說 WOE_{Age_{i}} 越大, P(Y=1|Age_{i}) 越大。

#----------------------證明WOE之差與OR相等--------------------
import pandas as pd
import numpy as np
df=pd.DataFrame({'X1':np.random.randint(3,size=1000),\
                 'y':np.random.randint(2,size=1000)})
table=pd.crosstab(df['y'],df['X1'])
# 計算WOE差值
woe_table=table.div(table.sum(axis=1),axis=0)
woe=(woe_table.iloc[1,:]/woe_table.iloc[0,:]).apply(lambda x:np.log(x))
woe[1]-woe[0],woe[2]-woe[1]
# 計算OR
OR_0_1=np.log(1.0*table.iloc[0,0]*table.iloc[1,1]/table.iloc[0,1]/table.iloc[1,0])
OR_1_2=np.log(1.0*table.iloc[0,1]*table.iloc[1,2]/table.iloc[0,2]/table.iloc[1,1])
OR_0_1,OR_1_2

四、WOE呈線性&WOE編碼 的意義

WOE呈線性是一個很強的條件,比單調要強得多。一般來說是不會這麼巧出現線性的情況的,我之所以要提,是因為我們可以通過WOE編碼人為地讓它呈線性,這個後面再提。

 

先說WOE呈線性的意義

如果一個變數的不同level(假設各level分別以 0,1,2,3...進行編碼)的WOE呈線性,說明該變數每增加一個單位,對Odds產生的影響是一樣的。

還記得開篇提到的郵政編碼的例子麼?在那裡我們需要對屬性變數做dummy encoding,因為我們不能保證變數從任意  level_{i} 跳轉到  level_{i+1} 時對Odds產生的影響都一樣,所以不能用{0,1,2,3...}這樣等間距的編碼方式。

 

WOE編碼的意義

而WOE近似於事先計算了變數各level的Marginal Odds,將對應的WOE取代屬性變數的原始值{0,1,2,3...},即使用WOE編碼,可以使得該變數每增加一個單位,Odds就增加相同的值,參考下圖。

結論就是:如果使用了WOE編碼,當我們對單變數進行迴歸(Y~Xi)時,可以不做dummy encoding,此時變數的係數恆為1。WOE編碼起到了把迴歸係數“正則化”的作用。

程式碼提供驗證:

from sklearn.linear_model import LogisticRegression   
import pandas as pd
import numpy as np
df=pd.DataFrame({'X1':np.random.randint(3,size=1000),\
                 'y':np.random.randint(2,size=1000)})
table=pd.crosstab(df['y'],df['X1'])
ratio_table=table.div(table.sum(axis=1),axis=0)
woe=ratio_table.iloc[1,:]/ratio_table.iloc[0,:]
# 使用WOE編碼後,觀察模型係數
df.X1=df.X1.replace({0:woe[0],1:woe[1],2:woe[2]})
glm=LogisticRegression(C=1e10)
glm.fit(df.loc[:,['X1']],df.y)
glm.coef_

 

五、 淺談WOE與貝葉斯

到收尾部分了,這裡主要想說明一個問題:上面WOE解決的問題都是對單變量回歸有效,在多元logistic迴歸裡仍然有效麼?

答案是無效的,多元logistic迴歸裡的係數並不會因為WOE編碼而全部等於1。

WOE也好,IV也好,做的都是單變數分析。我們認為對Y有較好預測能力的變數,在多元迴歸時仍然會有較好的預測能力。基於此邏輯可以用IV值來對變數的重要性進行排序。

 

WOE與貝葉斯因子的聯絡

簡單提下貝葉斯因子,就不展開講了,各位可以上網查Bayes factor

\underbrace{ln\frac{P(Y=1|Age_{i})}{P(Y=0|Age_{i})}}_{ln(Odds_{Age_{i}})} =\underbrace{ln\frac{P(Y=1)}{P(Y=0)}}_{sample\_odds(常數)}+\underbrace{ln\underbrace{\frac{P(Age_{i}|Y=1)}{P(Age_{i}|Y=0)}}_{Bayes\_Factor}}_{WOE_{Age_{i}}}

當變數不止一個的時候,如果任意X_{i} 和 X_{j} 關於 Y條件獨立的話,則有:

\begin{equation} \begin{aligned} ln\frac{P(Y=1|x_{1},x_{2},...,x_{k})}{P(Y=0|x_{1},x_{2},...,x_{k})} =ln\frac{P(Y=1)}{P(Y=0)}+ln\frac{P(x_{1},...,x_{k}|Y=1)}{P(x_{1},...,x_{k}|Y=0)}\\ \xlongequal[independent]{conditionally}ln\frac{P(Y=1)}{P(Y=0)}+\sum_{i=1}^{k}{ln\underbrace{\frac{P(x_{i}|Y=1)}{P(x_{i}|Y=0)}}_{Bayes\_Factor_{X_{i}}}} \end{aligned} \end{equation}

條件獨立經常跟貝葉斯相關的東西扯上關係,比如說樸素貝葉斯分類器,之所以“樸素”,就是因為各變數關於Y條件獨立這一強假設。如果不滿足條件獨立,那麼就會出現多個變數對結果產生協同影響的情況,極其影響結果。

 

為了弱化條件獨立這一個強假設,出現了非完全樸素的貝葉斯分類器(semi-Bayes)

semi-Bayes 總體來說就是用各種規則來對變數進行加權(特別地,當權值是0/1的時候就是進行變數篩選了,並認為篩選後的變數條件獨立),以此來抑制相關變數的協同影響。

我們將semi的思想用在上式,便有:

\begin{equation} \begin{aligned} ln\frac{P(Y=1|x_{1},x_{2},...,x_{k})}{P(Y=0|x_{1},x_{2},...,x_{k})} \xlongequal[]{semi}ln\frac{P(Y=1)}{P(Y=0)}+\sum_{i=1}^{k}{\beta _{i} \underbrace{ln\underbrace{\frac{P(x_{i}|Y=1)}{P(x_{i}|Y=0)}}_{Bayes\_Factor_{X_{i}}}}_{WOE_{x_{i}}}} \end{aligned} \end{equation}

這個就是用WOE編碼後的logistic模型。

所以說WOE編碼其實也可以從非完全條件獨立的貝葉斯因子的角度去看待。

對WOE的介紹就到此結束了

 

剛寫完,可能公式和排版等方面會有疏漏

歡迎交流和指正~