financial_risk

第六章:机器学习在信贷风控中的应用

章节大纲

  1. 开篇引言
    • 机器学习在信贷风控中的革命性作用
    • 从传统模型到AI驱动的风控体系演进
  2. 集成学习:XGBoost与LightGBM
    • 梯度提升原理与数学推导
    • XGBoost的正则化与优化
    • LightGBM的直方图算法与叶子生长策略
    • 特征重要性与模型解释
  3. 深度神经网络与特征自动学习
    • 信贷风控中的深度学习架构
    • 嵌入层与类别特征处理
    • 注意力机制在风险评估中的应用
    • Wide & Deep模型的实践
  4. 图神经网络在关联风险识别中的应用
    • 金融网络的图表示学习
    • GCN与GraphSAGE在担保圈识别中的应用
    • 异质图神经网络处理多类型关系
    • 动态图网络捕捉时序风险传导
  5. 案例分析:京东金融的实时风控系统
    • 系统架构与技术栈
    • 毫秒级决策的工程挑战
    • 模型迭代与在线学习
  6. 历史人物:吴恩达与AI在金融领域的应用
    • 深度学习的普及与金融科技革命
    • Coursera到Landing AI的转型之路
  7. 高级话题:强化学习在动态授信策略中的应用
    • MDP框架下的授信决策
    • Q-Learning与策略梯度方法
    • 多臂老虎机在A/B测试中的应用
  8. 本章小结

  9. 练习题

  10. 常见陷阱与错误

  11. 最佳实践检查清单

开篇引言

在金融科技革命的浪潮中,机器学习技术正在深刻改变信贷风控的格局。从传统的专家规则和线性模型,到如今的深度学习和图神经网络,风控技术经历了翻天覆地的变化。本章将深入探讨现代机器学习方法在信贷风控中的应用,重点介绍集成学习、深度学习和图网络三大技术流派,以及它们如何解决传统方法难以处理的复杂非线性关系和高维特征交互问题。

学习目标

完成本章学习后,您将能够:

技术演进路径

传统统计模型 (1950s-1990s)
    ↓
决策树与规则引擎 (1990s-2000s)
    ↓
集成学习方法 (2000s-2010s)
    ↓
深度学习革命 (2010s-现在)
    ↓
图网络与因果推断 (2015s-现在)

一、集成学习:XGBoost与LightGBM

集成学习通过组合多个弱学习器来构建强学习器,在信贷风控领域取得了巨大成功。XGBoost和LightGBM作为梯度提升树的杰出代表,已成为业界标准工具。这两个框架在处理大规模金融数据时展现出的高效性和准确性,使其在全球各大金融机构的风控系统中得到广泛应用。

1.1 梯度提升原理与数学推导

梯度提升(Gradient Boosting)是一种前向分步算法,通过迭代地添加新的弱学习器来最小化损失函数。其核心思想源于函数空间的梯度下降,将弱学习器的组合视为对目标函数的逐步逼近。

基本思想:给定训练数据集 ${(x_i, y_i)}_{i=1}^n$,梯度提升通过加法模型进行预测:

\[F(x) = \sum_{m=1}^M \gamma_m h_m(x)\]

其中 $h_m(x)$ 是第 $m$ 个基学习器,$\gamma_m$ 是其权重。

前向分步算法框架

初始化:$F_0(x) = \arg\min_c \sum_{i=1}^n L(y_i, c)$

对于 $m = 1, 2, …, M$:

  1. 计算负梯度(伪残差): \(r_{im} = -\left[\frac{\partial L(y_i, F(x_i))}{\partial F(x_i)}\right]_{F=F_{m-1}}\)

  2. 拟合基学习器 $h_m$ 到伪残差: \(h_m = \arg\min_h \sum_{i=1}^n (r_{im} - h(x_i))^2\)

  3. 计算最优步长: \(\gamma_m = \arg\min_\gamma \sum_{i=1}^n L(y_i, F_{m-1}(x_i) + \gamma h_m(x_i))\)

  4. 更新模型: \(F_m(x) = F_{m-1}(x) + \gamma_m h_m(x)\)

