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)。
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+ 为高风险 |
| 逾期恢复率 | 逾期后最终还清的次数 / 总逾期次数 | 全生命周期 | 反映用户还款意愿和恢复能力 |
计算注意:历史逾期率特征必须区分“首逾”和“非首逾”。首逾(首次借款即逾期)的用户风险远高于非首逾用户。建议单独计算“首逾标志”作为独立特征。
2.3 离线特征的关键设计原则
在构建离线特征体系时,需要遵循以下设计原则,以保证特征的质量和可用性:
- 可回溯性:每个特征值必须能精确对应到某个时间点。使用“快照表”或“拉链表”存储历史状态,避免使用当前数据回溯历史。
- 一致性:离线训练特征与线上推理特征的计算逻辑必须完全一致。建议将特征计算逻辑封装为特征函数,离线和线上共用同一份代码。
- 时效性:离线特征虽然延迟较高,但必须满足模型训练和决策的时间要求。通常 T+1 特征在早上 8 点前必须就绪。
- 可扩展性:特征体系应支持快速新增特征,而不需要重构整个计算链路。建议采用“特征组”+“特征视图”的分层架构。
常见陷阱:很多团队在离线特征计算中使用“未来数据”——例如用用户 2025-01-10 的还款行为去预测 2025-01-05 的违约风险。这是典型的数据泄露(Data Leakage),会导致模型在线上效果远低于离线评估。务必在特征计算时严格按时间分区,禁止跨时间窗口使用未来信息。