不知不觉中,Python 已经在短短几年内一跃成为最热门的编程语言之一,尤其是在数据科学、人工智能和机器学习领域。这除了因为Python相对简单易学,可读性高之外,也有很大一部分原因是因为Python有着良好的开源生态从而产生了许多强大的第三方库,这些库可供直接调用,为开发人员的工作提供了极大的便利。
风控领域亦是如此,以最常用、最经典的信用风险评分卡模型为例,第三方的库就有谢士晨博士开发的Scorecardpy以及今天我们要重点介绍的toad。
toad是针对风险评分卡的建模而开发的工具包,其功能全面,性能强大,从数据探索EDA、特征筛选、特征分箱、WOE变换,到建模、模型评估、转换分数,对评分卡模型的各个步骤都做了完整的封装,极大的简化了建模的复杂程度,深受从业人员的喜爱。
下面我们将根据建模实际的流程,分布为大家介绍toad包的各种功能。
在开始之前先简单说一下toad库的安装与升级,和其他的库一样,直接使用pip即可:
-
安装:pip install toad
-
升级:pip install --upgrade toad
文章目录
-
- 技术提升
- 0.导入库与数据读取
- 1.EDA数据探索
- 2.使用toad高效分箱并进行特征筛选
- 3.WOE转化
- 4.逐步回归特征筛选
- 5.建模与模型评估
- 6.转换评分
技术提升
技术要学会分享、交流,不建议闭门造车。
本文由技术群粉丝推荐分享,问题咨询、资料获取、数据、技术交流提升,均可加交流群获取,群友已超过3000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
方式①、添加微信号:dkl88191,备注:来自CSDN
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群
0.导入库与数据读取
可以看到,演示数据共有50000条数据,16个特征,包含14个特征变量,一列主键和一列标签(Defaulter)列。其中有若干个离散型变量和连续性变量,且有一定的缺失值。为了后续模型能够检验,我们使用sklearn里的train_test_split将数据划分为训练集(30000条)与测试集(20000条)。
1.EDA数据探索
(1)toad.detect(dataframe)
用于检测数据情况(EDA),方便我们对数据有一个总体的印象。输出每列特征的统计性特征和其他信息,主要的信息包括:缺失值、unique values、数值变量的平均值、离散型变量的众数等。如下面的cell,可以得到以下信息:
-
坏客户的占比为16.2%:Defaulter的mean为0.162;
-
部分特征有缺失值,且缺失值不等:注意missing列;
-
数值型变量和离散型变量有若干个,部分离散型变量的unique values较多,有10多个甚至61个:离散型变量的unique列。
(2)toad.quality(dataframe, target=‘target’, iv_only=False)
输出每个变量的iv值,gini,entropy,和unique values,结果以iv值排序。'target’为目标列,'iv_only’决定是否只输出iv值。
注意:
-
对于数据量大或高维度数据,建议使用iv_only=True
-
要去掉主键,日期等高unique values且不用于建模的特征
2.使用toad高效分箱并进行特征筛选
(1)toad.selection.select(dataframe, target=‘target’, empty=0.9, iv=0.02, corr=0.7, return_drop=False, exclude=None)
根据缺失值占比,iv值,和高相关性进行变量筛选,各参数含义为:
-
empty=0.9:若变量的缺失值大于0.9则被删除;
-
iv=0.02:若变量的iv值小于0.02则被删除;
-
corr=0.7:若两个变量的相关性高于0.7时,iv值低的变量则被删除;
-
return_drop=False:若为True,function将返回被删去的变量列;
-
exclude=None:明确不被删去的列名,输入为list格式;
如下面的cell,没有变量由于缺失值高被删除,3个变量因为低iv值被删除,1个相关性高的变量被删除。从14个特征中选出了10个变量。
在实际工作中,只需要根据需求调整各个参数值,即可完成变量的初筛,对于有特殊含义需要保留但不满足筛选要求的变量,也可以在exclude里保留。
(2)分箱toad.transform.Combiner
toad的分箱功能支持数值型数据和离散型分箱,集成了各种常用的分箱方法,包括卡方分箱(默认)、决策树分箱、等频分箱、等距分箱、最优分箱等。
toad.transform.Combiner 是用来分箱的class,具体分箱步骤如下:
-
初始化:c = toad.transform.Combiner()
-
训练分箱:c.fit(dataframe, y = ‘target’, method = ‘chi’, min_samples = None, n_bins = None, empty_separate = False)
其中,
y:目标列
Method:分箱方法,支持’chi’ (卡方分箱),‘dt’ (决策树分箱),‘kmean’,‘quantile’ (等频分箱),‘step’(等步长分箱)等
min_samples:每箱至少包含样本量,可以是数字或者占比
n_bins:箱数,若无法分出这么多箱数,则会分出最多的箱数
empty_separate:是否将空箱单独分开
-
查看分箱节点:c.export()
-
手动调整分箱:c.load(dict)
-
apply分箱结果:c.transform(dataframe, labels=False)
-
Labels:是否将分箱结果转化成箱标签。False时输出0,1,2…(离散变量根据占比高低排序),True输出(-inf, 0], (0,10], (10, inf)。
注意:记得删去不需要分箱的列,比如是ID列和时间列
(3)观察分箱:toad.plot.bin_plot(dataframe, x = None, target = ‘target’)
toad.plot的module提供了一部分的可视化功能,帮助调整分箱节点。
-
x:需要观察的特征
-
target:目标列
bar代表了样本量占比,红线代表了正样本占比(e.g. 坏账率)
(4)调整分箱:c.update(dict)
update后会更新被修改的箱
3.WOE转化
WOE转化在分箱调整好之后进行,步骤如下:
- 用调整好的Combiner转化数据:c.transform(dataframe, labels=False)
只会转化被分箱的变量
-
初始化woe transer:transer = toad.transform.WOETransformer()
-
**fit_transform:**transer.fit_transform(dataframe, target, exclude = None)训练并输出woe转化的数据,用于转化train数据
target:目标列数据(非列名)
Exclude:不需要被WOE转化的列
注意:会转化所有列,包括未被分箱transform的列,通过’exclude’删去不要WOE转化的列,特别是target列
- 根据训练好的transer,转化test数据:transer.transform(dataframe)
4.逐步回归特征筛选
toad.selection.stepwise(dataframe, target=‘target’, estimator=‘ols’, direction=‘both’, criterion=‘aic’, max_iter=None, return_drop=False, exclude=None)
其中,
-
estimator: 用于拟合的模型,支持’ols’, ‘lr’, ‘lasso’, ‘ridge’
-
direction: 逐步回归的方向,支持’forward’, ‘backward’, ‘both’(推荐)
-
criterion: 评判标准,支持’aic’, ‘bic’, ‘ks’, ‘auc’
-
max_iter: 最大循环次数
-
return_drop: 是否返回被剔除的列名
-
exclude: 不需要被训练的列名,比如ID列和时间列
Tip:经验证,direction = 'both’效果最好。estimator = 'ols’以及criterion = 'aic’运行速度快且结果对逻辑回归建模有较好的代表性。
toad.metrics.PSI(df_train, df_test)
输出每列特征的PSI,可以用于检验WOE转化后的特征稳定性
5.建模与模型评估
首先使用LR建模:
下面评估模型的结果,风控模型常用的评分指标有KS,AUC,PSI等。我们可以用toad快速输出这些指标:
另外,toad还提供了KS bucket功能,输出模型预测分箱后评判信息,包括每组的分数区间,样本量,坏账率,KS等。
toad.metrics.KS_bucket(predicted_proba, y_true, bucket=10, method = ‘quantile’)
-
bucket:分箱的数量
-
method:分箱方法,建议用’quantile’(等人数),或’step’ (等分数步长)
bad_rate为每组坏账率:
-
组之间的坏账率差距越大越好
-
可以用于观察是否有跳点
-
可以用与找最佳切点
-
可以对比
6.转换评分
toad.ScoreCard(combiner = {}, transer = None, pdo = 60, rate = 2, base_odds = 20, base_score = 750, card = None, C=0.1,kwargs)
逻辑回归模型转标准评分卡,支持传入逻辑回归参数,进行调参。
-
combiner:传入训练好的toad.Combiner对象
-
transer:传入先前训练的toad.WOETransformer对象
-
pdo、rate、base_odds、base_score:e.g. pdo=60, rate=2, base_odds=20,base_score=750
实际意义为当比率为1/20,输出基准评分750,当比率为基准比率2倍时,基准分下降60分
-
card: 支持传入专家评分卡
-
kwargs: 支持传入逻辑回归参数(参数详见sklearn.linear_model.LogisticRegression)
注意:评分卡在fit时使用WOE转换后的数据来计算最终的分数,分数一旦计算完成,便无需WOE值,可以直接使用原始数据进行评分。
输出结果:
至此,我们就用toad快速完成了一个评分卡模型的全流程,可以说是非常方便了,没有使用太多第三方库,除了基本的numpy,pandas就只用到了toad和一点点sklearn,这也可以看出toad确实将评分卡的全流程都进行了完整的封装,足以满足大部分工作的需求。
本文以介绍toad库的功能为主要目的,展示了评分卡建模的基础流程,实际工作中只需要根据数据的特点和工作的需求进行流程和参数的一些调整即可。
本文参考资料:
toad官方github主页
https://github.com/amphibian-dev/toad