★使用R语言creditmodel包高效简单地完成标准评分卡模型开发。需要本文完整代码,可在关注汉森定理公众号后,回复“card” 获取。
1 关于R语言creditmodel包
creditmodel
是汉森老师开发的一个免费开源的R语言数据科学工具包,从2019年发布至今已4年时间,初衷是提供一系列工具使得模型开发工作更高效,能够帮助建模人员快速完成数据预处理、变量选择、参数搜索等过程,构建出可靠的预测模型(如XGboost或评分卡)。
随着creditmodel
软件包功能不断增加,结构愈趋复杂,使得creditmodel
成为了一个涵盖数据科学整个流程的综合工具包,可完成数据科学的多种任务,旨在帮助没有数据科学背景的人能够在短时间内完成建模和数据分析工作。
2 标准评分卡开发流程
一个标准的评分卡开发过程主要有三个环节:
-
数据准备:包括数据清洗整合、标签定义与特征衍生等
-
模型训练:建模样本切分、变量选择、分箱、WOE转换、逻辑回归建模、评分卡转换、样本打分等
-
模型评估、上线和监控:模型验证评估、模型上线和监控
下面我们使用R语言creditmodel包完成一个简单的评分卡模型开发案例。
3 使用creditmodel包开发评分卡
安装和加载creditmodel
creditmodel
已经发布在了R语言核心库CRAN
上,可以自由免费下载安装。
if (!requireNamespace("creditmodel", quietly=TRUE))
install.packages("creditmodel")
##加载creditmodel
require(creditmodel)
数据准备
我们用lendingclub数据集做预测贷款违约风险的评分卡。 数据来源为美国最大的P2P网贷平台 Lending Club 官方网站。本例所使用的数据集是Lending Club 在2018年1月至2018年9月放款的一共31766个样本,45个变量,已经内置在了creditmodel
包。
#载入lendingclub数据集
data(lendingclub)
#查看lendingclub的数据结构
str(lendingclub)
我们需要先对数据进行清洗,可参考《数据预处理——一步搞定数据清洗》
#数据清洗
lendingclub = data_cleansing(lendingclub,
target = "loan_status",
obs_id = "id" ,
occur_time = "issue_d")
运行完程序,我们发现清洗后的数据已经相当规整。
建模样本切分
首先将数据集拆分为训练集与测试集。
creditmodel::train_test_split
函数如果指定split_type = "OOT",并指定了样本观测时间,则切分后的测试集为跨时间验证样本,prop 为拆分后训练集样本量占比,为了复现样本拆分,需设置随机数种子seed。
train_test = train_test_split(lendingclub,
split_type = "OOT",
prop = 0.7,
occur_time = "issue_d",
seed = 12)
dat_train = train_test$train
dat_test = train_test$test
变量筛选
清洗完数据后,我们需要对变量进行初步筛选,以确定合适的建模备选变量。
creditmodel::feature_selector
通过变量的 IV 值、稳定性PSI、相关性对 X 特征进行初步筛选,另外通过XGBOOST对X特征进行总体的筛选。
默认筛选IV大于0.02、PSI小于0.2,相关性小于0.9的变量进行筛选。具体使用方法可查看帮助文档:help(feature_selector)
x_sel = feature_selector(dat_train = dat_train,
dat_test = NULL,
target = "loan_status",
occur_time = "issue_d",
filter = c("IV","COR","PSI","XGB"),
cv_folds = 1,
iv_cp = 0.02,
psi_cp = 0.2,
cor_cp = 0.9,
xgb_cp = 0,
hopper = TRUE)
最后筛选进来23个备选变量。
-- Feature filtering by PSI
-- Feature filtering by IV
-- Selecting variables by XGboost
-- Feature filtering by Correlation
> x_sel
[1] "addr_state" "all_util" "annual_inc"
[4] "avg_cur_bal" "bc_open_to_buy" "bc_util"
[7] "dti" "emp_length" "emp_title"
[10] "grade" "installment" "mo_sin_old_il_acct"
[13] "mo_sin_old_rev_tl_op" "mort_acc" "num_il_tl"
[16] "num_rev_accts" "percent_bc_gt_75" "purpose"
[19] "sub_grade" "term" "tot_cur_bal"
[22] "total_acc" "total_bc_limit"
变量分箱
接下来,我们使用训练集进行分箱。 get_breaks_all 函数提供了CART决策树细分箱、等频 equal_depth 、等宽 equal_width、卡方并箱等分箱方法。
我们通过tree_control 和 bins_control来控制分箱的过程和结果。bins_num 代表最多分多少箱, bins_pct 表示每箱最小占比, 代表卡方的显著性水平, mono 控制分箱后Y的单调性。
#最优化分箱
breaks_list = get_breaks_all(dat = dat_train,
x_list = x_list,
occur_time = "issue_d",
oot_pct = 0.7,
target = "loan_status",
best = TRUE,
tree_control = list(p = 0.05,
cp = 0.000001,
xval = 5,
maxdepth = 8),
bins_control = list(bins_num = 8,
bins_pct = 0.05,
b_chi = 0.1,
b_odds = 0.1,
b_psi = 0.05,
mono = 0,
odds_psi = 0.2,
kc = 1),
note = TRUE)
#代码执行结果
-- Getting optimal binning breaks
* all_util: 26,46,58,78,Inf
* annual_inc: 26947.5,39249.76,57934.82,88539.5,Inf
* bc_open_to_buy: 3035,5844,12038,20312,43650,Inf
* bc_util: 22.7,38.4,81.9,Inf
* dti: 18.85,30.52,Inf
* emp_length: c("10+ years", "6 years"),c("5 years", "other"),< 1 year,c("4 years", "1 year", "3 years"),2 years,n/a
我们可以通过对breaks_list文件进行修改,来人工调整分箱结果。
#分箱后结果表
bins_table = get_bins_table_all(dat = dat_train,
target = "loan_status",
x_list = x_list,
breaks_list = breaks_list,
dat_test = dat_test,
note = TRUE)
![](https://i-blog.csdnimg.cn/blog_migrate/21f8e63c3888776fdec81af6f16179fc.png)
WOE值转换
我们获得每个变量的分割点后,对训练集的备选变量进行WOE编码,并用训练集得到的WOE对测试集进行WOE替换。
#WOE转换
train_woe = woe_trans_all(dat = dat_train,
x_list = x_list,
target = "loan_status",
breaks_list = breaks_list,
note = TRUE)
test_woe = woe_trans_all(dat = dat_test,
x_list = x_list,
target = "loan_status",
bins_table = bins_table)
使用LASSO对X变量细筛选
为了避免多重共线性,得到最佳的预测变量集,我们使用LASSO对变量进一步筛选。
creditmodel::lasso_filter
函数根据使得auc或者ks最大的lambda来获得最佳的变量集,经过筛选后,剩下19个变量。
#使用lasso进一步筛选变量
select_vars = lasso_filter(dat_train = train_woe,
dat_test = test_woe,
x_list = x_list,
target = "loan_status",
sim_sign = "negtive",
best_lambda = "lambda.auc",
plot.it = TRUE,
seed = 42)
![](https://i-blog.csdnimg.cn/blog_migrate/ae0663d24339ae336affddd227dab62d.png)
逻辑回归模型拟合
确定了最终进入模型的变量后,我们使用WOE替换后的数据集进行逻辑回归模型拟合。
通过get_logistic_coef函数来获得拟合的系数和VIF等。
#建立LR模型
Formula = as.formula(paste("loan_status", paste(c(select_vars), collapse = ' + '), sep = ' ~ '))
lr_model_new = glm(Formula,
data = train_woe[, c("loan_status",select_vars )],
family = binomial(logit))
#获得LR的系数
dt_imp_LR = get_logistic_coef(lg_model = lr_model_new, file_name = NULL,
dir_path = LR_perf_dir_path, save_data = FALSE)
![](https://i-blog.csdnimg.cn/blog_migrate/faca8d46561aff6d649e2bbb5094874e.png)
建立评分卡
我们可以根据X变量的分箱结果和逻辑回归系数,来创建标准评分卡。
使用get_score_card
函数来建立标准评分卡。
#根据LR获得评分卡
LR_score_card = get_score_card(lg_model = lr_model_new,
bins_table = bins_table,
target = "loan_status")
![](https://i-blog.csdnimg.cn/blog_migrate/8910a919197b6bd78d9b1f9a0f74aed3.png)
对样本进行打分
有了评分卡之后,可用于对训练样本和新样本进行打分,使用信用评分进行审批决策。
#使用模型对样本进行打分
dat_train$score_LR = score_transfer(model = lr_model_new,
tbl_woe = train_woe)[, "score"]
dat_test$score_LR = score_transfer(model = lr_model_new,
tbl_woe = test_woe)[, "score"]
模型评估
最后,我们对建好的评分卡模型进行全方位的评估。
model_result_plot
函数使用KS、AUC、PSI、评分分布、累计LIFT对模型进行评估。
更多的内容可以参考文章《》
perf_tb = model_result_plot(train_pred = dat_train,
test_pred = dat_test,
target = "loan_status",
score = "score_LR",
gtitle = "lendingclub.LR",
save_data = FALSE,
plot_show = TRUE,
total = TRUE)
![](https://i-blog.csdnimg.cn/blog_migrate/1ee20d315650dc5f30029e74a19808af.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cf8805e8ba2492a14b327dffb3da9123.png)
结束语句
creditmodel
包为数据科学提供了一个高效的R工具。涵盖了数据科学一整套流程所需的,如数据探索\准备、数据转换\预处理、缺失值处理、异常值处理、特征衍生、特征筛选\降维、超参数搜索、数据挖掘、数据可视化、模型评估、策略分析、文本分析、客户分群等。
View on creidtmodel
CRAN https://cran.r-project.org/web/packages/creditmodel/index.html View creditmodel
on idrr https://rdrr.io/cran/creditmodel/
关于该包的更深入的介绍,还请关注汉森老师的公众号hansenmode
。
觉得本文有参考意义,请点个赞或者转发。