特征流水线如何保证可复现?
简化版
可复现特征流水线要固定原始数据快照、代码与配置版本、依赖、随机种子、特征 schema 和中间产物血缘,使同一 entity、event time、版本能重算出同一值。仅保存模型文件不够。
详细版
-
每个特征记录定义、类型、窗口、数据源和 owner。
-
数据快照或不可变分区决定历史输入。
-
转换器参数必须随模型一起版本化。
-
随机采样、并行归约和浮点环境影响位级结果。
-
离线回填与在线计算需要可对账的样本键。
完整版教学
一、特征值是数据与代码在时间上的函数
同名特征会随 SQL、源表或窗口口径变化。
没有版本与血缘,旧模型重训得到的其实是新特征,无法判断差异来自数据还是算法。
可复现目标可分统计等价与位级一致;分布式浮点累加顺序不同可能产生微小差异,应按风险定义容差。
二、底层机制与公式
feature_value = F(entity_id,event_time,data_snapshot,code_version,config)
artifact_id=hash(all dependencies)
三、带数字的推演
用户 42 在 2026-01-10 12:00 的 7 日消费额,应由截止该时点的数据快照和 feature_v3 重算。
若 SQL 从自然日改成 168 小时却仍叫同名,回溯无法复现。
四、方案对比
| 方案/对象 | 核心特点 | 代价或边界 |
|---|---|---|
| 只存最终特征表 | 读取快 | 血缘缺失 |
| 快照+版本代码 | 可重算审计 | 存储与治理成本 |
| 容器/锁文件 | 固定运行环境 | 仍需固定数据输入 |
五、执行流程
注册定义/schema -> 固定源分区 -> 执行并记录 run manifest
-> 校验统计与样本 hash -> 发布版本 -> 训练记录 feature version -> 可回放
六、边界条件与工程代价
上游表回写历史分区会破坏快照语义,应采用不可变版本、time travel 或记录输入文件清单与校验和。
隐式默认时区、夏令时和窗口边界是常见不可复现源,时间字段必须统一时区与闭开区间。
记忆钩子:复现特征要回答五个问题:哪批数据、哪版代码、什么配置、何时计算、输出校验是什么。
七、常见误区与追问
-
误区:设置随机种子就可完全复现。 数据、代码、依赖和硬件算法也要固定。
-
追问:run manifest 应含什么? 输入快照、代码提交、配置、依赖和输出校验。
-
误区:同名特征代表同一语义。 定义变化必须升版本。
-
追问:为何保存 schema? 类型/单位变化会静默改变计算和模型输入。
-
追问:怎样做样本对账? 按 entity+event time 在不同环境重算并比较容差。
八、加强记忆
复现特征要回答五个问题:哪批数据、哪版代码、什么配置、何时计算、输出校验是什么。
名字相同不等于语义相同。