智能风控决策引擎系统可落地实现方案(五)评分卡实现

I.评分卡介绍

之前介绍了决策引擎的规则集、决策流,以及决策树、决策表、决策矩阵等功能实现,文章参考:

评分卡作为决策引擎不可或缺的功能之一,今天主要聊一下评分卡及其相关实现。先看下官方的定义。

信用评分模型是一个量化工具,利用可观察到的借款人特征变量计算出一个数值(得分)来代表债务人的信用风险,并将借款人归类于不同的等级风险。

Wikipedia
评分卡,又称信用评分卡模型,是最常见的金融风控手段,用于信贷审批、信用卡申请等业务。区别于规则单维度评估,信用评分引入多特征维度,通过建立模型进行评分,作为资产质量的重要量化标准,如芝麻分即为一种评分卡。
信贷场景按流程分为贷前、贷中、贷后三部分,风控贯穿于全生命周期,对应评分卡也分为三种:
  • 贷前:A卡(Application score card 申请评分卡),用于筛选准入,申请授信。

  • 贷中:B卡(Behavior score card 行为评分卡),用于风险预警,额度升降。

  • 贷后:C卡(Collection score card 催收评分卡),用于贷后管理,催收策略。

II.评分卡实现
评分卡长什么样?以一个申请评分卡为例,简化为如下表格:
根据经验,通过抽象建立 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 解析参考第一篇文章:智能风控决策引擎系统可落地实现方案
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, 64), -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.复杂评分卡
相较于之前的评分卡,增加了多个特征规则共同决策评分,分析发现与决策表或决策树实现非常接近,可直接按其方式来完成。参考:智能风控决策引擎系统可落地实现方案(四)风控决策实现
III.评分卡模型与机器学习模型

构建评分卡一般流程如下:

  • 数据探索:获取数据,EDA ( Exploratory Data Analysis ) 探索数据分析
  • 特征选取:特征分箱,WOE 编码,基于 IV、stepwise 特征筛选

  • 样本选取:筛选样本并划分训练集、测试集、OOT

  • 逻辑回归:评分卡一般使用逻辑回归构建模型

  • 评分卡转换:转为业务需要数值,易于分箱的分数

  • 验证上线:评分卡模型部署及 abtest 验证

评分卡建模与机器学习建模基本建模流程一致,但评分卡模型发展历史更久,最早由 FICO 公司推出,在传统银行领域广泛使用,如申请信用卡时利用标准信息收集表格,通过计算每项信息分数,并通过公式即可获取客户风险评分,以此决定是否可以申请办卡及可申请额度。早期静态评分卡主要依赖专家经验,但相比规则决策,其可快速判断,客观透明,评分卡建模通常使用逻辑回归,可解释性更强,有着广泛的参考和应用性。
而随着大数据领域及互联网金融发展,传统评分卡建立和升级维护也越困难,机器学习建模在其基础上有了长足的发展,如 GBDT 算法让建模有了更多选择,更有助于新型互联网信贷业务。机器学习相关内容参考:智能风控决策引擎系统可落地实现方案(三)模型引擎实现
IV.More

至此,决策引擎核心功能均已实现,但一个生产级系统还有很多细节问题未处理,如异常及错误日志处理、并发网络处理,还有一些辅助功能,如热部署、权限、审批、基本变量定义等,而一个好的决策引擎对数据、结果的监控必不可少,下一章就实时监控大盘方面给出更多解决方案,敬请关注。

文章相关代码请关注公众号  技术岁月 ,发送关键字 决策引擎 获取。
请使用浏览器的分享功能分享到微信等