您好,登錄后才能下訂單哦!
筆者之前用R開(kāi)發(fā)評(píng)分卡時(shí),需要進(jìn)行分箱計(jì)算woe及iv值,采用的R包是smbinning,它可以自動(dòng)進(jìn)行分箱。近期換用python開(kāi)發(fā), 也想實(shí)現(xiàn)自動(dòng)分箱功能,找到了一個(gè)woe包,地址https://pypi.org/project/woe/,可以直接 pip install woe安裝。
由于此woe包官網(wǎng)介紹及給的例子不是很好理解,關(guān)于每個(gè)函數(shù)的使用也沒(méi)有很詳細(xì)的說(shuō)明,經(jīng)過(guò)一番仔細(xì)探究后以此文記錄一下該woe包的使用及其計(jì)算原理。
例子
官方給的例子不是很好理解,以下是我寫的一個(gè)使用示例。以此例來(lái)說(shuō)明各主要函數(shù)的使用方法。計(jì)算woe的各相關(guān)函數(shù)主要在feature_process.py中定義。
import woe.feature_process as fp import woe.eval as eval #%% woe分箱, iv and transform data_woe = data #用于存儲(chǔ)所有數(shù)據(jù)的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) civ_list.append(civ) data_woe[column] = fp.woe_trans(data[column], civ) civ_df = eval.eval_feature_detail(civ_list,'output_feature_detail_0315.csv') #刪除iv值過(guò)小的變量 iv_thre = 0.001 iv = civ_df[['var_name','iv']].drop_duplicates() x_columns = iv.var_name[iv.iv > iv_thre]
計(jì)算分箱,woe,iv
核心函數(shù)主要是freature_process.proc_woe_discrete()與freature_process.proc_woe_continuous(),分別用于計(jì)算連續(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,要計(jì)算woe的數(shù)據(jù),必須包含'target'變量,且變量取值為{0,1}
var:要計(jì)算woe的變量名
global_bt:全局變量bad total。df的正樣本數(shù)量
global_gt:全局變量good total。df的負(fù)樣本數(shù)量
min_sample:指定每個(gè)bin中最小樣本量,一般設(shè)為樣本總量的5%。
alpha:用于自動(dòng)計(jì)算分箱時(shí)的一個(gè)標(biāo)準(zhǔn),默認(rèn)0.01.如果iv_劃分>iv_不劃分*(1+alpha)則劃分。
輸出:一個(gè)自定義的InfoValue類的object,包含了分箱的一切結(jié)果信息。
該類定義見(jiàn)以下一段代碼。
class InfoValue(object): ''' InfoValue Class ''' def __init__(self): self.var_name = [] self.split_list = [] self.iv = 0 self.woe_list = [] self.iv_list = [] self.is_discrete = 0 self.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 = [] def init(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
打印分箱結(jié)果
eval.eval_feature_detail(Info_Value_list,out_path=False)
輸入:
Info_Value_list:存儲(chǔ)各變量分箱結(jié)果(proc_woe_continuous/discrete的返回值)的List.
out_path:指定的分箱結(jié)果存儲(chǔ)路徑,輸出為csv文件
輸出:
各變量分箱結(jié)果的DataFrame。各列分別包含如下信息:
var_name | 變量名 |
split_list | 劃分區(qū)間 |
sub_total_sample_num | 該區(qū)間總樣本數(shù) |
positive_sample_num | 該區(qū)間正樣本數(shù) |
negative_sample_num | 該區(qū)間負(fù)樣本數(shù) |
sub_total_num_percentage | 該區(qū)間總占比 |
positive_rate_in_sub_total | 該區(qū)間正樣本占總正樣本比例 |
woe_list | woe |
iv_list | 該區(qū)間iv |
iv |
該變量iv(各區(qū)間iv之和) |
輸出結(jié)果一個(gè)示例(截取部分):
woe轉(zhuǎn)換
得到分箱及woe,iv結(jié)果后,對(duì)原數(shù)據(jù)進(jìn)行woe轉(zhuǎn)換,主要用以下函數(shù)
woe_trans(dvar,civ): replace the var value with the given woe value
輸入:
dvar: 要轉(zhuǎn)換的變量,Series
civ: proc_woe_discrete或proc_woe_discrete輸出的分箱woe結(jié)果,自定義的InfoValue類
輸出:
var: woe轉(zhuǎn)換后的變量,Series
分箱原理
該包中對(duì)變量進(jìn)行分箱的原理類似于二叉決策樹(shù),只是決定如何劃分的目標(biāo)函數(shù)是iv值。
1)連續(xù)變量分箱
首先簡(jiǎn)要描述分箱主要思想:
1.初始化數(shù)據(jù)集D =D0為全量數(shù)據(jù)。轉(zhuǎn)步驟2
2.對(duì)于D,將數(shù)據(jù)按從小到大排序并按數(shù)量等分為10份,記錄各劃分點(diǎn)。計(jì)算不進(jìn)行仍何劃分時(shí)的iv0,轉(zhuǎn)步驟3.
3.遍歷各劃分點(diǎn),計(jì)算利用各點(diǎn)進(jìn)行二分時(shí)的iv。
如果最大iv>iv0*(1+alpha)(用戶給定,默認(rèn)0.01): 則進(jìn)行劃分,且最大iv對(duì)應(yīng)的即確定為此次劃分點(diǎn)。它將D劃分為左右兩個(gè)結(jié)點(diǎn),數(shù)據(jù)集分別為DL, DR.轉(zhuǎn)步驟4.
否則:停止。
4.分別令D=DL,D=DR,重復(fù)步驟2.
為了便于理解,上面簡(jiǎn)化了一些條件。實(shí)際劃分時(shí)還設(shè)計(jì)到一些限制條件,如不滿足會(huì)進(jìn)行區(qū)間合并。
主要限制條件有以下2個(gè):
a.每個(gè)bin的數(shù)量占比>min_sample(用戶給定)
b.每個(gè)bin的target取值個(gè)數(shù)>1,即每個(gè)bin必須同時(shí)包含正負(fù)樣本。
2)連續(xù)變量分箱
對(duì)于離散變量分箱后續(xù)補(bǔ)充 to be continued...
以上這篇python自動(dòng)分箱,計(jì)算woe,iv的實(shí)例代碼就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。