一、评分卡介绍
之前介绍了决策引擎的规则集
、决策流
,以及决策树
、决策表
、决策矩阵
等功能实现。
评分卡
作为决策引擎不可或缺的功能之一,今天主要聊一下评分卡及其相关实现。先看下官方的定义。
信用评分模型是一个量化工具,利用可观察到的借款人特征变量计算出一个数值(得分)来代表债务人的信用风险,并将借款人归类于不同的等级风险。
评分卡,又称信用评分卡模型,是最常见的金融风控手段,用于信贷审批、信用卡申请等业务。区别于规则单维度评估,信用评分引入多特征维度,通过建立模型进行评分,作为资产质量的重要量化标准,如芝麻分即为一种评分卡。
信贷场景按流程分为贷前、贷中、贷后三部分,风控贯穿于全生命周期,对应评分卡也分为三种:
-
贷前:A卡(Application score card 申请评分卡),用于筛选准入,申请授信。
-
贷中:B卡(Behavior score card 行为评分卡),用于风险预警,额度升降。
-
贷后:C卡(Collection score card 催收评分卡),用于贷后管理,催收策略。
二、评分卡实现
评分卡长什么样?以一个申请评分卡为例,简化为如下表格:
根据经验,通过抽象建立 DSL
,将评分卡分为规则部分
和决策表达式部分
,规则输出不再是 bool,而是具体的分数,决策部分即为评分。DSL
语法如下:
scorecards:
- scorecard:
name: scorecard_1
#rule part
rules:
- rule:
rule_name: "amout_1"
rule_group: "amout_group"
conditions:
- condition:
feature: amout
operator: LE
value: 5000
logic:
decision: 5
- rule:
rule_name: "amout_2"
rule_group: "amout_group"
conditions:
- condition:
feature: amout
operator: GT
value: 5000
- condition:
feature: amout
operator: LT
value: 10000
logic: AND
decision: -3
- rule:
rule_name: "amout_3"
rule_group: "amout_group"
conditions:
- condition:
feature: amout
operator: GE
value: 10000
logic:
decision: -6
- rule:
rule_name: "sex_1"
rule_group: "sex_group"
conditions:
- condition:
feature: sex
operator: EQ
value: M
logic:
decision: 10
- rule:
rule_name: "sex_2"
rule_group: "sex_group"
conditions:
- condition:
feature: sex
operator: EQ
value: F
logic:
decision: 5
#decision expression part
decision:
logic: SUM
output: ((score))
解析 DSL
,构造评分卡结构体 ScoreCard
:
type ScoreCard struct {
Name string `yaml:"name"`
Depends string `yaml:"depends"`
Rules []Rule `yaml:"rules,flow"`
Decision Decision `yaml:"decision"`
}
解析实现先计算规则部分,通过 rule.parse()
进行每一条规则解析,rule
解析参考第一篇文章:智能风控决策引擎系统可落地实现方案(一):DSL
func (sc *ScoreCard) parse() float64 {
log.Printf("scorecard %s parse ...\n", sc.Name)
var result = make([]string, 0)
for _, rule := range sc.Rules {
if rule.parse() {
result = append(result, rule.Decision)
}
}
return parseScoreCard(result, sc.Decision.Logic, sc.Decision.Output)
}
这里 logic
设置为 SUM
,即加和,将所有得分总和相加即可。
func parseScoreCard(scores []string, logic string, output string) float64 {
var score float64
switch logic {
case configs.Sum:
scoreStr, _ := operator.Math(strings.Join(scores, "+"))
score = scoreStr.(float64)
}
expr := strings.Replace(output, configs.ScoreReplace, strconv.FormatFloat(score, 'f', -1, 6
4), -1)
result, _ := operator.Math(expr)
return result.(float64)
}
编写测试用例,查看效果:
func TestScoreCard(t *testing.T) {
internal.SetFeature("amout", 7999)
internal.SetFeature("sex", "F")
dsl := dslparser.LoadDslFromFile("scorecard.yaml")
rs := dsl.ParseScoreCard(dsl.ScoreCards[0])
if rs == "2" {
t.Log("result is ", rs)
} else {
t.Error("result error,expert 2, result is ", rs)
}
}
三、更多问题思考:
1. 冗余计算
执行过程发现,所有的规则全部执行了一次,而实际上对一项评分只有一个规则满足命中。这里通过 rule_group
字段设置规则组,同一个规则组只要一个执行成功,其他规则可以不用再执行,添加执行缓存。
func (sc *ScoreCard) parse() float64 {
log.Printf("scorecard %s parse ...\n", sc.Name)
var result = make(map[string]string, 0)
for _, rule := range sc.Rules {
if _, exists := result[rule.RuleGroup]; !exists {
if rule.parse() { //hit
result[rule.RuleGroup] = rule.Decision
}
}
}
var scores = make([]string, 0)
for _, v := range result {
scores = append(scores, v)
}
return parseScoreCard(scores, sc.Decision.Logic, sc.Decision.Output)
}
通过改造后,已执行成功的规则组则不再执行。
2.加权求和
计算最终评分除了求和外,常用的还有加权求和,其他可支持的操作如:求最大,求最小,求平均等运算。
这里需要增加权重 weight
的属性,可以加到rule
结构体中,但增加的属性与规则语境不符,那么可以使用 decision
来实现,变更为list
,第一个表示分数,第二个表示权重。
- rule:
rule_name: "amout_1"
rule_group: "amout_group"
conditions:
- condition:
feature: amout
operator: LE
value: 5000
logic:
decision: [5, 1.2]
3.结果表达式
最终输出结果时使用 output: ((score))
,表示直接输出分数,此外还可以对分数再进行公式计算,如: output: 1.3 * ((score)) - 5
。这里对常规数学计算可使用字符串表达式,通过govaluate
进行计算。
func Math(expression string) (interface{}, error) {
expr, _ := govaluate.NewEvaluableExpression(expression)
result, err := expr.Evaluate(nil)
return result, err
}
4.复杂评分卡
相较于之前的评分卡,增加了多个特征规则共同决策评分,分析发现与决策表或决策树实现非常接近,可直接按其方式来完成。参考:智能风控决策引擎系统可落地实现方案(四)风控决策实现。
三、评分卡模型与机器学习模型
构建评分卡一般流程如下:
-
数据探索:获取数据,
EDA ( Exploratory Data Analysis )
探索数据分析 -
特征选取:特征分箱,
WOE
编码,基于IV、stepwise
特征筛选 -
样本选取:筛选样本并划分训练集、测试集、
OOT
-
逻辑回归:评分卡一般使用逻辑回归构建模型
-
评分卡转换:转为业务需要数值,易于分箱的分数
-
验证上线:评分卡模型部署及
abtest
验证
评分卡建模与机器学习建模基本建模流程一致,但评分卡模型发展历史更久,最早由 FICO
公司推出,在传统银行领域广泛使用,如申请信用卡时利用标准信息收集表格,通过计算每项信息分数,并通过公式即可获取客户风险评分,以此决定是否可以申请办卡及可申请额度。早期静态评分卡主要依赖专家经验,但相比规则决策,其可快速判断,客观透明,评分卡建模通常使用逻辑回归,可解释性更强,有着广泛的参考和应用性。
而随着大数据领域及互联网金融发展,传统评分卡建立和升级维护也越困难,机器学习建模在其基础上有了长足的发展,如 GBDT
算法让建模有了更多选择,更有助于新型互联网信贷业务。机器学习相关内容参考:智能风控决策引擎系统可落地实现方案(三)模型引擎实现。
四、More
至此,决策引擎核心功能均已实现,但一个生产级系统还有很多细节问题未处理,如异常及错误日志处理、并发网络处理,还有一些辅助功能,如热部署、权限、审批、基本变量定义等
,而一个好的决策引擎对数据、结果的监控必不可少,下一章就实时监控大盘方面给出更多解决方案,敬请关注。