首先,附上 Github 链接MetaSpore:https://github.com/meta-soul/MetaSpore,可搜索公众号元灵数智,在底部菜单了解我们 - 用户交流获取官方技术交流群二维码,进群与业内大佬进行技术交流。
关于数元灵
数元灵是一家专注于一站式的大数据智能平台新基建的SaaS公司,我们的在研项目包括云原生湖仓一体框架,分布式训练引擎和算法框架,高性能数据、模型在线服务,以及云原生一站式AI开发生产平台。
1.导读
随着中国 GDP 快速跃居世界第二位,消费金融市场的发展也进入了发展的快车道,根据艾瑞咨询2022年的预测,预计未来几年中国狭义消费信贷余额将以7.9%的复合增长率持续快速增长,到2026年将接近25万亿。面临如此巨大的市场,无论是传统商业银行,还是互联网金融科技新贵,都面临着金融风控问题。
传统的风控信用评估模型经过数十年的沉淀发展,技术相对成熟稳定,以美国 FICO 评分为代表,构建了规则引擎,促进了美国金融贷款业务快速发展。近年来,随着大数据和人工智能的技术实现了跨越式的发展,在新技术的加持下,使得金融机构可以更加多元化地勾勒用户画像,更加精准地构筑风控模型。
本文将以天池贷款违约数据集[1]为例,在数元灵科技推出的 MetaSpore on AlphaIDE 开发环境中,训练、评估违约预估模型,并根据预估概率给出智能信用评分。在后面的章节中,我们将会围绕着环境使用、问题建模、特征衍生、模型、评分卡等几个主题陆续展开。
2.MetaSpore On AlphaIDE
2.1 IDE环境配置与启动
注册或者登录AlphaIDE账号:https://registry-alphaide.dmetasoul.com/,进入 Alpha IDE 服务后,点击左侧应用服务,点击 Kubeflow 下拉菜单,可以进入 Jupyter 页面。
点击右上角创建 Notebook,然后在 CPU / RAM 下选择要申请的资源,推荐使用 2Core CPU X 8GB RAM以上的配置:
此处,需要勾选Kubeflow、AWS、Spark三个配置,之后就可以选择Launch,创建Notebook了。
等待Juyper Notebook建立后,点击connect进入,打开一个Terminal,运行:
git clone git@github.com:meta-soul/MetaSpore.git
等待代码库clone完成后,就可以运行我们的算法Demo并进行开发了。
2.2 训练机器学习模型
可以参考我们在MetaSpore的demo目录中的算法项目,里面涉及到推荐、搜索、NLP、风控相关的应用。这里我们以风控项目(demo/riskmodels/loan_default/)为例:
1.Spark Session启动:对于Spark Session的建立过程,如果在Alpha IDE中利用Spark集群进行分布式训练,需要增加spark.kubernetes.namespace参数配置,比如:
def init_spark(app_name, cluster_namespace, ..., **kwargs):
spark = pyspark.sql.SparkSession.builder\
.appName(app_name) \
.config("spark.kubernetes.namespace", cluster_namespace)
...
.getOrCreate()
sc = spark.sparkContext
print(sc.version)
print(sc.applicationId)
print(sc.uiWebUrl)
return spark
当然,也可以使用local模式运行,只需将上述代码第四行改为master("local")即可。在样本数量较少的情况下,推荐使用local模式。
2.启动模型训练脚本:按照 README.md 文档中的步骤,准备好训练数据,初始化我们需要的模型配置文件,就可以执行训练脚本了。
3.保存模型训练结果:可以参考我们在 default_estimation_spark_lgbm.py 中的处理方式,将训练好的模型和预估结果保存到S3的云存储中。
最后,需要说明的是,在第一次执行过程中需要下载一些依赖库,可能会需要等待一段时间。
3.智能风控算法落地
3.1 问题背景
在开始介绍具体代码实现之前,首先对数据集进行一下简单的介绍。本篇文章中采用的是天池社区中给出的数据集[1]。数据集以预测用户贷款是否违约为任务,数据来自某信贷平台的贷款记录,总数据量超过120万,包含47列变量信息,其中15列为匿名变量,20万条作为测试集 A,20万条作为测试集 B。数据集中“isDefault”作为训练的label,其他列可以作为模型的 features,里面包含id特征、类别特征、数值特征,完整的特征列介绍可以参考官方给出的数据集描述,下图给出数据样例展示:
所谓违约率预估,即是使用机器学习模型建立二分类的学习器,即通过模型预估:
在风控算法落地的时候,需要同时考虑模型的精度与可解释性,一般使用线性模型和树模型。我们接下来给出的例子也主要是基于 LightGBM 模型实现。
在违约率预估模型之上,我们可以建立用户的信用评分,类似于蚂蚁集团的芝麻信用分,一般说来,违约概率越低,我们的评分结果应该是越高的,方便贷款业务人员对客户进行评估。
3.2 特征工程
一般来说,金融贷款相关的评估问题以表格数据为主,特征工程的重要性是不言而喻的。数据集中常见的特征有 ID 类型、Categorical类型、连续数值类型,对于这些特征我们需要做:数据的EDA、缺失值补全、异常值处理、归一化、特征分箱、重要性评估等常见的操作。
处理过程可以参考GithHub代码库:https://github.com/meta-soul/MetaSpore/blob/main/demo/dataset,其中关于tianchi_loan部分的说明。
对于风控模型而言,特别是建立标准的风控评分卡,需要使用 WoE(Weight of Evidence)编码进行特征衍生。WoE代表当前特征分箱中好坏客户的比例的差异,并使用log函数进行平滑,计算公式:
其中,
分别代表此分箱中,好坏客户在总的好坏客户中的中的占比;
分别代表当前分箱中坏客户的数量与全体客户中坏用户的数量;
分别代表当前分箱中好客户的数量与全体客户中好用户的数量;
如果 WoE 的绝对值越大,这种差异就越明显,那么这个特征分箱就是非常好的 predictor;反之,如果 WoE 的绝对值为0,则说明该分箱中好坏客户比例等于随机坏客户和好客户比值,此时这个分箱就无预测能力。
计算过程可以参考我们的GitHub代码库:https://github.com/meta-soul/MetaSpore/tree/main/demo/dataset/tianchi_loan/woe.ipynb
在实际的业务场景中,会有大量工作集中在特征分箱与特征筛选上。在进行特征分箱过程中常用方法有等频、等距、Best-KS、ChiMerge 等方法;在进行特征筛选过程中,可以使用卡方检验、基于树模型的包裹法,以及基于 WoE 编码的 IV(Information Value)等方法。而这些工作需要针对具体业务进行大量数据分析和迭代,本篇文章在特征工程部分没有花费太多精力,以后有机会另开一个主题进行讨论。
3.3 模型训练
当样本和特征准备好之后,我们就可以进行模型的训练了,这里使用 Spark 版本的 LightGBM 模型,兼具模型的性能和可解释性,并能与AlphaIDE 以及 MetaSpore Serving 很好的兼容。模型训练代码:实际业务中的超参数寻优的空间会更大,消耗的计算时间也会更多。在超参数寻优结束后,可以对模型在全量样本集合上再训练一轮,训练结束后,我们可以将模型导出ONNX格式,具体可以参考[2,3]中的介绍,也可以参考我们GitHub代码仓库中给出的导出代码:https://github.com/meta-soul/MetaSpore/blob/main/demo/riskmodels/loan_default/default_estimation_spark_lgbm.py
3.4 模型评估
对于风控算法模型而言,除了常用的AUC指标用来评估模型的性能之外,还会使用KS(Kolmogorov–Smirnov)指标来进行评估,KS指标越大,那么模型的风险区分能力越强。KS 曲线的业务意义在于,我们允许模型犯少量的错,以换取最大限度识别出坏样本。一般来说:
KS<0.2,模型的区分能力不高,应用价值不大;
0.2<=KS<0.4,一般模型都集中在这个区间内,需要继续观察调优模型;
0.4<=KS<0.7,模型区分能力比较好,模型有较强应用价值;
KS>=0.7,可能出现过拟合现象,需要排查。
3.5 信用评分
假设我们已经通过机器学习模型合理地预估出贷款违约率,那么我们可以给出如下评分:
如果满足以下2点假设,那么我们可以推出常量A、B的计算公式:
a. 初始值假设: 1. 假设在的时候得分为,即:
b. Point of Double 假设: 2. 假设翻倍到,信用评分减少固定的PDO的分值:可以解出A和B的计算公式:以下是评分卡运行的结果,可以看到违约概率越低,credit score越高:
可以参考我们 GitHub 代码仓库中给出的代码实现:https://github.com/meta-soul/MetaSpore/tree/main/demo/riskmodels/loan_default/notebooks/credit_scorecard.ipynb
评分的结果也可以使用 KS 指标进行评估。此外,这里需要说明的是,如果要实现标准评分卡,需要使用线性模型,一般采用Logistic Regression,除了每个用户需要给出信用评分之外,还需要对线性模型截距、每一维特征的分箱都进行评分。
结束语
在本篇文章中,我们使用 MetaSpore on AlphaIDE 在开源数据集上快速落地了一个贷款违约率预估模型,并在这个模型基础上进行了评分卡的构建。在这版Demo系统的基础上,特征的衍生、分箱、筛选的手法还可以更加细腻,这些工作往往也决定着风控系统的性能上限,希望后续可以再开一个主题把这些坑填上。最后,给出我们的代码库地址以及AlphaIDE试用链接:
贷款违约率预估:https://github.com/meta-soul/MetaSpore/tree/main/demo/riskmodels/loan_default
MetaSpore一站式机器学习开发平台:https://github.com/meta-soul/MetaSpore
AlphaIDE试用链接:https://registry-alphaide.dmetasoul.com
欢迎大家试测并提出宝贵意见,谢谢大家~
参考文献:
官方资料
GitHub:
LakeSoul: https://github.com/meta-soul/LakeSoul
MetaSpore: https://github.com/meta-soul/MetaSpore
官网:元灵数智-云原生一站式数据智能平台-北京数元灵科技有限公司 (dmetasoul.com)
官方交流群:微信群:关注公众号,点击“了解我们-用户交流”
Slack:https://join.slack.com/t/dmetasoul-user/shared_invite/zt-1681xagg3-4YouyW0Y4wfhPnvji~OwFg