节后第一节干货|CSI/PSI...模型上线后的稳定性效果评估

在信贷风控场景中,评分卡是模型体系中最常采用的形式,可以贯穿信贷产品的整个风控流程,包括贷前的申请评分模型(A卡)、贷前的反欺诈评分模型(F卡)、贷中的行为评分模型(B卡)、贷后的催收评分模型(C卡)等。无论是对于银行、消金、小贷等金融机构,还是以助贷、风控为主的金融科技公司,在实际开展信贷产品业务的过程中,评分卡模型在风控系统发挥着重要作用。
评分卡模型虽然好用,但在实际业务场景中,当评分卡模型开发完成并部署上线应用后,模型效果的监测与分析极为重要,这是数据分析或数据建模人员日常工作的重要内容之一。评分模型的综合性能主要由“区分能力”与“稳定能力”决定,分别从风控的准确率、通过率两个重要维度,直接影响着风控流程体系的决策效果,从而很大程度地决定了产品业务的综合效益。当模型的区分能力或稳定能力下降时,即可判定此模型已“失效”,需要下线进行调整和优化。

针对以上模型性能监测的业务背景,本文围绕评分卡模型体系中最常用的A卡,给大家介绍下如何评估模型上线后的稳定性效果。在具体分析与描述过程中,我们将结合实际案例,通过样本数据与代码实操介绍整个分析思路与流程。
1、案例场景介绍
某商业银行在开展个人信贷产品业务的过程中,为了提升风控体系的准确性能,在线上风控流程的贷前环节,已部署应用一款申请信用评分卡模型(A卡)。为了评估该模型的线上应用效果,数据分析人员需要对模型性能进行监测,从整体上分析模型的风控决策能力。但是,当用户群体还未有贷后表现数据时,模型的区分度是无法评估的,原因是区分度相关指标(如KS、AUC等)必须依赖于用户群体的目标表现数据。因此,在模型刚部署不久且无贷后表现数据期间,模型性能评估重点是从稳定度方面展开,相关指标主要是PSI、CSI等,接下来我们会结合案例依次进行介绍。
本案例待分析的测试数据,样本量30000条,特征数量15个,其样例如图1所示。其中,字段score为A卡模型分数,x01~x12为模型变量,date为申请日期,对于字段date日期,取值为2022/1与2022/2,分别代表线下建模时间窗数据、线上测试时间窗数据,具体分布如图2所示。
在这里插入图片描述
图1 样本数据示例
在这里插入图片描述
图2 样本日期分布

针对案例的业务场景特点与具体测试需求,评估模型的“稳定度”效果主要分为以下3个步骤:
(1)分析模型在建模样本、测试样本的PSI,评估模型分布整体波动程度;
(2)分析变量在建模样本、测试样本的PSI,评估变量分布整体波动程度;
(3)分析变量在建模样本、测试样本的CSI,评估变量在模型内变化差异。
接下来我们根据以上分析思路,依次对每个环节进行介绍,并解读相关指标的原理逻辑与应用思路。

2、模型与变量PSI
(1)PSI原理逻辑
PSI(Population Stability Index)群体稳定性指标,可以衡量模型分数或变量取值在不同样本分布的稳定性程度。PSI值越小,说明字段分布的稳定性越好;PSI值越大,说明字段分布的稳定性越差。
PSI的计算公式如下,其中pct_cur、pct_dev分别代表当前测试样本占比、开发建模样本占比,具体样例如图4所示。
PSI = sum (( pct_cur-pct_dev ) * ln( pct_cur/pct_dev))
在这里插入图片描述

在实际业务的具体应用中,根据PSI值大小可以判断稳定程度的好坏,参考标准如图3所示。
在这里插入图片描述
图3 PSI判断标准

(2)PSI性能评估
根据以上PSI原理逻辑,下面我们分别对模型score以及各个变量来进行评估,首先是模型评分的实现过程,具体代码如图4所示,最终输出PSI结果如图5所示。
在这里插入图片描述
图4 模型PSI实现

在这里插入图片描述
图5 模型PSI结果

由上图可知,模型PSI值为0.004,远小于判断阈值0.1,说明模型的稳定性很好。接下来我们看下模型各变量x01~x12的稳定性,批量实现过程与最终输出结果分别如图6、7所示。
在这里插入图片描述
图6 变量PSI实现

在这里插入图片描述
图7 变量PSI结果

由上图可知,模型各变量的PSI值均表现很小,最大值仅为0.0092,远小于0.1,说明模型各变量稳定性很好,这是模型表现稳定的根本原因,也就是说模型应用的稳定性能是由各个变量的分布决定的。
当模型score稳定性较好时,有些时候可以不用去进一步探索各变量的稳定性,当然,同步全面分析下是最好的。当模型score稳定性较差时,则必须分析每个变量的稳定性,这样可以明确哪些变量的分布直接影响了模型的稳定性,便于进一步对模型进行调整,具体采取措施主要有以下几点:
(1)对产生较大波动的变量重新划分评分区间以保持模型稳定;
(2)采用业务含义与数据分布相类似的变量替代波动较大变量;
(3)删除波动较大变量,通过其他模型变量进行评分(需重新评估模型性能);
(4)重新构建模型。
熟悉理解了PSI的应用逻辑之后,下面我们通过变量的另一个指标CSI,来进一步评估下模型变量的相对波动程度。