优化目标:在第 $m$ 轮迭代中,我们需要找到最优的 $h_m$ 和 $\gamma_m$ 使得:

\[(\gamma_m, h_m) = \arg\min_{\gamma, h} \sum_{i=1}^n L(y_i, F_{m-1}(x_i) + \gamma h(x_i))\]

其中 $L$ 是损失函数,$F_{m-1}$ 是前 $m-1$ 个学习器的累积预测。

梯度下降视角:使用泰勒展开近似损失函数:

\[L(y_i, F_{m-1}(x_i) + \gamma h(x_i)) \approx L(y_i, F_{m-1}(x_i)) + g_i \gamma h(x_i) + \frac{1}{2} h_i \gamma^2 h^2(x_i)\]

其中:

信贷风控中的损失函数选择

  1. 对数损失(Logistic Loss):用于违约概率预测 \(L(y, F) = \log(1 + \exp(-2yF)), \quad y \in \{-1, +1\}\)

    一阶梯度:$g = \frac{-2y}{1 + \exp(2yF)}$

    二阶梯度:$h = \frac{4\exp(2yF)}{(1 + \exp(2yF))^2}$

  2. Huber损失:对异常值鲁棒的回归损失 \(L_\delta(y, F) = \begin{cases} \frac{1}{2}(y - F)^2, & |y - F| \leq \delta \\ \delta|y - F| - \frac{1}{2}\delta^2, & |y - F| > \delta \end{cases}\)

  3. 分位数损失:用于风险价值(VaR)估计 \(L_\tau(y, F) = (y - F)(\tau - \mathbb{1}_{y < F})\)

1.2 XGBoost的正则化与优化

XGBoost(eXtreme Gradient Boosting)在传统梯度提升基础上引入了正则化项和系统优化,这使得它在防止过拟合和提升训练效率方面都有显著改进。陈天奇博士在2016年发表的论文中详细阐述了XGBoost的创新之处。

目标函数:XGBoost的目标函数包含损失项和正则化项:

\[\mathcal{L}^{(t)} = \sum_{i=1}^n l(y_i, \hat{y}_i^{(t-1)} + f_t(x_i)) + \Omega(f_t)\]

其中正则化项定义为:

\[\Omega(f) = \gamma T + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2\]

二阶泰勒展开优化

将目标函数在 $\hat{y}_i^{(t-1)}$ 处进行二阶泰勒展开:

\[\mathcal{L}^{(t)} \approx \sum_{i=1}^n [l(y_i, \hat{y}_i^{(t-1)}) + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] + \Omega(f_t)\]

去掉常数项后,简化为:

\[\tilde{\mathcal{L}}^{(t)} = \sum_{i=1}^n [g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i)] + \gamma T + \frac{1}{2}\lambda \sum_{j=1}^T w_j^2\]

叶子节点权重的闭式解

对于固定的树结构,定义 $I_j = {i q(x_i) = j}$ 为落入叶子 $j$ 的样本集合,目标函数可以重写为:
\[\tilde{\mathcal{L}}^{(t)} = \sum_{j=1}^T \left[ \left(\sum_{i \in I_j} g_i\right) w_j + \frac{1}{2} \left(\sum_{i \in I_j} h_i + \lambda\right) w_j^2 \right] + \gamma T\]

对 $w_j$ 求导并令其为零,得到最优权重:

\[w_j^* = -\frac{\sum_{i \in I_j} g_i}{\sum_{i \in I_j} h_i + \lambda} = -\frac{G_j}{H_j + \lambda}\]

代入后得到最优目标函数值:

\[\tilde{\mathcal{L}}^{(t)*} = -\frac{1}{2} \sum_{j=1}^T \frac{G_j^2}{H_j + \lambda} + \gamma T\]

