提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、toad是什么?
- Toad 是专为工业界模型开发设计的Python工具包,特别针对评分卡的开发
- Toad 的功能覆盖了建模全流程,从 EDA、特征工程、特征筛选 到 模型验证和评分卡转化
- Toad 的主要功能极大简化了建模中最重要最费时的流程,即特征筛选和分箱。
二、使用步骤
1.初始的分箱结果
代码如下:
# - 通常使用双变量图(Bivar图 Bivariate graph)来评价分箱结果。注意,信贷风险分析中Bivar图,纵轴固定为负样本占比
import matplotlib.pyplot as plt
%matplotlib inline
from toad.plot import bin_plot
data = model_data.iloc[:5000,:]
#初始的分箱结果
def get_bins(data,target):
# 为了节约时间,只选取5000条数据做实验
data = data.iloc[:5000,:]
# 初始化一个combiner类
combiner = toad.transform.Combiner()
# 训练数据并指定分箱方法,其它参数可选 # min_samples: 每箱至少包含样本量,可以是数字或者占比
combiner.fit(data,y=target, method='chi', min_samples = 0.05)
# 以字典形式保存分箱结果
bins = combiner.export()
#每个特征分箱原始个数,#每个特征分箱个数据值,正确的应该是len(v)+2,一般情况下这个值都会过大,所以直接携程len(v)
nbins = []
for v in bins.values():
nbins.append(len(v))
return nbins
nbins = get_bins(model_data, 'SeriousDlqin2yrs')
2.调整后的分箱结果
代码如下:
def get_new_bins(data,target,nbins):
'''
# 通过画出分箱图形调整分箱个数,并返回新的分箱
'''
#调整后特征分箱个数
nbins = [4, 6, 3, 3, 2, 5, 4, 3, 2, 2]
bins = {}
for i,c in enumerate(data.columns[1:].to_list()):
c2 = toad.transform.Combiner()
c2.fit(data[[c,target]],y=target, method='chi',n_bins=nbins[i])
bins.update(c2.export())
#传给bin_plot的数据必须是分箱转化之后的
transformed = c2.transform(data[[c,target]],labels=True)
#上图中柱形图表示每一箱的占比,折线图表示每一箱的坏样本率。一般折线图要呈现出单调的趋势
# - 可以通过调整箱数实现单调趋势
bin_plot(transformed,x=c,target=target)
return bins
new_bins = get_new_bins(data, 'SeriousDlqin2yrs', nbins)
#获取woe
def get_woe(data, new_bins, target ):
# 使用toad计算woe
X_train,X_test,Y_train,Y_test = train_test_split(data.drop(target,axis=1),data[target],test_size=0.25,random_state=450)
data_train = pd.concat([X_train,Y_train],axis=1)
#增加一列区分训练/测试的特征
data_train['type'] = 'train'
data_test = pd.concat([X_test,Y_test],axis=1)
data_test['type'] = 'test'
c2 = toad.transform.Combiner()
#把新的分箱规则设置进去
c2.set_rules(new_bins)
data_ = pd.concat([data_train,data_test],axis = 0)
#分成训练集测试集,根据图形观察是否需要调整分箱
for c in data_.columns[:-2]:
#分箱
temp_data = c2.transform(data_[[c,target,'type']])
from toad.plot import badrate_plot, proportion_plot
badrate_plot(temp_data, target = target, x = 'type', by = c)
#绘制每一箱占比情况图,根据情况继续调整分箱结果
proportion_plot(temp_data[c])
#将特征的值转化为分箱的箱号。
binned_data = c2.transform(data_train)
#计算WOE
transer = toad.transform.WOETransformer()
#对WOE的值进行转化,映射到原数据集上。对训练集用fit_transform,测试集用transform.
data_tr_woe = transer.fit_transform(binned_data, binned_data[target], exclude=[target,'type'])
return data_tr_woe
data_tr_woe = get_woe(data, new_bins, 'SeriousDlqin2yrs')
总结
toad库的分箱更加简便