2、变量CSI
(1)CSI原理逻辑
CSI(Characteristic Stability Index)特征稳定性指标,可以衡量模型变量在不同样本分布的稳定性程度。CSI绝对值越大,说明特征的稳定性越差;CSI值为正时,代表样本向高分数段偏移;CSI值为负时,代表样本向低分数段偏移。在实际业务应用中,根据变量CSI值正负大小,可以判定特征样本评分向高低分数段的具体偏移程度。
但是,这里需要注意的是,CSI指标不像PSI指标那样有评估稳定性好坏的绝对阈值(0.1),而是仅仅针对当前模型,各个模型变量之间的波动性程度对比,而且当前模型变量不能与其他模型某个变量进行比较。CSI的计算公式如下,其中pct_cur、pct_dev分别代表当前测试样本占比、开发建模样本占比,score代表该模型变量的区间评分,具体样例如图5所示。
CSI = sum (( pct_cur-pct_dev ) * score )
在这里插入图片描述
图8 CSI分析样例

(2)CSI性能评估
根据以上CSI原理逻辑,下面我们分别对模型各个变量在模型内的相对波动程度来进行评估。在具体分析变量CSI指标时,我们除了需要获取变量取值分布之外,还必须依赖变量的评分逻辑,也就是不同取值区间的评分规则,这个是在建模结束时直接产出的,也是我们模型部署应用的逻辑。针对本案例模型,现给出各模型变量的评分逻辑如图9、10所示。
在这里插入图片描述
图9 模型变量评分逻辑1

在这里插入图片描述
图10 模型变量评分逻辑2

结合以上模型各变量的评分逻辑,我们来实现变量CSI的输出,这里以特征变量x01为例进行说明,具体代码与最终结果分别如图11、12所示。
在这里插入图片描述
图11 变量CSI实现

在这里插入图片描述
图12 变量x01指标CSI

由上图可知,特征变量x01的CSI值为0.05,说明该变量评分有向高分数段波动的趋势,但是评估波动程度大小,需要参看前边变量的PSI值,也就是图7对应x01的PSI值为0.0002,说明波动程度很小不需要进行调整。因此,变量CSI值主要是了解模型内各变量的相对波动情况,而不像PSI值那样有业务的绝对值含义。
熟悉了以上变量CSI的实现过程后,我们根据图9~10的评分逻辑,同理可以得到其他变量的CSI值,结果如图13所示,同时将各变量CSI值转化为可视化图表如图14所示。
在这里插入图片描述
图13 变量CSI结果汇总

在这里插入图片描述
图14 变量CSI分布对比

由上图可知,对于模型score的变量x01~x12,除了变量x08与x09的样本评分向低分段偏向趋势之外,其余变量均呈现向高分段偏向趋势。同时,从图14直观了解到,波动程度较大的变量主要是x03、x07、x11,且x03的波动程度最大。虽然这些模型变量的样本评分相对有一定波动,但都是客观存在的情况,而且都无需进行调整,原因为这些变量的PSI值远小于0.01(图7),在特征原始取值分布上的表现是非常稳定的。
综合以上分析,本文案例的线上A卡模型,无论从模型的宏观角度,还是从变量的围观角度,模型的稳定性表现是很好的,模型暂时无需调整,在后续时间窗内,可以进一步持续监测稳定性能。同时,当样本数据有贷后表现时,可以同时测试模型的区分度,也就是常用到的KS、AUC、Accuracy、Recall等指标。
为了便于大家对本文关于线上A卡模型稳定性效果评估的进一步理解,我们准备了与本文相对应的样本数据集与Python代码,供各位小伙伴实操练习,详情请大家移步至知识星球查看相关内容。
在这里插入图片描述

在这里插入图片描述

~原创文章

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C/C++编程中,判断INI文件中某个节中键值对是否全部读取完毕可以通过以下步骤: 1. 打开INI文件:使用 fopen 函数打开INI文件,获取文件指针。 2. 定位到指定节:通过读取每一行的内容,并判断该行是否是目标节的开始行(以'['开头)来定位到指定节。 3. 读取键值对:在定位到目标节后,可以通过 fgets 函数逐行读取节的内容,判断读取的内容是否是键值对(包含'='字符),如果是,则进行处理。 4. 判断是否读取完毕:判断条件可以有多种方式,例如可以在循环过程中使用计数器记录读取的键值对数量,然后与目标节中的键值对总数进行对比,如果相等则表示读取完毕。 5. 关闭INI文件:使用 fclose 函数关闭打开的INI文件。 以下是一个简单的示例代码: ```c #include <stdio.h> #include <string.h> int main() { FILE *file; char line[256]; int count = 0; int targetCount = 0; int isInTargetSection = 0; // 打开INI文件 file = fopen("config.ini", "r"); if (file == NULL) { printf("无法打开INI文件\n"); return -1; } // 定位到指定节 while (fgets(line, sizeof(line), file) != NULL) { if (line[0] == '[' && strstr(line, "[TargetSection]") != NULL) { isInTargetSection = 1; } if (isInTargetSection && strchr(line, '=') != NULL) { targetCount++; } // 判断是否读取完毕 if (targetCount > 0 && count == targetCount) { break; // 读取完毕 } } // 关闭INI文件 fclose(file); // 输出结果 printf("目标节中的键值对总数:%d\n", targetCount); printf("已读取的键值对数量:%d\n", count); return 0; } ``` 注意:示例代码仅用于演示思路,请根据具体的需求和INI文件格式进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值