最近在思索关于决策流编排中策略、规则、模型等一些设计问题,在考虑未来接入模型(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!