2. 离线特征基础:离线特征的计算流程与典型举例

离线特征(Batch Features)是金融风控体系中最成熟、最基础的特征生产方式。它基于历史存量数据,通过批量计算生成特征,通常以 T+1 或小时级延迟交付给模型使用。本章将系统拆解离线特征的计算流程,并给出两个最典型的金融风控特征案例。

2.1 离线特征计算流程

一个完整的离线特征生产链路包含四个核心阶段:数据采集 → ETL → 特征工程 → 特征存储。每个阶段都有明确的输入、输出和关键控制点。

核心原则:离线特征追求“全量、准确、可回溯”。计算过程必须保证数据完整性,支持历史回刷,且特征口径在时间轴上保持一致。

2.1.1 阶段一:数据采集

数据采集是离线特征的起点,负责从各个数据源获取原始数据。金融风控场景中,数据源通常包括:

  • 内部业务库:用户信息表、订单表、还款计划表、资金流水表。
  • 外部数据源:征信报告(央行征信、百行征信)、多头借贷数据、黑名单库、设备指纹。
  • 日志数据:用户行为埋点、APP 操作日志、API 调用日志。

采集方式以批量拉取为主,常用 Sqoop、DataX、Flume 等工具,按固定时间窗口(每日凌晨)将数据同步到离线数仓(Hive、MaxCompute)。

2.1.2 阶段二:ETL(数据清洗与转换)

ETL 阶段解决原始数据的“脏、乱、差”问题,是特征质量的生命线。主要操作包括:

ETL 步骤 典型操作 金融风控场景示例
数据清洗 去重、空值填充、异常值过滤 剔除重复的借款申请记录;将缺失的身份证号标记为“未知”
数据转换 格式统一、字段派生、编码映射 将日期字符串转为时间戳;将性别编码为 0/1
数据关联 多表 Join、维度退化 将用户基本信息表与借款订单表通过 user_id 关联
数据分区 按日期、地域、业务线分区 按 dt=2025-01-01 分区存储当日数据
避坑提示:ETL 阶段最容易出现“数据漂移”——即上游表结构变更导致下游特征计算失败。建议在 ETL 入口层做 Schema 校验和字段血缘追踪。

2.1.3 阶段三:特征工程

特征工程是离线特征计算的核心环节,将清洗后的数据转化为模型可用的数值特征。金融风控中常见的特征工程操作包括:

  • 统计聚合:对用户历史行为做 count、sum、avg、max、min、std 等聚合计算。例如“近 30 天借款次数”。
  • 时间窗口计算:按固定时间窗口(7 天、30 天、90 天、180 天)滑动计算特征。
  • 比率与衍生:计算逾期率、使用率、增长率等复合指标。
  • 编码与分箱:对离散变量做 One-Hot 编码、WOE 编码;对连续变量做等距/等频分箱。

以下是一个典型的离线特征计算 SQL 示例:

-- 计算用户近 30 天多头借贷平台数
SELECT
    user_id,
    COUNT(DISTINCT platform_id) AS multi_platform_30d
FROM
    credit_query_log
WHERE
    query_time >= DATE_SUB(CURRENT_DATE, 30)
    AND query_type = 'loan_application'
GROUP BY
    user_id;

2.1.4 阶段四:特征存储

计算完成的离线特征需要持久化存储,供模型训练和线上推理使用。常见的存储方案:

存储类型 技术选型 适用场景
离线数仓 Hive、MaxCompute 模型训练、批量回刷、历史分析
特征存储服务 Feast、Tecton、自研 KV 线上推理时低延迟读取离线特征
宽表 HBase、ClickHouse OLAP 查询、特征探索
注意:离线特征存储必须保留时间分区和特征版本。当模型需要回刷历史样本时,必须能精确还原某个时间点的特征值,否则会导致训练与线上特征不一致(Training-Serving Skew)。
离线特征计算流程 数据采集 Sqoop / DataX ETL 清洗 / 转换 / 关联 特征工程 聚合 / 窗口 / 衍生 特征存储 Hive / Feast 关键产出: 每日全量特征宽表(user_id + dt + 特征列),支持历史回刷和版本管理。 延迟:T+1 或小时级;数据量:TB 级;计算引擎:Spark / Hive SQL。 时间轴: 00:00 数据采集 → 02:00 ETL 完成 → 04:00 特征工程计算 → 06:00 特征存储就绪 → 08:00 模型训练开始

