【机器学习】决策树算法识别信贷风险
笔者邀请您,先思考:
1 如何利用机器学习算法做风险识别?
本文基于决策树算法设计和构建一个简洁的信贷审批模型,实现自动化和智能化量化和识别风险。

第一步:收集数据
本文使用UCI公开数据集German Credit Data。
这份数据集包括1000个样本,每个样本包括信贷和信贷人相关的数值和类别特征,目标变量表示这笔信贷是否违约。
第二步:探索数据
1 利用read.csv()加载数据集
# 加载数据集
credit <- read.csv("raw_data/credit.csv")
2 数据检视
dim(credit)
names(credit)
str(credit)

结论:
-
1 数据集拥有1000个样本和17个特征
-
2 特征集是数值型和因子型的组合
-
3 特征集源自信贷或者信贷人
3 类别变量分布
table(credit$checking_balance)
table(credit$savings_balance)

4 数值变量摘要
summary(credit$months_loan_duration)
summary(credit$amount)

结论:
-
贷款期限跨越4个月到72个月,中位数是18个月
-
贷款金额从250DM到18424DM,中位数是2320DM
5 目标变量分布
table(credit$default)

结论:
-
30%的违约率
第三步:数据准备
1 数据集划分
数据集划分为训练集和测试集。
-
训练集:训练模型
-
测试集:评价模型性能
利用随机抽样函数sample(),随机抽取90%数据集为训练集,剩余的数据集为测试集。
set.seed(123)
train_index <- sample(nrow(credit), 0.9*nrow(credit))
str(train_index)
credit_train <- credit[train_index,]
credit_test <- credit[-train_index,]
prop.table(table(credit_train$default))

或者
利用caret包的createDataPartition()函数,进行分层抽样,90%为训练集,10%为测试集。
set.seed(123)
train_index1 <- createDataPartition(
y = credit$default,
p = .9,
list = FALSE
)
credit_train1 <- credit[train_index1,]
credit_test1 <- credit[-train_index1,]
prop.table(table(credit_train1$default))
prop.table(table(credit_test1$default))

第四步:建立模型
使用C50包里面的C5.0决策树算法。
C50_model <- C5.0(
credit_train[-17],
credit_train$default
)
C50_model
summary(C50_model)
决策树规则集部分结果,如下图:

** 结论**:
决策树规则集前三行(见红色方框)的规则策略:
-
如果checking account balance 是大于 200DM或者 Unknown,则可能不违约
-
如果checking account balance 是小于 0DM 或者 在1-200DM之间,并且credit history 是perfect 或者very good,则可能违约
summary(C50_model)会显示混淆矩阵,还会指明训练模型的错误率,如下图所示:

结论:
-
训练模型的错误率:14.8%
决策树算法通常存有过拟合问题。因此,需要对模型做优化处理,然后在测试数据集上面评估模型性能。
第五步:评估模型
测试数据集评估模型性能。
credit_pred <- predict(
C50_model,
credit_test
)
CrossTable(
credit_test$default,
credit_pred,
prop.chisq = FALSE,
prop.c = FALSE,
prop.r = FALSE,
dnn = c("实际违约情况", "预测违约情况")
)

结论 :
-
测试数据集100个样本,错误率是27%。测试数据集上面模型表现的性能比训练数据集上要差
-
测试集上面对于违约情况的召回率是42%,这类错误是严重的错误,会导致银行损失
解决方案:
模型性能调优
第六步:优化模型性能
1 超参数调优
C5.0算法通过自适应提升改进C4.5算法。在C5.0函数里面,通过超参数trials设置。
credit_boost10 <- C5.0(
credit_train[-17],
credit_train$default,
trials = 10
)
summary(credit_boost10)

结论:
-
训练模型的错误率:3.8%,相对于前面的模型性能,改善了13.9%的错误率
credit_boost10_pred <- predict(
credit_boost10,
credit_test
)
CrossTable(
credit_test$default,
credit_boost10_pred,
prop.chisq = FALSE,
prop.c = FALSE,
prop.r = FALSE,
dnn = c("实际违约情况", "预测违约情况")
)

结论:
-
测试数据集的错误率是18%,相对于前面模型,改善了9%的错误率
-
测试集上面对于违约情况的召回率是61%,相对于前面的模型,提升了19%的命中率
2 错误类型的代价分析
对不同类型的错误,赋予不同的代价值
-
设计错误代价矩阵
matrix_dimensions <- list(c("no", "yes"), c("no", "yes"))
names(matrix_dimensions) <- c("predicted", "actual")
matrix_dimensions
error_cost <- matrix(
c(0, 1, 4, 0),
nrow = 2,
dimnames = matrix_dimensions
)
error_cost

-
构建模型和评价模型性能
credit_cost <- C5.0(
credit_train[-17],
credit_train$default,
costs = error_cost
)
credit_cost_pred <- predict(
credit_cost,
credit_test
)
CrossTable(
credit_test$default,
credit_cost_pred,
prop.chisq = FALSE,
prop.c = FALSE,
prop.r = FALSE,
dnn = c("实际违约情况", "预测违约情况")
)

结论:
-
测试集上面对于违约情况的召回率是79%
参考资料:
1 书籍 Machine learning with R 第五章
2 https://www.r-bloggers.com/how-to-identify-risky-bank-loans-using-c-50-decision-trees/
3 https://www.kaggle.com/uciml/german-credit/discussion/26658
版权声明:作者保留权利,严禁修改,转载请注明原文链接。
数据人网是数据人学习、交流和分享的平台http://shujuren.org 。专注于从数据中学习到有用知识。
平台的理念:人人投稿,知识共享;人人分析,洞见驱动;智慧聚合,普惠人人。
您在数据人网平台,可以1)学习数据知识;2)创建数据博客;3)认识数据朋友;4)寻找数据工作;5)找到其它与数据相关的干货。
我们努力坚持做原创,聚合和分享优质的省时的数据知识!
我们都是数据人,数据是有价值的,坚定不移地实现从数据到商业价值的转换!
加入数据人圈子或者商务合作,请添加笔者微信。

点击阅读原文,进入数据人网,获取数据知识。
公众号推荐:
链达君,专注于分享区块链内容。

艾鸽英语,专注于分享有趣味的英语内容。
数据工作
我们公司大数据风控中心部门诚招:
1 风险分析和建模工程师(信用评分模型,反欺诈模型,额度模型|熟练常用ML算法|熟练使用R或者Python)
2 数据开发工程师(大数据平台开发,数据采集,数据预处理)
3 爬虫工程师(掌握爬虫技术,掌握反爬策略)
4 数据分析或者建模实习生(研究生学历|统计学,数学,计算机专业|熟悉R或者Python|有金融数据项目可以加分)
工作地点:深圳大冲商务中心
薪资待遇:面议
感兴趣者,请加小编微信。
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!