构建特征流水线 是做什么的?
使用时机
- 从仓库/流数据中为机器学习模型工程化特征。
- 防止标签泄露和训练/推理偏差。
- 搭建特征存储、在线推理或历史回填。
- 除非为机器学习特征提供输入,否则不要用于通用建模/聚合(请使用 dbt/Spark 技能)。
工作流程
- [ ] 为每个特征定义实体键和事件时间戳
- [ ] 使用时间点正确连接(以标签时间为准)构建训练集
- [ ] 为离线(训练)和在线(推理)**共享一个定义**
- [ ] 为在线特征设置新鲜度/物化策略
- [ ] 幂等地回填历史特征以用于训练
- 时间点正确性。 以每个标签的时间戳为准连接特征——只使用预测时间之前已知的数据。这可以防止标签泄露,这是最具破坏性的特征错误。
- 离线/在线一致性。 以相同方式计算训练(离线、批处理)和推理(在线、低延迟)的特征。逻辑分歧会导致训练/推理偏差以及无提示的生产性能下降。
- 新鲜度。 在线特征必须按照模型可接受的数据陈旧容忍度进行调度物化。
- 幂等回填。 重新计算历史特征必须是可重复的(参见
designing-backfills-and-replays)。
模式
时间点(as-of)连接——选在每条标签事件之前最新的特征值:
SELECT l.entity_id, l.label_ts, f.value AS feature
FROM labels l
LEFT JOIN features f
ON f.entity_id = l.entity_id
AND f.event_ts <= l.label_ts -- 仅使用过去的数据;无泄露
QUALIFY ROW_NUMBER() OVER (
PARTITION BY l.entity_id, l.label_ts ORDER BY f.event_ts DESC) = 1;
单一定义,双路路径——将特征定义一次(例如 Feast FeatureView);将其物化到离线存储用于训练,物化到在线存储用于推理,这样两者使用相同的逻辑。
新鲜度 + 物化——调度在线物化;像监控任何数据集 SLA 一样监控特征新鲜度(implementing-pipeline-observability)。
常见陷阱
- 标签泄露——连接标签时间之后计算的特征会虚增离线指标并在生产中崩溃;始终使用 as-of 连接。
- 训练/推理偏差——离线实现和在线实现分开会导致漂移;共享一个定义。
- 过时的在线特征——模型基于旧值进行推理;设置并监控新鲜度。
- 不可重现的回填——训练历史不一致;确保特征重新计算是幂等的。
- 缺少实体/时间戳键——特征无法跨时间正确连接;两者都需要。
- 未版本化的特征——无提示地重新定义会破坏模型可比性;对特征定义进行版本控制。