数据离散化-分箱

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

   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是标签列名称

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

猜你喜欢

转载自www.cnblogs.com/jing-yan/p/12339623.html