2. 特征工程基础回顾

2.1 特征工程在 ML 中的位置

在机器学习全链路中,特征工程位于数据准备与模型训练之间,是决定模型效果上限的关键环节。业界有句共识:“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限”。

核心定位:特征工程是将原始数据转化为模型可理解、可学习的数值化表示的过程,直接影响模型的准确性、泛化能力和训练效率。

下图展示了特征工程在标准 ML 流水线中的位置:

ML 流水线:特征工程的核心位置 原始数据 日志/DB/流 数据清洗 去重/异常/填充 特征工程 ★ 本章核心 模型训练 XGB/LR/DL 模型评估 AUC/GAUC 特征存储 离线/实时 特征迭代反馈 特征工程决定模型上限 好的特征 → 简单模型也能出好效果
实践要点:特征工程不是一次性工作,而是伴随模型迭代持续优化的过程。离线特征与实时特征的回放对比,正是为了验证特征工程在不同时间窗口下的有效性。

2.2 特征分类体系

从不同维度对特征进行分类,有助于理解特征的生命周期和存储策略。以下是四种核心分类维度:

分类维度 类型 定义 典型示例
时间变化 静态特征 不随时间变化或变化极慢 用户性别、注册城市、物品类目
动态特征 随时间频繁变化 用户近7天点击率、实时库存
计算时效 离线特征 通过批处理计算,T+1 或小时级更新 用户历史30天消费总额
实时特征 通过流处理计算,秒级/毫秒级更新 用户当前会话点击序列
常见混淆:“静态”不等于“离线”,“动态”也不等于“实时”。静态特征可以存储在离线表中,也可以通过实时服务接口获取;动态特征既可以通过离线批处理计算(如天级统计),也可以通过实时流计算(如秒级滑动窗口)。

2.3 特征分类的交叉矩阵

将时间变化维度和计算时效维度交叉,可以得到更精细的特征分类矩阵:

特征分类交叉矩阵 离线计算 实时计算 静态 动态 离线静态特征 用户画像、物品属性 存储:Hive / HBase 实时静态特征 缓存中的配置、字典 存储:Redis / LocalCache 离线动态特征 历史统计、天级聚合 存储:Hive / ClickHouse 实时动态特征 滑动窗口、会话特征 存储:Flink / Redis 回放对比重点关注:离线动态特征 vs 实时动态特征 的时效性与一致性

2.4 特征存储介质概览

不同类别的特征需要匹配不同的存储介质,以平衡读写性能、存储成本和数据一致性。以下是主流存储介质的对比:

存储介质 适用特征类型 读写性能 存储成本 典型场景
Hive / HDFS 离线静态、离线动态 高延迟(分钟级) 低 全量特征计算、历史回溯
ClickHouse / Druid 离线动态 低延迟(秒级查询) 中 OLAP 分析、特征探查
Redis / Memcached 实时静态、实时动态 极低延迟(微秒级) 高(内存) 在线推理、特征服务
HBase / Cassandra 离线静态、实时动态 低延迟(毫秒级) 中 大规模 KV 特征存储
Flink 状态后端 实时动态 极低延迟(毫秒级) 中(RocksDB 可降) 滑动窗口、会话特征
选型原则:
  • 离线特征优先考虑列式存储(Parquet/ORC)以降低存储成本,支持批量导出。
  • 实时特征优先考虑内存 KV 存储(Redis)以保障毫秒级响应,但需注意内存容量和过期策略。
  • 回放对比场景需要同时保留离线快照和实时日志,通常采用 Hive + Kafka 双链路存储。

2.5 特征存储架构总览

以下架构图展示了离线特征与实时特征在存储层的关系:

离线与实时特征存储架构 原始数据源 数据分流 离线批处理 (Spark/Hive) 离线特征存储 Hive / ClickHouse 实时流处理 (Flink) 实时特征存储 Redis / Flink State 特征回放对比引擎 离线快照 vs 实时日志 一致性校验 / 时效性分析
架构要点:离线特征与实时特征在存储层是独立的,但通过回放对比引擎可以打通两者的数据鸿沟。回放对比的核心目标之一,就是验证实时特征是否能够复现离线特征的计算结果,以及两者之间的偏差是否在可接受范围内。