分裂增益计算:对于树的每个潜在分裂点,XGBoost计算分裂增益:

\[Gain = \frac{1}{2} \left[ \frac{G_L^2}{H_L + \lambda} + \frac{G_R^2}{H_R + \lambda} - \frac{(G_L + G_R)^2}{H_L + H_R + \lambda} \right] - \gamma\]

其中:

这个公式可以理解为:(左子树得分 + 右子树得分) - 不分裂时的得分 - 复杂度成本

近似分裂算法

对于大规模数据,XGBoost采用分位数sketch算法:

  1. 全局近似:在树构建开始时提出所有候选分裂点
  2. 局部近似:在每次分裂后重新提出候选分裂点

分位数选择准则:使得每个桶中的样本权重(二阶梯度)大致相等:

\[\text{rank}_h(z) = \frac{1}{\sum_{(x,h) \in \mathcal{D}} h} \sum_{(x,h) \in \mathcal{D}, x < z} h\]

稀疏感知分裂

XGBoost原生支持稀疏数据,包括缺失值和零值:

对于每个特征:
    枚举默认方向 ∈ {左, 右}
    计算将缺失值分配到该方向的增益
    选择增益最大的方向作为默认方向

特征重要性:XGBoost提供三种特征重要性度量:

  1. Weight:特征被选作分裂点的次数
  2. Gain:特征带来的平均增益 \(Importance_{gain}(f) = \frac{1}{|T_f|} \sum_{t \in T_f} Gain_t\)
  3. Cover:特征影响的样本数量 \(Importance_{cover}(f) = \frac{1}{|T_f|} \sum_{t \in T_f} |I_t|\)

其中 $T_f$ 是使用特征 $f$ 进行分裂的所有节点集合。

1.3 LightGBM的直方图算法与叶子生长策略

LightGBM(Light Gradient Boosting Machine)由微软在2017年推出,通过创新的算法设计,在保持精度的同时大幅提升训练速度。在处理大规模金融数据时,LightGBM的效率优势尤为明显,使其成为实时风控系统的首选。

直方图算法:将连续特征离散化为k个bins,构建直方图:

原始特征值: [0.1, 0.15, 0.2, 0.25, 0.3, ...]
离散化bins: [bin1, bin1, bin2, bin2, bin3, ...]
直方图统计: {bin1: (G1, H1), bin2: (G2, H2), ...}

