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

一、评分卡介绍

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

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

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

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

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

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

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

<think>嗯,用户这次明确要求了解风控决策引擎的架构设计,而且给出了三篇专业文献作为参考。看来用户可能是金融科技领域的从业者,或者正在设计相关系统。从用户引用的资料看,特别关注实时处理、规则管理和风控应用场景,说明需要的是落地性强的架构方案。 用户引用的文献[1]提到决策引擎要具备自动化决策和动态规则管理能力,文献[2]则强调要兼容简单和复杂两种决策流,文献[3]补充了贷前风控的具体实现细节。这些都需要在架构设计中体现出来。 上次我给出的通用大数决策引擎架构偏技术栈,这次应该更聚焦风控场景的特殊需求。比如金融风控对实时性要求极高(文献[3]提到<50ms响应),还要考虑规则回溯、灰度发布等合规需求。文献[2]提到的特征加工策略也很关键——简单规则直接全特征计算,复杂规则需要分段执行避免资源浪费。 在技术选型上,风控场景比通用决策更强调稳定性和可追溯性。规则引擎用Drools没问题,但存储层需要强化HBase的决策日志持久化能力(文献[3]的历史决策详情需求)。另外文献[1]提到的模型漂移检测在金融反欺诈中尤为重要,这块要用Prometheus+KS检验实现。 用户可能还隐含了性能疑虑,毕竟千万级QPS是风控系统常态。上次提到的多级缓存和向量化计算仍然适用,但针对金融场景要补充两点:1)Redis集群必须部署持久化机制防宕机 2)Flink流处理要配置精确一次语义(exactly-once)。 最后生成的三个问题都紧扣风控痛点:灰度更新对应文献[3]的规则回溯需求,规则冲突检测来自文献[1]的性能分析器模块,贷前风控则是文献[3]的核心场景。这样能帮用户延伸到具体业务实现层面。</think>以下是风控决策引擎的架构设计与核心组成部分,结合高并发、实时风控与合规性需求设计: --- ### **一、风控决策引擎架构设计(分层架构)** ```mermaid graph TD A[数据接入层] --> B[实时计算层] B --> C[规则/模型决策层] C --> D[决策执行层] D --> E[监控回溯层] ``` --- ### **二、核心组成模块** #### 1. **数据接入层** - **多源数据支持** - 实时流数据:Kafka(用户行为日志)、Flink CDC(数据库变更捕获)[^2] - 外部数据:API网关(征信/黑名单接口)、Redis集群(缓存实时特征) - **关键设计**:数据缓冲队列(防峰值冲击) + 数据格式标准化(Protobuf/AVRO) #### 2. **实时计算层** - **特征工程** - 流式特征:Flink窗口计算(如近1小时交易次数$$ \text{count}_{txn} = \sum_{t=now-1h}^{now} \delta_{txn} $$) - 图特征:Neo4j实时关系查询(设备关联用户数$$ N_{device-link} $$) - **模块化处理**:支持"短路计算"(命中黑名单则终止后续流程)[^2] #### 3. **规则/模型决策层** | **组件** | **技术实现** | **风控场景应用** | |----------------|----------------------------------|-------------------------------| | **规则引擎** | Drools(Rete算法优化) | 反欺诈规则集(如:$ \text{IF } \text{amount} > 10万 \text{ AND } \text{location} \notin \text{常用地} $) | | **模型服务** | TensorFlow Serving(GPU加速) | 信用评分模型($ \text{score} = f(\text{特征向量}) $) | | **策略路由** | 动态AB测试框架 | 新规则灰度发布 | #### 4. **决策执行层** - **决策流程控制** ```java // 伪代码:贷前风控决策流[^3] DecisionFlow flow = new FlowBuilder() .addStep("黑名单拦截", Rules::checkBlacklist) // 优先执行 .addStep("特征加工", Features::calculate) // 按需调用外部数据 .addStep("信用模型", Models::predict) // 复杂模型计算 .setTimeout(100ms) // SLA约束 .build(); ``` - **结果输出** - 实时响应:API网关(Spring Cloud Gateway) - 持久化存储:HBase(决策日志)、Elasticsearch(全文检索) #### 5. **监控回溯层** - **合规性设计** - 决策追溯:存储原始数据+规则快照[^3] - 重新执行:异常中断后恢复(依赖历史特征) - **实时监控** - 性能指标:Prometheus(P99时延 < 100ms) - 规则命中看板:Grafana动态仪表盘 --- ### **三、风控场景关键技术方案** #### 1. **高性能设计** - **规则引擎优化** - Rete算法索引:预编译规则网络 - 本地缓存:Caffeine(缓存高频规则集) - **计算加速** - 向量化执行:Apache Arrow内存数据格式 - 硬件加速:GPU模型推理(TensorRT) #### 2. **动态更新保障** ```mermaid graph LR A[规则管理台] -->|版本发布| B(Git仓库) B -->|触发| C[配置中心Nacos] C -->|热加载| D[决策节点] D -->|原子切换| E[规则执行器] ``` - **一致性机制**:版本号校验 + 灰度发布(10%流量先行) #### 3. **金融合规设计** - **审计追踪** - 全链路日志:TraceID串联(Jaeger实现) - 数据脱敏:字段级加密(如身份证$$ \text{ID} = \text{110***1990} $$) - **敏感操作** - 双人复核:关键规则修改需二次审批 - 变更留痕:数据库Binlog+操作日志 --- ### **四、典型风控应用** 1. **贷前审核** - 规则集:收入负债比($ \text{DTI} = \frac{\text{月负债}}{\text{月收入}} \leq 50\% $)[^3] - 模型:申请反欺诈评分(GBDT算法) 2. **交易监控** - 实时规则:同设备多账户交易($ \Delta t < 5\text{s} \rightarrow \text{报警} $) - 图计算:资金环路检测(Neo4j路径查询) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值