最近比賽資料進入到特徵組合的階段,在進行特徵組合前,要分箱處理,等深等距之類的方法太沒有道理了,加上測試集的深度廣度也不同。
所以嘗試了一種woe編碼分箱的方法
importwoe.feature_process as fp
import
woe.eval as eval
dataset_train=pd.read_csv('
e:/比賽/公積金逾期**-資料/train.csv')
dataset_test=pd.read_csv('
e:/比賽/公積金逾期**-資料/test.csv')
#省略其他處理過程
#woe分箱
dataset_train.rename(columns=,inplace=true)#
資料中必須有一列名為『target』的列,在這裡改了一下列名
civ_list=
civ = fp.proc_woe_discrete(dataset_train, '
dwjjlx
', 2757, 37243, 0.05*len(dataset_train), alpha=0.5)#
對離散特徵進行分箱
civ_df =eval.eval_feature_detail(civ_list)
civ_df
#輸出分箱結果
dataset_train['dwjjlx'] = fp.woe_trans(dataset_train['dwjjlx'], civ)#woe賦值
輸出結果上表所示
核心函式主要是freature_process.proc_woe_discrete()與freature_process.proc_woe_continuous(),分別用於計算連續變數與離散變數的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'變數,且變數取值為
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檔案
得到分箱及woe,iv結果後,對原資料進行woe轉換,其實就是用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
特徵工程 資料分箱
建模資料的預處理的過程中,變數分箱 即變數離散化 往往是較為核心一環。變數分箱的優劣往往會影響模型評分效果 對異常資料有比較好的魯棒性 在邏輯回歸模型中,單個變數分箱之後每個箱有自己獨立的權重,相當於給模型加入了非線性的能力,能夠提公升模型的表達能力,極大擬合 缺失值也可以作為一類特殊的變數進行模型...
特徵工程之特徵選擇
在前一篇文章中我介紹了一些資料預處理的方法,原始資料在經過預處理之後可以被演算法處理了,但是實際中可能有一些特徵是沒有必要的,比如在中國採集的一些資料,那麼國籍就都是中國,其實也就沒有意義了,反映在統計量上就是方差過小,也就是樣本在這個特徵上變化很小。還有一種情況是特徵和最後的結果相關性很小,也就是...
特徵工程之特徵選擇
特徵選擇其實就是減少屬性個數,為什麼要這麼做呢?直接使用原始資料來訓練模型的話,雖然說在訓練模型上的準確率會非常高,但是在測試樣本上的準確率將會大打折扣,也就是會產生過擬合的現象。所以說需要選擇出最適合的屬性進行訓練。特徵選擇的原因 2 雜訊 部分特徵對 結果又影響 進行特徵選擇的時候有兩種情況 一...