直方图构建过程

  1. 特征离散化
    • 对每个特征,根据其分布选择 $k$ 个分位点作为bin边界
    • 通常 $k = 255$ (8-bit表示),平衡精度和效率
  2. 直方图累积
    for sample in node_samples:
        bin_id = feature_to_bin[feature_value]
        histogram[bin_id].G += gradient[sample]
        histogram[bin_id].H += hessian[sample]
    
  3. 直方图差优化: 利用父节点直方图 = 左子节点直方图 + 右子节点直方图的性质: \(hist_{sibling} = hist_{parent} - hist_{node}\)

    这将构建成本从 $O(2 \times #data)$ 降至 $O(#data)$

优势分析:

Leaf-wise生长策略

Level-wise (XGBoost默认):
        Root
       /    \
      L1     R1     <- 同时生长所有叶子
     / \    / \
    L2 R2  L3 R3    <- 同时生长所有叶子

Leaf-wise (LightGBM):
        Root
       /    \
      L1     R1     
     / \            <- 选择增益最大的叶子分裂
    L2 R2           
       / \          <- 继续选择增益最大的叶子
      L3 R3

Leaf-wise的优势与控制

Gradient-based One-Side Sampling (GOSS)

GOSS的核心思想是:梯度大的样本对信息增益贡献更大,应该被保留;梯度小的样本已经被很好地训练,可以进行采样。

算法流程:

  1. 计算所有样本的梯度绝对值:$ g_i $
  2. 根据 $ g_i $ 降序排序样本
  3. 选择top $a\%$ 的大梯度样本(集合 $A$)
  4. 从剩余 $(1-a)\%$ 样本中随机采样 $b\%$(集合 $B$)
  5. 对集合 $B$ 中的样本赋予权重 $\frac{1-a}{b}$

信息增益估计: \(\tilde{V}_j(d) = \frac{1}{n} \left( \frac{(\sum_{x_i \in A_l} g_i + \frac{1-a}{b} \sum_{x_i \in B_l} g_i)^2}{n_l^j(d)} + \frac{(\sum_{x_i \in A_r} g_i + \frac{1-a}{b} \sum_{x_i \in B_r} g_i)^2}{n_r^j(d)} \right)\)

Exclusive Feature Bundling (EFB)

EFB利用高维数据的稀疏性,将互斥特征捆绑以减少特征数量。

互斥特征识别(图着色问题):

  1. 构建特征冲突图:如果两特征同时非零的样本数超过阈值,则冲突
  2. 按度数降序排序特征
  3. 贪心着色:将特征分配到冲突最小的bundle

Bundle合并算法

特征A范围: [0, 10]
特征B范围: [0, 5]
合并策略: Bundle(A, B) = A + B * offset
其中 offset = max(A) + 1 = 11

示例:
特征A: [0, 1, 0, 2, 0, 3]
特征B: [1, 0, 2, 0, 0, 0]
捆绑后: [11, 1, 22, 2, 0, 3]

类别特征的最优分裂

LightGBM对类别特征采用基于直方图的最优分裂算法:

  1. 统计每个类别的梯度和:$\sum_{i \in category_k} g_i$
  2. 根据梯度和排序类别
  3. 寻找最优分割点(将有序类别分为两组)

这将类别特征的分裂复杂度从 $O(2^k)$ 降至 $O(k \log k)$。

1.4 信贷风控中的实践应用

在实际的信贷风控场景中,XGBoost和LightGBM的应用需要考虑业务特点、数据特征和监管要求。以下是基于大量实践总结的最佳实践。

特征工程优化

在信贷场景中,XGBoost和LightGBM能自动处理多种数据挑战:

  1. 缺失值处理
    • 算法自动学习缺失值的最优分配方向
    • 缺失本身可能包含信息(如用户拒绝提供某些信息)
    • 实践建议:创建缺失值指示特征 is_missing_feature_x
  2. 类别特征编码
    • LightGBM原生支持类别特征,避免独热编码的维度爆炸
    • XGBoost需要预处理:Target Encoding或Ordinal Encoding
    • 高基数类别特征处理:
      频率编码: category_count / total_count
      目标编码: mean(target | category) with smoothing
      
  3. 特征交互捕捉
    • 树模型通过分裂路径天然捕捉特征交互
    • 深度为d的树可以捕捉最多d阶交互
    • 实践中3-6层深度通常足够

时序特征构造

信贷数据具有强时序性,需要构造动态特征:

基础统计特征:
- 最近N天的交易金额均值/标准差/最大值
- 交易频率的变化趋势(环比、同比)
- 时间衰减加权统计:weight = exp(-λ * days_ago)

行为模式特征:
- 交易时间分布(工作日vs周末,白天vs夜晚)
- 商户类别分布的熵值(消费多样性)
- 异常交易检测(基于个人历史基线)

风险累积特征:
- 逾期次数的指数平滑
- 最近一次逾期距今天数
- 授信使用率的移动平均

样本权重与类别不平衡

信贷违约率通常在1-5%,严重的类别不平衡需要特殊处理:

  1. 样本权重设置: \(w_i = \begin{cases} \frac{N_{total}}{2 \times N_{positive}}, & y_i = 1 \\ \frac{N_{total}}{2 \times N_{negative}}, & y_i = 0 \end{cases}\)

  2. XGBoost参数
    scale_pos_weight = sum(negative) / sum(positive)
    
  3. LightGBM参数
    is_unbalance = True  # 自动平衡
    # 或手动设置
    class_weight = {0: 1.0, 1: 20.0}
    

模型融合策略

三层Stacking架构:
    
Layer 1 (Base Models):
    - XGBoost (保守参数,防过拟合)
    - LightGBM (激进参数,捕捉复杂模式)
    - CatBoost (处理类别特征)
    - RandomForest (增加多样性)
    
Layer 2 (Meta Features):
    - 各模型预测概率
    - 模型间预测差异度
    - 预测置信度(基于叶子节点样本数)
    
Layer 3 (Meta Learner):
    - Logistic Regression with L2
    - 或简单平均(线上稳定性好)
    
最终集成:
    weighted_average with bayesian optimization

超参数调优框架

分阶段调优策略

  1. 第一阶段:树结构参数
    # XGBoost
    params_stage1 = {
        'max_depth': [3, 5, 7, 9],
        'min_child_weight': [1, 3, 5],
        'gamma': [0, 0.1, 0.2]
    }
       
    # LightGBM
    params_stage1 = {
        'num_leaves': [31, 63, 127],
        'min_data_in_leaf': [20, 50, 100],
        'min_sum_hessian_in_leaf': [0.001, 0.01, 0.1]
    }
    
  2. 第二阶段:采样参数
    params_stage2 = {
        'subsample': [0.6, 0.8, 1.0],
        'colsample_bytree': [0.6, 0.8, 1.0],
        'colsample_bylevel': [0.6, 0.8, 1.0]  # XGBoost
    }
    
  3. 第三阶段:正则化参数
    params_stage3 = {
        'reg_alpha': [0, 0.01, 0.1, 1],     # L1
        'reg_lambda': [0, 0.01, 0.1, 1]     # L2
    }
    
  4. 第四阶段:学习率与迭代次数
    # 使用早停策略
    learning_rate = 0.01
    n_estimators = 10000
    early_stopping_rounds = 100
    

监控指标选择

金融风控需要平衡多个业务指标:

  1. 区分度指标
    • AUC-ROC:整体区分能力
    • KS值:最大区分度,监管常用 \(KS = \max_{threshold}|TPR - FPR|\)
  2. 排序指标
    • AUC-PR:关注正类(违约)预测
    • NDCG:评估风险排序质量
  3. 业务指标
    • 准确率@固定通过率(如通过70%客户时的坏账率)
    • 期望损失:$E[Loss] = \sum_i PD_i \times EAD_i \times LGD_i$

生产部署考虑

  1. 模型大小控制
    • 限制树的数量(<500棵)
    • 控制树的深度(<8层)
    • 特征数量筛选(<200个)
  2. 预测延迟优化
    • LightGBM的预测速度通常快于XGBoost
    • 使用predict_leaf_index预计算,查表获取结果
    • 批量预测优于单条预测
  3. 模型更新策略
    • 增量学习:在旧模型基础上继续训练
    • 全量重训:定期(月度/季度)重新训练
    • A/B测试:新旧模型并行,逐步切换流量

二、深度神经网络与特征自动学习

深度学习在信贷风控中的应用正在快速增长,特别是在处理高维稀疏特征和复杂模式识别方面展现出独特优势。

2.1 信贷风控中的深度学习架构

基础架构设计

输入层 (原始特征)
    ↓
嵌入层 (类别特征编码)
    ↓
特征交互层 (Cross Network)
    ↓
深度网络 (DNN)
    ↓
输出层 (违约概率)

损失函数设计

对于类别不平衡的信贷数据,使用加权交叉熵:

\[L = -\frac{1}{N} \sum_{i=1}^N [w_1 y_i \log(\hat{y}_i) + w_0 (1-y_i) \log(1-\hat{y}_i)]\]

其中 $w_1 = \frac{N}{2N_1}$, $w_0 = \frac{N}{2N_0}$ 自动平衡正负样本。

Focal Loss改进

针对困难样本的学习:

\[FL(p_t) = -\alpha_t (1-p_t)^\gamma \log(p_t)\]

其中:

2.2 嵌入层与类别特征处理

Entity Embedding原理

将高基数类别特征映射到低维连续空间:

\[e_i = W_{embed} \cdot onehot(c_i) + b_{embed}\]
其中 $W_{embed} \in \mathbb{R}^{d \times C }$,$d$ 是嵌入维度,$ C $ 是类别数。

嵌入维度选择

经验公式:$d = \min(50, \lceil C ^{0.25} \times 1.6 \rceil)$

示例映射:

商户类别ID: 10234 → [0.23, -0.45, 0.67, ..., 0.12] (d=16)
地区编码: "310000" → [0.89, 0.34, -0.21, ..., 0.56] (d=8)

多值类别特征处理

对于用户的历史商户类别序列:

\[e_{multi} = \frac{1}{|S|} \sum_{c \in S} W_{embed}[c]\]

或使用注意力加权:

\[e_{multi} = \sum_{c \in S} \alpha_c \cdot W_{embed}[c]\]

其中 $\alpha_c = \frac{\exp(f_{att}(W_{embed}[c]))}{\sum_{c’ \in S} \exp(f_{att}(W_{embed}[c’]))}$

2.3 注意力机制在风险评估中的应用

Self-Attention用于交易序列建模

给定用户的交易序列 $X = [x_1, x_2, …, x_T]$,计算注意力权重:

\[Attention(Q,K,V) = softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V\]

其中:

多头注意力机制

\[MultiHead(Q,K,V) = Concat(head_1, ..., head_h)W_O\] \[head_i = Attention(QW_Q^i, KW_K^i, VW_V^i)\]

应用场景:

2.4 Wide & Deep模型的实践

架构设计

Wide Component (线性模型):
    - 记忆历史模式
    - 处理稀疏特征交叉
    
Deep Component (DNN):
    - 泛化到未见模式
    - 学习特征表示
    
联合训练:
    P(Y=1|x) = σ(w_{wide}^T[x, φ(x)] + w_{deep}^T a^{(l_f)} + b)

特征交叉设计

二阶特征交叉: \(\phi_k(x) = \prod_{i=1}^d x_i^{c_{ki}}\)

其中 $c_{ki} \in {0,1}$ 表示第 $i$ 个特征是否参与第 $k$ 个交叉。

训练策略

  1. Wide部分使用FTRL优化器(适合稀疏特征)
  2. Deep部分使用Adam优化器
  3. 联合损失函数反向传播

三、图神经网络在关联风险识别中的应用

金融风险具有强烈的网络传导特性,图神经网络(GNN)为识别担保圈、资金链等关联风险提供了强大工具。

3.1 金融网络的图表示学习

图构建方法

金融实体关系图 $G = (V, E, X, E_{feat})$:

邻接矩阵构建

担保关系矩阵 A_guarantee:
    A[i,j] = 担保金额(i→j) / 总资产(i)
    
资金流动矩阵 A_transfer:
    A[i,j] = Σ转账金额(i→j,t) × exp(-λ(T-t))
    
综合关系矩阵:
    A = α·A_guarantee + β·A_transfer + γ·A_equity

3.2 GCN与GraphSAGE在担保圈识别中的应用

Graph Convolutional Network (GCN)

节点表示更新: \(H^{(l+1)} = \sigma(\tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2}H^{(l)}W^{(l)})\)

其中:

GraphSAGE聚合器

AGGREGATE函数选择:
1. Mean: h_v^{(k)} = σ(W·MEAN({h_v^{(k-1)}} ∪ {h_u^{(k-1)}, ∀u ∈ N(v)}))
2. LSTM: 按随机顺序处理邻居
3. Pooling: element-wise max/mean pooling

担保圈检测算法

  1. 构建担保网络图
  2. GNN编码节点表示
  3. 社区检测识别担保圈
  4. 风险评分:$Risk_i = \sum_{j \in Circle_i} w_{ij} \cdot PD_j$