python mooc 不同分数分级_智能风控|模型分数分级的几种方法

背景

机器学习模型在用户增长、智能风控等业务中有非常广泛的应用。常用的二分类模型输出结果为0~1之间的概率值。通常建模人员会将分数映射为0~1000之间的数值。并且通过特定手段将其划分为离散的几个级别。

连续的分值有诸多好处,比如可以用来判断两个用户谁的风险更高,或者谁的流失率更大。但是在实际使用中,大多数情况会将分数切分成不同的级别,比如[0,0.2)为A类用户,[0.2,0.4)为B类用户,等等。

比如在信贷风控场景下,信用评估模型输出用户逾期的概率在0~1之间。但实际使用中,通常将用户划分为ABCDE类,不同类别用户的资质不同,比如A类为优质客群,B类为次优客群,C类为潜力客户,D类为风险用户,E类为高危用户。如下表所示。

⭐️离散为等级的好处同样很多。

因为在风控策略体系中,需要对不同风险层级的客户给予不同的额度,从而对冲风险,平衡预期收益。如果给予每个分数一个不同的额度,则开发成本会非常大,并且由于客群质量波动,整个策略体系的稳定性会非常差。因此一定要划分为几个等级进行差异化定价。

本文首先介绍一下常用的模型分数映射逻辑,再从业务和技术2个角度,分别介绍一些等级划分方法。目录如下。背景

常用的分数映射逻辑

基于业务的等级划分

基于技术的最优等级划分

总结

Part1.常用的分数映射逻辑

分数的映射,最核心的需求,是将模型输出映射为某种业务人员较容易理解的指标。

1.box-cox变换。

首先最简单的映射逻辑就是将0~1的分数乘以1000,就可以得到0~1000的分数。当然通常模型的预测结果都是长尾分布,为了使得其分布更好看,通常会有机构使用cox-box变换,将分数朝着正态分布的样式调整。

from scipy.stats import boxcox

x_new, _ = boxcox(x)

2.信贷场景下,逻辑回归的评分映射。

以信贷为例,通常贷款机构对评分工具有如下需求:属性点数为正;

总分为正;

分数某个值代表特定的信用质量;

分数差别代表统一的信用质量变化。为了让每个模型都能满足以上四条,业内主要使用一种比率缩放的评分映射方法。

⭐️用一个例子来解释:首先期望一个用户的基础分650分,当这个用户,非逾期的概率是逾期的概率的2倍时,加50分;

非逾期的概率是逾期的概率的4倍时,加100分;

非逾期的概率是逾期的概率的8倍时,加150分;

以此类推,就得到了业内标准的评分卡换算公式:

其中,

是评分卡映射之后的输出,

是样本非逾期的概率,

是负样本逾期的概率。接下来看一下逻辑回归评分卡是如何和上式对应起来的。

逻辑回归方程:

在信用评分模型建模时,逻辑回归的线性回归成分输出结果为

,即对数似然。由对数换底公式,可知:

于是有:

换言之,只需要解出逻辑回归中每个特征的系数,然后将样本的每个特征值加权求和即可得到客户当前的标准化信用评分。式中的基础分(Base Score)650分和步长(Point of Double Odds,PDO)50分,则需要根据业务需求进行调整。

此外,还有一种映射方式,就是不考虑评分转换的真正含义,直接使得:

其中

是模型输出的似然概率,

通常设置为期望模型等于基础分时,对应的概率值。假设当前期望模型的20%分位点等于基础分,只需要将模型在测试集上排在20%分位的样本对应的概率值作为

即可。

如果预先设计好模型分数的区间,且对每个区间人数的占比有明确的限制,比如650分至700分为C区间,包含客群的20%。700分至750分为B区间,包含客群的60%。750分以上为A区间,包含客群的20%。这时候通过调整基础分和步长很难保证满足条件。这时候可以使用两个组合函数进行划分。此外还可以将步长(上式中的50)更改为随着

变化的动态步长。从而使得评分映射后的分布更加密集,这里不做更多的引申。

3.信贷场景下,集成树模型的评分映射逻辑。

由于树模型输出的概率值是负样本的概率,即分值越接近于1,等于1的概率越大。所以XGBoost/LightGBM应当具有如下分数映射公式:

其中

为集成模型的输出,

为基础分似然概率阈值。

Part2.基于业务的等级划分

基于业务划分等级的方法,是指希望能保存当前划分等级后,每个等级的样本数量占比,与之前版本模型基本一致。因此可以不必修改一些准入或额度策略。即如果原本分级用户数量占比如下图所示,本次分级的阈值,应当也使得划分结果如此。

