【詳解】銀行信用評分卡中的WOE在幹什麼?

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的形式很像,都是列聯表交叉乘做商:

egin{equation} egin{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為:

egin{equation} egin{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為:

egin{equation} egin{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回歸中:

egin{equation} egin{aligned} lnfrac{p}{1-p}&=eta_{0}x_{0}+eta_{1}x_{1}+...+eta_{n}x_{n} end{aligned} end{equation}

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

egin{equation} egin{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
e i}{eta_{j}x_{j}}+eta_{i}(x_{i}+1)}}{e^{sum_{j
e i}{eta_{j}x_{j}}+eta_{i}x_{i}}}\ &=e^{eta_{i}} end{aligned} end{equation}

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

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

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

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

egin{equation} egin{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}}\ &=eta quad in quad Ysim Age, Agein {Age_{1},Age_{2} } end{aligned} end{equation}


3.3 回到正題

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

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

underbrace{lnfrac{P(Y=1|Age_{i})}{P(Y=0|Age_{i})}}_{ln(Odds_{Age_{i}})} =underbrace{lnfrac{P(Y=1)}{P(Y=0)}}_{sample\_odds(常數)}+underbrace{lnfrac{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 pdimport numpy as npdf=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]# 計算OROR_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 pdimport numpy as npdf=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{lnfrac{P(Y=1|Age_{i})}{P(Y=0|Age_{i})}}_{ln(Odds_{Age_{i}})} =underbrace{lnfrac{P(Y=1)}{P(Y=0)}}_{sample\_odds(常數)}+underbrace{lnunderbrace{frac{P(Age_{i}|Y=1)}{P(Age_{i}|Y=0)}}_{Bayes\_Factor}}_{WOE_{Age_{i}}}

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

egin{equation} egin{aligned} lnfrac{P(Y=1|x_{1},x_{2},...,x_{k})}{P(Y=0|x_{1},x_{2},...,x_{k})} =lnfrac{P(Y=1)}{P(Y=0)}+lnfrac{P(x_{1},...,x_{k}|Y=1)}{P(x_{1},...,x_{k}|Y=0)}\ xlongequal[independent]{conditionally}lnfrac{P(Y=1)}{P(Y=0)}+sum_{i=1}^{k}{lnunderbrace{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的思想用在上式,便有:

egin{equation} egin{aligned} lnfrac{P(Y=1|x_{1},x_{2},...,x_{k})}{P(Y=0|x_{1},x_{2},...,x_{k})} xlongequal[]{semi}lnfrac{P(Y=1)}{P(Y=0)}+sum_{i=1}^{k}{eta _{i} underbrace{lnunderbrace{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的介紹就到此結束了

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

歡迎交流和指正~

大家對專欄的關注讓我倍感榮幸,如果關注是代表一種認可的話,希望大家也不要吝嗇手中點贊的權利

推薦閱讀:

Kaggle機器學習之泰坦尼克號生還預測
敲黑板!從零開始,小白如何通過Kaggle競賽提高數據分析能力!
分析競爭力,數字時代的差異化競爭優勢
R語言起步--excel透視表功能實現

TAG:金融科技 | 建模 | 數據分析 |