2.2 典型离线特征举例

在金融风控领域,离线特征种类繁多,但有两个特征几乎出现在所有信贷模型中:多头借贷和历史逾期率。下面分别给出它们的定义、计算逻辑和业务含义。

2.2.1 多头借贷特征

定义:多头借贷指用户在多个借贷平台同时或短期内申请借款的行为。多头借贷特征量化了用户的“多头程度”,是预测违约风险的核心指标之一。

常见计算口径:

特征名称 计算逻辑 时间窗口 业务含义
多头平台数 近 N 天用户申请借款的去重平台数量 7d / 30d / 90d 多头程度越高,资金链断裂风险越大
多头申请次数 近 N 天用户申请借款的总次数 7d / 30d / 90d 申请频率反映资金紧迫程度
多头平台类型数 近 N 天用户申请的平台类型(P2P、消金、银行)去重数 30d / 90d 跨类型多头风险更高
多头增速 (近 7 天多头平台数 - 前 7 天多头平台数)/ 前 7 天多头平台数 7d vs 前 7d 多头增长趋势,预警快速恶化
业务经验:当用户近 30 天多头平台数 ≥ 5 时,违约概率显著上升。部分机构将“近 7 天多头申请次数 ≥ 10”作为自动拒绝规则。

2.2.2 历史逾期率特征

定义:历史逾期率反映用户在过去一段时间内的还款表现,是衡量用户信用水平最直接的指标。

常见计算口径:

特征名称 计算逻辑 时间窗口 业务含义
历史逾期次数 用户历史所有借款中逾期(M1+)的总次数 全生命周期 逾期次数越多,信用越差
历史逾期率 逾期次数 / 总借款次数 全生命周期 逾期频率,标准化指标
近 N 天逾期率 近 N 天逾期次数 / 近 N 天借款次数 30d / 90d / 180d 近期还款表现,时效性更强
最大逾期天数 用户历史所有逾期中逾期天数的最大值 全生命周期 逾期严重程度,M3+ 为高风险
逾期恢复率 逾期后最终还清的次数 / 总逾期次数 全生命周期 反映用户还款意愿和恢复能力
计算注意:历史逾期率特征必须区分“首逾”和“非首逾”。首逾(首次借款即逾期)的用户风险远高于非首逾用户。建议单独计算“首逾标志”作为独立特征。
典型离线特征:多头借贷 vs 历史逾期率 多头借贷特征 数据来源: 征信查询记录、平台申请日志 核心指标: 多头平台数、申请次数、平台类型数 时间窗口: 7d / 30d / 90d 风险阈值: ≥5 平台 → 高风险 计算引擎: Hive SQL / Spark 历史逾期率特征 数据来源: 还款计划表、资金流水表 核心指标: 逾期次数、逾期率、最大逾期天数 时间窗口: 全生命周期 / 30d / 90d / 180d 风险阈值: 逾期率 > 20% → 高风险 计算引擎: Hive SQL / Spark 互补

2.3 离线特征的关键设计原则

在构建离线特征体系时,需要遵循以下设计原则,以保证特征的质量和可用性:

  1. 可回溯性:每个特征值必须能精确对应到某个时间点。使用“快照表”或“拉链表”存储历史状态,避免使用当前数据回溯历史。
  2. 一致性:离线训练特征与线上推理特征的计算逻辑必须完全一致。建议将特征计算逻辑封装为特征函数,离线和线上共用同一份代码。
  3. 时效性:离线特征虽然延迟较高,但必须满足模型训练和决策的时间要求。通常 T+1 特征在早上 8 点前必须就绪。
  4. 可扩展性:特征体系应支持快速新增特征,而不需要重构整个计算链路。建议采用“特征组”+“特征视图”的分层架构。
常见陷阱:很多团队在离线特征计算中使用“未来数据”——例如用用户 2025-01-10 的还款行为去预测 2025-01-05 的违约风险。这是典型的数据泄露(Data Leakage),会导致模型在线上效果远低于离线评估。务必在特征计算时严格按时间分区,禁止跨时间窗口使用未来信息。