看似很简单的一个问题,但在模型迭代时,通常希望保证分数阈值也不变。这是因为一些机构的线上环境是写死的,没有进行变量关联。如果修改阈值需要改动后续所有的联动决策路径。

所以此时需要通过调整Base score和DPO,使得模型最终分级结果落在上述每个区间的占比相同。当然,调整Base score和DPO想使得模型绝对满足上述逻辑是比较困难的。因此可以借用分段函数,采取500分以下一种Base score和DPO组合,500分以上一种Base score和DPO组合的逻辑进行调整。这不影响最终模型的排序能力。

Part3.基于技术的最优等级划分

分数分级本身是一个分箱问题。在风控领域有非常多的分箱方法,都有着优异的表现。那是不是可以借鉴一些变量处理过程中的分箱技术,对人群等级进行划分呢?

⭐️答案是可以的。

模型输出是一个连续变量。凡是可以对连续变量进行离散化的算法本质都是可以使用的。因此可以设计一种分数自动分级方法,不需要人为定义每个等级中的人群比例,自动生产最合理的分层逻辑,获得不同等级对应的划分阈值。

1.捕获率(Capture Rate)最优分箱

首先建立模型,得到开发样本的预测概率,再取出每个样本对应的标签。假设该模型分数越高代表用户资质越好,标签为1代表用户为按时还款的正样本,标签为0代表用户为逾期的负样本。

⭐️假设最终目标是将样本划分为5箱,且希望每箱样本个数不少于5%。

接下来按照分数降序排列,并且将用户按照分数等频分箱划分为20个等级,即每个等级都有当前开发样本5%的,如此,满足了分数分级的唯一的硬性要求:最小箱的占比不小于指定的比例。如下表所示。

接下来只需要在此基础上,对不同的层级进行合并,直到最终层级的个数满足业务要求。问题的本质就变为了,究竟把哪些层级合并在一起,才能使得最终划分的层级之间风险差异最大化。需要注意的是,只有相邻的箱可以直接合并,不然逻辑上是不通顺的。

至于风险差异,可以直接通过上表第四列的正样本占比的差值来衡量,正样本占比越高,该层风险越低。比如第16、17、18、19层级,虽然分数不同,但其实风险没有明显差异,这时候理应给予相同的额度。也就是说,这4个级别应该合并为同一个级别。另外,7、8等级和10、11等级的差值都是-1%,即发生了排序混乱(Bump)。刚好是最先需要合并的箱。也符合业务逻辑。

本方案的思想就是根据相邻层级之间,正样本占比差值,来决定哪些相邻的箱需要被合并。只要不断重复该过程,就可以得到最终的分箱结果。

2.卡方分箱

卡方分箱使用卡方检验确定最优分箱阈值。如果两个相邻的区间具有相似的标签分布,就将这两个区间进行合并。低卡方值表明它们具有相似的类分布。卡方检验就是对分类数据的频数进行分析。它的应用主要表现在两个方面:拟合优度检验和独立性检验(列联分析)。拟合优度是对一个分类变量的检验,即根据总体分布状况,计算出分类变量中各类别的期望频数,与分布的观察频数进行对比,判断期望频数与观察频数是否有显著差异,从而达到对分类变量进行分析的目的。

独立性检验是两个特征变量之间的计算,它可以用来分析两个分类变量是否独立,或者是否有关联。

卡方分箱就是利用独立性检验,来挑选箱划分节点的阈值。卡方分箱的过程可以拆分为初始化和合并两部分。

初始化:根据连续变量值大小进行排序,构建最初的离散化,即把每一个单独的值视为一个箱体。这样做的目的是从每个单独的个体开始逐渐合并。

合并:遍历相邻两项合并的卡方值,将卡方值最小的两组合并,不断重复直到满足分箱数目的限制。

⭐️在Python中可以使用toad.transform.Combiner()中的参数method控制分箱方法。

这里直接选择'chi'即代表卡方分箱。其中exclude参数固定不参与分箱的特征列名。其中data只有两列,分别是预测值(score)和正负样本标记(bad_ind)。同样可以指定最小箱样本占比(min_samples)、期望分级个数(n_bins)等。

import toad

combiner = toad.transform.Combiner()

combiner.fit(data, data['bad_ind'], method='chi',min_samples=0.05,n_bins=5)

总结

这篇文章介绍了几种常见的分数映射方法,并介绍了几种将连续分数离散化为等级的方法。希望对你有帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值