變量的延申和篩選-連續變量離散化-特征篩選
WOE編碼(最優分箱)
WOE一般在0.1~3之間波動,IV值做得特征篩選的操作 一般保留>0.03的特征 IV值體現的時X和Y之間的顯著性進行篩選
1.逐列分箱並獲得IV值
# 運行自定義函數所在文件 對自定義分箱文件要自己理解
%run smob.py
# y進行0,1互換
train_data['SeriousDlqin2yrs'] = -(train_data.SeriousDlqin2yrs-1) #因為與自定義函數中的標簽0 1設定正好相反
# 定義y的名字
y = 'SeriousDlqin2yrs' #標簽列的名字
# 初始化IV值的對象
# 貸款以及信用卡可用額度占比
RUO = smbin(train_data,y,'RevolvingUtilizationOfUnsecuredLines'); # 越高WOE值越大 # 如果覺得分箱的箱子數太多 可以設置 max_bin= 參數 看看能不能把兩個WOE值較小的合並 #查看結果數據 RUO.IVtable #查看遍歷方式(一般不看) print(RUO.Tree_structure) #查看IV值 RUO.IV # 保存IV值 第一個特征值 iv_all = pd.Series() iv_all = iv_all.append(pd.Series({'RevolvingUtilizationOfUnsecuredLines':RUO.IV})) #age分箱並保存iv值 age = smbin(train_data,y,'age') age.IVtable iv_all = iv_all.append(pd.Series({'age':age.IV})) #除標簽外把所有特征都來一邊
#查看某一變量分享后的基於標簽的箱型圖 train_data.boxplot(column = ['NumberOfTimes90DaysLate'],by=[y])
也可以所有特征,循環分箱
iv_all = pd.Series()
for i in train_data.columns[1:]: # 貸款以及信用卡可用額度占比 # R=i.upper() R= smbin(train_data,y,i); iv_all = iv_all.append(pd.Series({i:R.IV})) iv_all
2.查看所有變量的IV值
iv_all.sort_values(ascending=False) #小於0.03的可以考慮篩選掉
#直方圖
iv_all.sort_values().plot(kind='barh')
3.WOE轉換(WOE編碼),通過生成的分箱和WOE數據
# smbin和smbin_cu得到IV值篩選后,放在一個表中
x_list = [RUO,age,NO3059,DebtRatio,MonthlyIncome,NOO,NO90,NRE,NO6089,NOD]
data_woe = smgen(train_data,x_list) data_woe.head()
4.數據集轉換(確定X Y)--轉換后的數據
- 抽取WOE列作為預測數據X
- 如果用的是statsmodel的回歸模型,加常數項
- 抽取相應列作為y
import statsmodels.api as sm X = data_woe.iloc[:,-len(x_list):] X = sm.add_constant(X) #增加常數列 Y = data_woe[y] #y是標簽列名稱
接下來是數據集切分了...