基于MetaSpore on AlphaIDE快速落地风控算法

首先,附上 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以上的配置:
32b2c8aa-dbf7-4bb4-b145-446c292f880f.png

此处,需要勾选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特征、类别特征、数值特征,完整的特征列介绍可以参考官方给出的数据集描述,下图给出数据样例展示:


所谓违约率预估,即是使用机器学习模型建立二分类的学习器,即通过模型预估:
P(\text{isDefault} = 1 \ |\ \text{features} )在风控算法落地的时候,需要同时考虑模型的精度与可解释性,一般使用线性模型和树模型。我们接下来给出的例子也主要是基于 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函数进行平滑,计算公式:
\text{WoE}_i=\ln \bigg(\frac{py_i}{pn_i}\bigg)=\ln \bigg(\frac{{\small\#} \text{Bad}_i / {\small\#} \text{Bad}_T }{{\small\#} \text{Good}_i / {\small\#} \text{Good}_T}\bigg)其中,
py_i,pn_i分别代表此分箱中,好坏客户在总的好坏客户中的中的占比;

{\small\#}Bad_i,{\small\#}Bad_T分别代表当前分箱中坏客户的数量与全体客户中坏用户的数量;

{\small\#}Good_i,{\small\#}Good_T分别代表当前分箱中好客户的数量与全体客户中好用户的数量;

如果 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 很好的兼容。模型训练代码:

使用Spark版本的机器学习模型的又一个优势,即在进行超参数寻优的过程,可以充分利用集群的计算资源。我们这里为了演示,使用 Hyperopt 对 learningRate 和 numIterations 两个超参数组合进行寻优,我们只需要进行如下定义超参数的寻优空间:

train_with_hyperopt函数定义完成后,就可以对参数组合进行寻优,寻优的过程较慢,当执行结束后就可以输出best_params查看最佳的参数组合:

实际业务中的超参数寻优的空间会更大,消耗的计算时间也会更多。在超参数寻优结束后,可以对模型在全量样本集合上再训练一轮,训练结束后,我们可以将模型导出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,可能出现过拟合现象,需要排查。

我们在MetaSpore中提供了KS值计算和KS画图的工具箱,当我们将测试结果写入了S3云存储之后,可以调用工具箱中的函数对模型进行评估:

3.5 信用评分

假设我们已经通过机器学习模型合理地预估出贷款违约率p,那么我们可以给出如下评分:\text{Score} = A-B\ln(\text{odds})= A-B\ln\bigg( \frac{p}{1-p} \bigg)
如果满足以下2点假设,那么我们可以推出常量A、B的计算公式:

a. 初始值假设: 1. 假设在\text{odds}_0的时候得分为S_0,即:S_0 = A-B\ln(\text{odds}_0)

b. Point of Double 假设: 2. 假设\text{odds}_0翻倍到2\times\text{odds}_0,信用评分减少固定的PDO的分值:S_0-\text{PDO}= A-B\ln(2\times\text{odds}_0)可以解出A和B的计算公式:B = \text{PDO} / {\ln2};A = \text{S}_0 - B\ln(\text{odds}_0)以下是评分卡运行的结果,可以看到违约概率越低,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试用链接:

欢迎大家试测并提出宝贵意见,谢谢大家~

参考文献:

  1. 天池贷款违约数据集:https://tianchi.aliyun.com/competition/entrance/531830/information

  2. 重磅!基于新一代MetaSpore平台快速搭建工业级推荐系统

  3. 多模态语义检索 | 基于 MetaSpore 快速部署 HuggingFace 预训练模型

  4. AlphaIDE - 新一代AI开发生产平台开放内测

官方资料

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339

推荐阅读更多精彩内容