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

一、评分卡介绍

之前介绍了决策引擎的规则集决策流,以及决策树决策表决策矩阵等功能实现。

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

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

评分卡,又称信用评分卡模型,是最常见的金融风控手段,用于信贷审批、信用卡申请等业务。区别于规则单维度评估,信用评分引入多特征维度,通过建立模型进行评分,作为资产质量的重要量化标准,如芝麻分即为一种评分卡。

信贷场景按流程分为贷前、贷中、贷后三部分,风控贯穿于全生命周期,对应评分卡也分为三种:

  • 贷前: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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值