变量的延申和筛选-连续变量离散化-特征筛选
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是标签列名称
接下来是数据集切分了...