2. 特征工程基础回顾
2.1 特征工程在 ML 中的位置
在机器学习全链路中,特征工程位于数据准备与模型训练之间,是决定模型效果上限的关键环节。业界有句共识:“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限”。
核心定位:特征工程是将原始数据转化为模型可理解、可学习的数值化表示的过程,直接影响模型的准确性、泛化能力和训练效率。
下图展示了特征工程在标准 ML 流水线中的位置:
实践要点:特征工程不是一次性工作,而是伴随模型迭代持续优化的过程。离线特征与实时特征的回放对比,正是为了验证特征工程在不同时间窗口下的有效性。
2.2 特征分类体系
从不同维度对特征进行分类,有助于理解特征的生命周期和存储策略。以下是四种核心分类维度:
| 分类维度 | 类型 | 定义 | 典型示例 |
|---|---|---|---|
| 时间变化 | 静态特征 | 不随时间变化或变化极慢 | 用户性别、注册城市、物品类目 |
| 动态特征 | 随时间频繁变化 | 用户近7天点击率、实时库存 | |
| 计算时效 | 离线特征 | 通过批处理计算,T+1 或小时级更新 | 用户历史30天消费总额 |
| 实时特征 | 通过流处理计算,秒级/毫秒级更新 | 用户当前会话点击序列 |
常见混淆:“静态”不等于“离线”,“动态”也不等于“实时”。静态特征可以存储在离线表中,也可以通过实时服务接口获取;动态特征既可以通过离线批处理计算(如天级统计),也可以通过实时流计算(如秒级滑动窗口)。
2.3 特征分类的交叉矩阵
将时间变化维度和计算时效维度交叉,可以得到更精细的特征分类矩阵:
2.4 特征存储介质概览
不同类别的特征需要匹配不同的存储介质,以平衡读写性能、存储成本和数据一致性。以下是主流存储介质的对比:
| 存储介质 | 适用特征类型 | 读写性能 | 存储成本 | 典型场景 |
|---|---|---|---|---|
| Hive / HDFS | 离线静态、离线动态 | 高延迟(分钟级) | 低 | 全量特征计算、历史回溯 |
| ClickHouse / Druid | 离线动态 | 低延迟(秒级查询) | 中 | OLAP 分析、特征探查 |
| Redis / Memcached | 实时静态、实时动态 | 极低延迟(微秒级) | 高(内存) | 在线推理、特征服务 |
| HBase / Cassandra | 离线静态、实时动态 | 低延迟(毫秒级) | 中 | 大规模 KV 特征存储 |
| Flink 状态后端 | 实时动态 | 极低延迟(毫秒级) | 中(RocksDB 可降) | 滑动窗口、会话特征 |
选型原则:
- 离线特征优先考虑列式存储(Parquet/ORC)以降低存储成本,支持批量导出。
- 实时特征优先考虑内存 KV 存储(Redis)以保障毫秒级响应,但需注意内存容量和过期策略。
- 回放对比场景需要同时保留离线快照和实时日志,通常采用 Hive + Kafka 双链路存储。
2.5 特征存储架构总览
以下架构图展示了离线特征与实时特征在存储层的关系:
架构要点:离线特征与实时特征在存储层是独立的,但通过回放对比引擎可以打通两者的数据鸿沟。回放对比的核心目标之一,就是验证实时特征是否能够复现离线特征的计算结果,以及两者之间的偏差是否在可接受范围内。