mark一下,感謝作者分享!
筆者之前用r開發評分卡時,需要進行分箱計算woe及iv值,採用的r包是smbinning,它可以自動進行分箱。近期換用python開發, 也想實現自動分箱功能,找到了乙個woe包,位址可以直接 pip install woe安裝。
由於此woe包官網介紹及給的例子不是很好理解,關於每個函式的使用也沒有很詳細的說明,經過一番仔細**後以此文記錄一下該woe包的使用及其計算原理。
官方給的例子不是很好理解,以下是我寫的乙個使用示例。以此例來說明各主要函式的使用方法。計算woe的各相關函式主要在feature_process.py中定義。
核心函式主要是freature_process.proc_woe_discrete()與freature_process.proc_woe_continuous(),分別用於計算連續變數與離散變數的woe。它們的輸入形式相同:import woe.feature_process
as fp
import woe.eval
as eval
#%% woe分箱, iv and transform
data_woe = data
#用於儲存所有資料的woe值
civ_list =
n_positive = sum(data[
'target'])
n_negtive = len(data) - n_positive
for column
in list(data.columns[
1:]):
if data[column].dtypes ==
'object':
civ = fp.proc_woe_discrete(data, column, n_positive, n_negtive,
0.05*len(data), alpha=
0.05)
else:
civ = fp.proc_woe_continuous(data, column, n_positive, n_negtive,
0.05*len(data), alpha=
0.05)
data_woe[column] = fp.woe_trans(data[column], civ)
civ_df = eval.eval_feature_detail(civ_list,
'output_feature_detail_0315.csv')
#刪除iv值過小的變數
iv_thre =
0.001
iv = civ_df[[
'var_name',
'iv']].drop_duplicates()
x_columns = iv.var_name[iv.iv > iv_thre]
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'變數,且變數取值為
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)class
infovalue
(object):
'''infovalue class
'''def
__init__
(self):
self.var_name =
self.split_list =
self.iv =
0self.woe_list =
self.iv_list =
self.is_discrete =
0self.sub_total_sample_num =
self.positive_sample_num =
self.negative_sample_num =
self.sub_total_num_percentage =
self.positive_rate_in_sub_total =
self.negative_rate_in_sub_total =
definit
(self,civ):
self.var_name = civ.var_name
self.split_list = civ.split_list
self.iv = civ.iv
self.woe_list = civ.woe_list
self.iv_list = civ.iv_list
self.is_discrete = civ.is_discrete
self.sub_total_sample_num = civ.sub_total_sample_num
self.positive_sample_num = civ.positive_sample_num
self.negative_sample_num = civ.negative_sample_num
self.sub_total_num_percentage = civ.sub_total_num_percentage
self.positive_rate_in_sub_total = civ.positive_rate_in_sub_total
self.negative_rate_in_sub_total = civ.negative_rate_in_sub_total
輸入:info_value_list:儲存各變數分箱結果(proc_woe_continuous/discrete的返回值)的list.
out_path:指定的分箱結果儲存路徑,輸出為csv檔案
輸出:各變數分箱結果的dataframe。各列分別包含如下資訊:
var_name
變數名split_list
劃分區間
sub_total_sample_num
該區間總樣本數
positive_sample_num
該區間正樣本數
negative_sample_num
該區間負樣本數
sub_total_num_percentage
該區間總佔比
positive_rate_in_sub_total
該區間正樣本佔總正樣本比例
woe_list
woeiv_list
該區間iv
iv該變數iv(各區間iv之和)
輸出結果乙個示例(擷取部分):
得到分箱及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.初始化資料集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.
為了便於理解,上面簡化了一些條件。實際劃分時還設計到一些限制條件,如不滿足會進行區間合併。
主要限制條件有以下2個:
a.每個bin的數量佔比》min_sample(使用者給定)
b.每個bin的target取值個數》1,即每個bin必須同時包含正負樣本。
對於離散變數分箱後續補充 to be continued...
筆者之前用r開發評分卡時,需要進行分箱計算woe及iv值,採用的r包是smbinning,它可以自動進行分箱。近期換用python開發, 也想實現自動分箱功能,找到了乙個woe包,位址可以直接 pip install woe安裝。
Python變數分箱 woe值單調分箱
最近上傳了乙個變數分箱的方法到pypi,這個包主要有以下說明 缺失值單獨一箱,不論缺失的數量多少 生成的分箱woe值是單調的,後續有時間會迭代u型分箱的版本 會有分箱最小樣本數佔比,類似決策樹的最小葉節點佔比 分箱成功的變數才會保留,有可能失敗的情況是找不出同時滿足上述2和3的分箱 增加了多程序,提...
python自動分箱,計算woe,iv
筆者之前用r開發評分卡時,需要進行分箱計算woe及iv值,採用的r包是smbinning,它可以自動進行分箱。近期換用python開發,也想實現自動分箱功能,找到了乙個woe包,位址可以直接 pip install woe安裝。由於此woe包官網介紹及給的例子不是很好理解,關於每個函式的使用也沒有很...
使用決策樹分箱計算woe和iv值例項
使用信用卡預期資料 kaggle案例的訓練資料 give me some credit 目標變數為seriousdlqin2yrs 表示未來是否為逾期90天 1表示逾期90天 即通常意義上的壞客戶,0則表示沒有逾期90天 的好客戶。import numpy as np import pandas a...