0. Introduction
WOE (weight of evidence): 證據權重
IV (information value): 信息值
計算 WOE 與 IV 值的意義:
(1)用 woe 編碼可以處理缺失值問題。
(2)IV值可以衡量各變量對 y 的預測能力,用於篩選變量。IV值越大,表示該變量的預測能力越強。
(3)對離散型變量,woe 可以觀察組間的跳轉對 odds 的提升是否呈線性,而 IV 可以衡量變量整體(而不是每個 group)的預測能力。
(4)對連續型變量,woe 和 IV 值為分箱的合理性提供了一定的依據。
1. WOE
1.1 WOE的計算方式
對於某變量,
其中 \(i\) 表示變量的第 \(i\) 個分箱(也即第 \(i\) 個取值),即一個變量的每個分箱都有一個 WOE 值,
\(\#B_i\) 是第 \(i\) 箱中壞客戶(label=1)的人數
\(\#G_i\) 是第 \(i\) 箱中好客戶(label=0)的人數
\(\#B_T\) 是總共壞客戶人數
\(\#G_T\) 是總共好客戶人數
實質上WOE表示的是 當前分箱中好壞客戶的比例 與 總體好壞客戶比例 的差異
如果WOE的絕對值越大,這種差異就越明顯,絕對值越小就表明差異越不明顯。如果WOE為0,則說明該分箱中好壞客戶比例等於隨機好壞客戶比值,此時這個分箱就無預測能力。
WOE 可以理解為當前組中正負樣本的比值,與所有樣本中正負樣本比值的差異。這個差異是用這兩個比值的比值,再取對數來表示的。
WOE>0表示當前組正負樣本比例大於總體的正負樣本比例,值越大表示這個分組里的樣本響應的可能性越大;
WOE<0表示當前組正負樣本比例小於總體的正負樣本比例,值越小表示這個分組里的樣本響應的可能性越小。
WOE絕對值越大,對於分類貢獻越大。當分箱中正負的比例等於隨機(大盤)正負樣本的比值時,說明這個分箱沒有預測能力,即WOE=0。

1.2 WOE編碼的好處
邏輯回歸假設
通常等式左邊不會與等式右邊呈線性關系,需要對 \(x\) 作變換 \(T(\cdot)\),讓 \(T(x)\) 與 \(log(odds)\) 線性相關。
(1)可以證明 WOE 是其中一種比較好的把自變量轉化為與 \(log(odds)\) 線性相關的有效形式
(2)所有變量被 WOE 編碼標准化后,求解得到的系數取值都在同一范圍,可以直接比較不同自變量對 \(odds\) 的影響
1.3 對於連續型變量,如何進行WOE編碼
在計算WOE編碼前需要對連續型變量進行分箱(binning)處理,將其轉化為離散型,再進行WOE編碼。
1.3.1 分箱數量
一般來說10~20個分箱足夠了,因為每個分箱應保證不少於5%的樣本數。分箱數量決定了平滑程度,分箱數越少平滑度越高。所以一般采用先精細分箱(fine classing),初始將箱數分成20~50個箱,然后進行粗分箱(coarse classing),利用IV值、基尼系數、卡方統計量等值將箱數合並,通常最多10箱。目的是通過創建更少的箱子來實現簡化,每個箱子具有明顯不同的風險因子,同時最小化信息損失。
如果缺失值有預測能力,則將缺失值單獨分作一箱或者是合並到擁有相似風險因子的分箱中去。
為什么不分1000箱?更少的箱數能夠捕捉到數據中的重要模式,同時忽略噪聲。當某一分箱中樣本數少於5%,則該箱可能不是數據分布的一個真實反映,也可能導致模型不穩定。
1.3.2 處理分箱中沒有響應樣本或者全部是響應樣本
可以用以下公式修正
1.3.3 如何用WOE檢查分箱的正確性
(1)WOE最好應該呈單調趨勢
(2)在預測變量做了WOE編碼后跑一個單變量的邏輯回歸,如果斜率(變量系數)不為1或者截距項不等於
則該分箱效果不佳。
對於離散變量,例如職業變量包含學生、老師、工人等名義屬性時,先將變量的不同level作WOE編碼后,把WOE值相近的level合並在一起,這樣可以減少level數量。因為有相近的WOE值的level有幾乎相同的響應率/非響應率,換句話說,某幾個level有相近的woe值就將他們合並成一個箱子
1.4 WOE編碼的優點與缺點
優點:
- 可以有效處理缺失值(把缺失值單獨作為一個分箱)
- 可以有效處理異常值(Outlier)
- WOE轉換基於分布的對數值,這與邏輯回歸輸出函數一致
- 不需要進行啞變量編碼
- 用了合適的分箱手段后,能夠建立自變量與因變量的單調關系
缺點:
只考慮了每個分箱的相對風險,沒有考慮到每個分箱樣本數量占全樣本的比例。可以用IV值來評估每個分箱的相對貢獻
1.5 延申:WOE 為什么被稱為數據權重

1.6 在python中計算WOE
例:構造如下數據集
df = pd.DataFrame({"col1":["男","女","女","男","女"],
"y":[0,1,1,1,0]})

利用 crosstab 得到頻率表:
pd.crosstab(df["col1"], df["y"], normalize='columns')

在頻率表的基礎上,加上woe列:
df_woe = pd.crosstab(df["col1"], df["y"], normalize='columns').\
assign(woe=lambda dfx: np.log(dfx[1].replace(0, 0.0001) / dfx[0].replace(0, 0.0001)))

當某個分箱中,只存在正樣本或負樣本時,會使得 ln(.) 的分子或分母為0,可選擇將其替換為0.0001
2. IV值
2.1 IV值的計算方式
信息值是預測模型中選擇重要變量的方式之一,它能根據預測變量的重要性對預測變量進行排序,IV值計算公式如下:
IV值是對一個變量而言,即每個變量有一個IV值(其值等於每個分箱的IV值相加)。IV值在WOE的基礎上保證了結果非負。
假設變量 \(X\) 有 \(n\) 個分箱,每個分箱的 WOE 編碼取值為 \(WOE_i\) ,該分箱的IV值就是用該分箱響應比例與未響應比例之差再乘上 \(WOE_i\)。注意這里的響應比例和未響應比例都是用當前分箱中響應數量/整體樣本響應數量和當前分箱未響應數量/整體樣本未響應數量計算得到。
IV值是看單個變量正負樣本分布的差異,這種差異越大表明這個變量對於正負樣本的區分度越高.
WOE可能為負值,IV值不可能為負,根據IV值選擇變量后,用WOE替換變量各分組的值進入模型。
2.2 利用IV值進行變量篩選

一般我們選擇 IV值大於0.02的那些變量進入模型。如果IV值大於0.5,則考慮要對這個變量進行分群處理。即根據這個變量拆分成幾個樣本子集,分別在各個樣本子集上建模。
2.3 在python中計算IV
def calIV(df, var, y):
"""
計算IV值
param df:數據集X
param var:已分組的列名
param y:響應變量y(0,1)
return:IV值
"""
df_woe_iv = pd.crosstab(df[var], y, normalize='columns').assign(woe=lambda dfx: np.log(dfx[1].replace(0, 0.0001) / dfx[0].replace(0, 0.0001))).assign(iv=lambda dfx: np.sum(dfx['woe'] * (dfx[1] - dfx[0])))
a = df_woe_iv['iv'].reset_index()
return a.loc[0, 'iv']
