woe_iv原理和python代碼建模
?1.自變量進行篩選
IV的全稱是Information?Value,中文意思是信息價值,或者信息量。
我們在用邏輯回歸、決策樹等模型方法構建分類模型時,經常需要對自變量進行篩選。比如我們有200個候選自變量,通常情況下,不會直接把200個變量直接放到模型中去進行擬合訓練,而是會用一些方法,從這200個自變量中挑選一些出來,放進模型,形成入模變量列表。那么我們怎么去挑選入模變量呢?
挑選入模變量過程是個比較復雜的過程,需要考慮的因素很多,比如:變量的預測能力,變量之間的相關性,變量的簡單性(容易生成和使用),變量的強壯性(不容易被繞過),變量在業(yè)務上的可解釋性(被挑戰(zhàn)時可以解釋的通)等等。但是,其中最主要和最直接的衡量標準是變量的預測能力。
“變量的預測能力”這個說法很籠統,很主觀,非量化,在篩選變量的時候我們總不能說:“我覺得這個變量預測能力很強,所以他要進入模型”吧?我們需要一些具體的量化指標來衡量每自變量的預測能力,并根據這些量化指標的大小,來確定哪些變量進入模型。IV就是這樣一種指標,他可以用來衡量自變量的預測能力。類似的指標還有信息增益、基尼系數等等。
?
?
補充說明對數簡寫

?

?
?

?
?

?
np.log(a) np.log10(a) np.log2(a) : 計算各元素的自然對數、10、2為底的對數?
?
?
WOE(Weight?of?Evidence)
WOE的全稱是“Weight?of?Evidence”,即證據權重。
?因子數量/好客戶總數,必須進行加權處理
?
?

文件夾內數據

?結果:
預測有價值變量準確,但不完整,因為沒有進行分箱,造成損失

?
舉例說明
例如按年齡分組,一般進行分箱,我們都喜歡按照少年、青年、中年、老年幾大類進行分組,但效果真的不一定好:

?
woe的第三方包(pip install woe; pip install reportgen)
https://pypi.org/project/woe/

實例:
https://blog.csdn.net/KIDxu/article/details/88647080
官方給的例子不是很好理解,以下是我寫的一個使用示例。以此例來說明各主要函數的使用方法。計算woe的各相關函數主要在feature_process.py中定義。
計算分箱,woe,iv
核心函數主要是freature_process.proc_woe_discrete()與freature_process.proc_woe_continuous(),分別用于計算連續(xù)變量與離散變量的woe。它們的輸入形式相同:
proc_woe_discrete(df,var,global_bt,global_gt,min_sample,alpha=0.01)
proc_woe_continuous(df,var,global_bt,global_gt,min_sample,alpha=0.01)
輸入:
df: DataFrame,要計算woe的數據,必須包含'target'變量,且變量取值為{0,1}
var:要計算woe的變量名
global_bt:全局變量bad total。df的正樣本數量
global_gt:全局變量good?total。df的負樣本數量
min_sample:指定每個bin中最小樣本量,一般設為樣本總量的5%。
alpha:用于自動計算分箱時的一個標準,默認0.01.如果iv_劃分>iv_不劃分*(1+alpha)則劃分。
輸出:一個自定義的InfoValue類的object,包含了分箱的一切結果信息。
該類定義見以下一段代碼。
打印分箱結果
eval.eval_feature_detail(Info_Value_list,out_path=False)
輸入:
Info_Value_list:存儲各變量分箱結果(proc_woe_continuous/discrete的返回值)的List.
out_path:指定的分箱結果存儲路徑,輸出為csv文件
輸出:
各變量分箱結果的DataFrame。各列分別包含如下信息:
? ?
var_name 變量名
split_list 劃分區(qū)間
sub_total_sample_num 該區(qū)間總樣本數
positive_sample_num 該區(qū)間正樣本數
negative_sample_num 該區(qū)間負樣本數
sub_total_num_percentage 該區(qū)間總占比
positive_rate_in_sub_total 該區(qū)間正樣本占總正樣本比例
woe_list woe
iv_list 該區(qū)間iv
iv
該變量iv(各區(qū)間iv之和)
輸出結果一個示例(截取部分):?
?
woe轉換
得到分箱及woe,iv結果后,對原數據進行woe轉換,主要用以下函數
woe_trans(dvar,civ):?replace the var value with the given woe value
輸入:
dvar: 要轉換的變量,Series
civ:?proc_woe_discrete或proc_woe_discrete輸出的分箱woe結果,自定義的InfoValue類
輸出:
var: woe轉換后的變量,Series
分箱原理
該包中對變量進行分箱的原理類似于二叉決策樹,只是決定如何劃分的目標函數是iv值。
1)連續(xù)變量分箱
首先簡要描述分箱主要思想:
-------------------------------------------------------
1.初始化數據集D =D0為全量數據。轉步驟2
2.對于D,將數據按從小到大排序并按數量等分為10份,記錄各劃分點。計算不進行仍何劃分時的iv0,轉步驟3.
3.遍歷各劃分點,計算利用各點進行二分時的iv。
如果最大iv>iv0*(1+alpha)(用戶給定,默認0.01):?則進行劃分,且最大iv對應的即確定為此次劃分點。它將D劃分為左右兩個結點,數據集分別為DL, DR.轉步驟4.
否則:停止。
4.分別令D=DL,D=DR,重復步驟2.
-------------------------------------------------------
為了便于理解,上面簡化了一些條件。實際劃分時還設計到一些限制條件,如不滿足會進行區(qū)間合并。
主要限制條件有以下2個:
a.每個bin的數量占比>min_sample(用戶給定)
b.每個bin的target取值個數>1,即每個bin必須同時包含正負樣本。
2)連續(xù)變量分箱
對于離散變量分箱后續(xù)補充 to be continued...
