CoolGuard风控系统配置评分卡、权重策略|QLExpress脚本

最近在思索关于决策流编排中策略、规则、模型等一些设计问题,在考虑未来接入模型(python模型、pmml模型等)时,看到很多同类系统都有评分卡功能,然后就看到这篇文章juejin.cn/post/731397...,然后就发现,这个不是已经实现了,但是从来没有说明怎么利用现有功能来做评分卡。那这篇就详细展开讲一下。

评分卡示例表

变量 条件区间 分值
age <=20 10
>20, 且<=25 20
>25, 且<=35 30
>35, 且<=45 25
>45 20
gender 10
15
未知 0
maritalStatus 已婚 30
未婚 20
未知 0

通过代码很容易实现上面的评分卡,那么在系统中应该怎么做?

步骤

字段

首先新增了三个字段

接口

因为是新增的字段,还需要配置在接口请求参数中

然后分别配置策略集、策略、规则

策略集

策略集的chain就是决策流,只是目前还是表达式,不是很友好。

如下图表示的是并行执行策略编码为scorecard的策略,当然一条策略串并差别不大。

策略

策略选择权重模式,设置阈值列表,注意最大的分数要足够大,判断时是从小到大直到满足小于等于。

规则

规则是权重策略下的规则时就不用配置处置了,额外需要配置的是计算表达式。

如下配置了6条规则

年龄的评分规划了5条规则,具体的一条规则如下图,其他类似

性别和婚姻状况的评分可以合并为一条规则,如下图,当然想配置和年龄一样的多条也是可以的

java 复制代码
score = 0;
if (N_S_gender == "男") {
    score = score + 10;
} else if (N_S_gender == "女") {
    score = score + 15;
} else {
    score = score + 0;
}

if (N_S_maritalStatus == "已婚") {
    score = score + 30;
} else if (N_S_maritalStatus == "未婚") {
    score = score + 20;
} else {
    score = score + 0;
}
return score;

将所有的策略集、策略、规则发布上线后就可以测试了。

测试

因为现在系统还未提供直接测试规则/策略/策略集的方法,只能发接口形式整体测试

或者如下这种方式

测试如上分别设置年龄30、性别男、已婚,结果如下

再对比阈值列表,(56,89]最终结果为视频

权重策略

其实从上面就能理解权重模式的策略了,简单可以归结为下面公式,权重策略最终分数结果就是所有规则的以下两项乘积之和。
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> f ( x ) = ∑ i = 0 n c i ( x 1 ) f i ( x i ) f(\text{x}) = \sum_{i=0}^{n} c_i(x_1)f_i(x_i) </math>f(x)=i=0∑nci(x1)fi(xi)

<math xmlns="http://www.w3.org/1998/Math/MathML"> c i ( x i ) c_i(x_i) </math>ci(xi):每个规则条件函数,在代码逻辑中是true/false,但在数据函数中是1/0

<math xmlns="http://www.w3.org/1998/Math/MathML"> f i ( x i ) f_i(x_i) </math>fi(xi):每个规则的函数

之前是有分享过这篇文章的mp.weixin.qq.com/s/_5Cc5IMd1...,但是现在看看其实很多已经变化了,只能简单参考,后续还需要更新一下。

其他玩法

因为这个评分卡相对简单,其实可以有更多的其他玩法

相比于常规的配置一条条规则外,甚至可以写一条脚本实现,如下

java 复制代码
score = 0;

if (age <= 20) {
    score = score + 10;
} else if (age > 20 && age <= 25) {
    score = score + 20;
} else if (age > 25 && age <= 35) {
    score = score + 30;
} else if (age > 35 && age <= 45) {
    score = score + 25;
} else if (age > 45) {
    score = score + 20;
}

if (gender == "男") {
    score = score + 10;
} else if (gender == "女") {
    score = score + 15;
} else {
    score = score + 0;
}

if (maritalStatus == "已婚") {
    score = score + 30;
} else if (maritalStatus == "未婚") {
    score = score + 20;
} else {
    score = score + 0;
}

return score;

单论这个场景脚本位置不限,可以是在动态脚本里

可以是在一个规则里,创建一个规则把脚本作为表达式就行,需要注意的可能就是上面的age、gender、maritalStatus需要换成之前配置的字段,也就是N_N_age、N_S_gender、N_S_maritalStatus

而且这样也有一个很重要的好处:权重策略以分数为基础最终的产出其实也是处置结果,但实际上更多情况分数还会被再次利用,如上假如评分卡产出是信誉分或其他,还会被后面的规则或模型使用,那么他就不能作为结果产出,而是作为一种数据转换(类似于三方接口拿字段数据)。如果作为动态字段那就很合适了,可以以此作为规则条件,甚至可以作为指标等等。

不过也不是所有的评分卡都适合在动态字段里设置,像上面的例子,需要的字段都已经在动态字段之前就存在,就很适合。

最后

另外这段时间还有其他的更新优化,无法一一列举,只说一些关键的吧。

1、消息模版

做了关于消息模版的校验等优化

2、字段设置

如下图,规则命中动作的字段设置,支持清空、设置常量、设置变量。不过还不支持表达式。

3、字段扩展

新增了字段扩展接口,增加灵活性

项目默认实现,在普通字段解析完成后做一些归属地的字段设置。

see you!

相关推荐
几度风雨见丹心4 小时前
vue+elementUI 进行表格行内新增及校验,同行其他输入框数据影响当前输入框校验结果
前端·vue.js·elementui
开发者小天4 小时前
在Ant Design Vue 中使用图片预览的插件
前端·javascript·vue.js·前端框架
华科云商xiao徐4 小时前
手把手教你用Go打造带可视化的网络爬虫
前端·爬虫
_月下闲人4 小时前
已掌握 Vue2 的开发者,快速上手 Vue3
前端·javascript·vue.js
光头程序员4 小时前
vite_react 插件 find_code 最终版本
前端·javascript·react.js
陈随易4 小时前
改变世界的编程语言MoonBit:项目文件详解
前端·后端·程序员
用户6120414922134 小时前
C语言做的城市天气数据管理与统计
c语言·后端·敏捷开发
拜无忧4 小时前
three.js纸飞机飞行撞建筑
前端·three.js
ursazoo4 小时前
记一次线上API调用失败的排查过程:从405到时间同步
后端