数据离散化-分箱


  变量的延申和筛选-连续变量离散化-特征筛选

   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)--转换后的数据

  1. 抽取WOE列作为预测数据X
  2. 如果用的是statsmodel的回归模型,加常数项
  3. 抽取相应列作为y
import statsmodels.api as sm

X = data_woe.iloc[:,-len(x_list):]
X = sm.add_constant(X)          #增加常数列

Y = data_woe[y]   #y是标签列名称

接下来是数据集切分了...

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM