4. 特征数据采集与预处理:实时数据源、特征值清洗与时间窗口划分
实时风控特征 PSI 监控的基石在于高质量、低延迟的数据接入与预处理。本章聚焦于从实时数据源(Kafka/Flume)采集原始事件流,经过特征值清洗(空值、异常值处理),再通过时间窗口划分(滑动窗口/固定窗口)生成可供 PSI 计算的特征分布快照。整个过程必须保证数据完整性、时效性与一致性,否则后续 PSI 监控将失去意义。
4.1 实时数据源接入:Kafka 与 Flume
实时特征数据通常来源于业务日志、埋点事件或模型打分结果。Kafka 和 Flume 是两种主流的实时数据采集与传输组件,它们在风控场景中的角色与选型对比如下:
| 对比维度 | Kafka | Flume |
|---|---|---|
| 核心定位 | 分布式消息队列,高吞吐、持久化、多消费者 | 日志采集与聚合,端到端流式传输 |
| 数据可靠性 | 副本机制 + ACK 确认,至少一次/精确一次语义 | 基于 Channel 的事务,支持 File Channel 持久化 |
| 适用场景 | 高并发特征流、多下游消费(PSI 计算 + 模型推理 + 离线回放) | 日志文件采集、简单 ETL 后直接入 HDFS/Kafka |
| 风控优势 | 天然支持回溯消费,便于 PSI 历史分布重算 | 轻量级部署,适合边缘节点日志汇聚 |
| 典型拓扑 | Producer → Kafka Cluster → Consumer(Flink/Spark Streaming) | Source → Channel → Sink(Kafka Sink / HDFS Sink) |
选型建议: 在实时风控 PSI 监控体系中,推荐以 Kafka 作为核心数据总线。Flume 可作为日志采集的前置代理,将数据汇聚到 Kafka,再由流计算引擎统一消费。这种分层架构既能利用 Flume 的采集灵活性,又能享受 Kafka 的高吞吐与多订阅能力。
4.2 特征值清洗:空值与异常值处理
原始特征流中常包含空值、异常跳变或格式错误的数据。若不进行清洗,PSI 计算会引入噪声,导致分布偏移误报或漏报。清洗策略需区分特征类型:
- 数值型特征: 空值填充(均值/中位数/前值填充)、异常值截断(3σ 或 IQR 规则)、格式校验(非数字字符剔除)。
- 类别型特征: 空值映射为“未知”类别、非法枚举值归并为“其他”、大小写统一与前后空格去除。
- 时间戳特征: 空值丢弃或使用事件到达时间替代、异常时间戳(未来时间/1970 年)标记为无效。
清洗避坑: 空值填充策略必须与 PSI 分箱逻辑对齐。例如,若 PSI 分箱将空值单独作为一个分箱,则填充值不应破坏该分箱的独立性;若分箱前已填充,则需确保填充值落在合理分箱内,避免人为引入分布偏移。
以下是一个典型的特征清洗伪代码示例(Flink SQL 风格):
-- 数值型特征清洗:空值填充均值,异常值截断
SELECT
user_id,
COALESCE(amount, avg_amount) AS amount_clean,
CASE
WHEN score < 0 OR score > 1000 THEN 500
ELSE score
END AS score_clean,
-- 类别型特征:空值映射为 'unknown'
COALESCE(city, 'unknown') AS city_clean
FROM
raw_feature_stream,
(SELECT AVG(amount) AS avg_amount FROM raw_feature_stream) AS global_stats
WHERE
-- 过滤时间戳异常事件
event_time BETWEEN '2024-01-01' AND '2026-12-31';
4.3 时间窗口划分:滑动窗口与固定窗口
PSI 监控需要对比“当前窗口”与“基准窗口”的特征分布。窗口划分方式直接影响分布计算的粒度与延迟。两种主流窗口模式对比如下:
| 窗口类型 | 定义 | PSI 监控适用场景 | 优缺点 |
|---|---|---|---|
| 固定窗口(Tumbling Window) | 时间对齐、不重叠的连续窗口,如每 1 小时一个窗口 | 小时级/天级 PSI 报表,监管合规要求固定周期对比 | 实现简单,分布稳定;但无法捕捉窗口边界附近的突变 |
| 滑动窗口(Sliding Window) | 固定长度、固定滑动步长的重叠窗口,如窗口长度 1 小时,滑动步长 5 分钟 | 实时告警,需要快速感知分布漂移 | 灵敏度高,延迟低;但计算开销大,窗口重叠导致数据重复统计 |
实践建议: 实时 PSI 告警通常采用滑动窗口(窗口长度 30 分钟,滑动步长 1 分钟),以秒级粒度感知分布变化;离线 PSI 报表则使用固定窗口(按自然小时/天对齐),便于与业务 KPI 联动分析。两种窗口可并存于同一系统,分别服务于不同监控目标。
4.4 滑动窗口与固定窗口的工程实现对比
在 Flink / Spark Streaming 中,两种窗口的实现方式与状态管理差异显著。以下表格总结了关键参数与注意事项:
| 参数维度 | 固定窗口 | 滑动窗口 |
|---|---|---|
| 窗口长度 | 固定值,如 1h | 固定值,如 30min |
| 滑动步长 | 等于窗口长度(无重叠) | 小于窗口长度,如 1min |
| 窗口数量 | 随时间线性增长 | 窗口长度 / 滑动步长(固定并发数) |
| 状态大小 | 每个窗口独立状态,可及时清理 | 需同时维护多个重叠窗口状态,内存开销大 |
| 延迟敏感度 | 窗口结束时才输出,延迟 = 窗口长度 | 每个滑动步长输出一次,延迟 ≈ 滑动步长 |
| PSI 计算频率 | 每窗口一次 | 每滑动步长一次 |
| 适用告警级别 | P2/P3 级别(小时级) | P0/P1 级别(分钟级) |
工程优化: 滑动窗口场景下,可对特征分布快照进行增量更新,避免每次滑动都全量重算直方图。例如,维护一个长度为 N 的环形缓冲区,新事件加入时更新对应分箱计数,过期事件移出时递减计数,从而将 PSI 计算复杂度从 O(窗口内事件数) 降低到 O(分箱数)。
4.5 数据预处理链路完整性校验
在将清洗后的特征数据送入窗口计算前,必须进行链路完整性校验,避免因数据丢失或延迟导致 PSI 计算偏差。建议在采集、清洗、窗口三个环节分别埋点监控:
- 数据源侧: 监控 Kafka 各分区 Lag 值,确保消费速率 ≥ 生产速率。
- 清洗侧: 统计空值率、异常值占比、丢弃事件数,设置阈值告警(如空值率突增 5%)。
- 窗口侧: 监控每个窗口的事件总数,与历史同期对比,若事件量骤降超过 20% 则触发数据延迟告警。
最佳实践: 在 Flink 作业中,使用
Side Output 将清洗丢弃的事件单独输出到死信队列(Dead Letter Queue),便于事后回溯分析清洗策略是否过严或过松。同时,为每个窗口生成元数据标签(窗口起始时间、事件数、分箱版本号),随特征分布快照一同传递给 PSI 计算模块,确保可追溯性。