4. 特征数据采集与预处理:实时数据源、特征值清洗与时间窗口划分

实时风控特征 PSI 监控的基石在于高质量、低延迟的数据接入与预处理。本章聚焦于从实时数据源(Kafka/Flume)采集原始事件流,经过特征值清洗(空值、异常值处理),再通过时间窗口划分(滑动窗口/固定窗口)生成可供 PSI 计算的特征分布快照。整个过程必须保证数据完整性、时效性与一致性,否则后续 PSI 监控将失去意义。

4.1 实时数据源接入:Kafka 与 Flume

实时特征数据通常来源于业务日志、埋点事件或模型打分结果。Kafka 和 Flume 是两种主流的实时数据采集与传输组件,它们在风控场景中的角色与选型对比如下:

对比维度KafkaFlume
核心定位分布式消息队列,高吞吐、持久化、多消费者日志采集与聚合,端到端流式传输
数据可靠性副本机制 + 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 联动分析。两种窗口可并存于同一系统,分别服务于不同监控目标。
实时风控特征 PSI 数据采集与预处理流程 实时风控特征 PSI 数据采集与预处理流程 实时数据源 Kafka / Flume 特征值清洗 空值 / 异常值处理 时间窗口划分 滑动 / 固定窗口 特征分布快照 当前窗口 / 基准窗口 PSI 计算与告警 分布偏移判定 说明: 清洗与窗口划分是 PSI 监控的前置必要条件。

4.4 滑动窗口与固定窗口的工程实现对比

在 Flink / Spark Streaming 中,两种窗口的实现方式与状态管理差异显著。以下表格总结了关键参数与注意事项:

参数维度固定窗口滑动窗口
窗口长度固定值,如 1h固定值,如 30min
滑动步长等于窗口长度(无重叠)小于窗口长度,如 1min
窗口数量随时间线性增长窗口长度 / 滑动步长(固定并发数)
状态大小每个窗口独立状态,可及时清理需同时维护多个重叠窗口状态,内存开销大
延迟敏感度窗口结束时才输出,延迟 = 窗口长度每个滑动步长输出一次,延迟 ≈ 滑动步长
PSI 计算频率每窗口一次每滑动步长一次
适用告警级别P2/P3 级别(小时级)P0/P1 级别(分钟级)
工程优化: 滑动窗口场景下,可对特征分布快照进行增量更新,避免每次滑动都全量重算直方图。例如,维护一个长度为 N 的环形缓冲区,新事件加入时更新对应分箱计数,过期事件移出时递减计数,从而将 PSI 计算复杂度从 O(窗口内事件数) 降低到 O(分箱数)。
滑动窗口与固定窗口对比示意 滑动窗口 vs 固定窗口对比示意 固定窗口(Tumbling Window) 窗口 1 (0-1h) 窗口 2 (1-2h) 窗口 3 (2-3h) 无重叠,每个事件只属于一个窗口 滑动窗口(Sliding Window) 窗口 A (0-30min) 窗口 B (5-35min) 窗口 C (10-40min) 窗口长度 30min,滑动步长 5min,事件可同时属于多个窗口 关键差异: • 固定窗口:输出频率低,状态易管理 • 滑动窗口:输出频率高,实时性强 • 滑动窗口内存开销约为固定窗口的 N 倍 (N = 窗口长度 / 滑动步长)

4.5 数据预处理链路完整性校验

在将清洗后的特征数据送入窗口计算前,必须进行链路完整性校验,避免因数据丢失或延迟导致 PSI 计算偏差。建议在采集、清洗、窗口三个环节分别埋点监控:

  • 数据源侧: 监控 Kafka 各分区 Lag 值,确保消费速率 ≥ 生产速率。
  • 清洗侧: 统计空值率、异常值占比、丢弃事件数,设置阈值告警(如空值率突增 5%)。
  • 窗口侧: 监控每个窗口的事件总数,与历史同期对比,若事件量骤降超过 20% 则触发数据延迟告警。
最佳实践: 在 Flink 作业中,使用 Side Output 将清洗丢弃的事件单独输出到死信队列(Dead Letter Queue),便于事后回溯分析清洗策略是否过严或过松。同时,为每个窗口生成元数据标签(窗口起始时间、事件数、分箱版本号),随特征分布快照一同传递给 PSI 计算模块,确保可追溯性。