滑动窗口特征怎么设计?
简化版
滚动窗口特征按实体在预测时点之前聚合固定区间,如过去 7 天次数、均值和趋势。实现必须明确事件时间、窗口闭开边界、迟到数据、最少样本和增量状态,否则极易时间泄漏或线上线下不一致。
详细版
-
窗口通常定义为
[t-W,t),排除当前与未来事件。 -
按实体排序后 shift 再 rolling 可避免把当前标签行纳入。
-
多个窗口可表达短中长期,但会增加相关性。
-
迟到事件需要 watermark 与更正策略。
-
均值类特征应同时输出 count,表示可信度。
完整版教学
一、窗口是以预测时点截断的历史查询
滚动统计把可变长度历史压成固定维度。
关键不是 rolling API,而是每个样本都有自己的 cutoff。
批量离线若先按整天聚合再 join,可能把当天预测之后事件混入;粒度与可用时间必须匹配。
二、底层机制与公式
feature(e,t,W)=aggregate{x_i | entity_i=e and t-W<=time_i<t}
rate=count/sum_exposure
三、带数字的推演
用户在 10:00 预测,7 日内有 8:00、9:30、10:00 三次事件。
按 [t-7d,t) 只能计前两次,count=2;把右端闭合会泄漏 10:00 同时事件。
四、方案对比
| 方案/对象 | 核心特点 | 代价或边界 |
|---|---|---|
| 固定窗口 | 语义直观 | 边界突变 |
| 指数衰减 | 平滑强调近期 | 参数解释稍难 |
| 累计历史 | 状态简单 | 旧行为权重过大 |
五、执行流程
按 entity/event_time 排序 -> 定义 cutoff -> 过滤窗口 -> 聚合并输出 count
-> 离线 point-in-time 回填 -> 在线增量状态 -> 边界样本对账
六、边界条件与工程代价
新实体没有历史时,0 次与数据缺失含义不同;需输出冷启动标记并定义默认统计。
在线状态过期、乱序和重复事件会改变聚合,必须用事件 ID 去重并设计 watermark/补偿。
记忆钩子:滚动特征的四个词是“实体、截止、窗口、聚合”。
七、常见误区与追问
-
误区:先 rolling 再 shift 与先 shift 再 rolling 总相同。 当前行是否进入窗口会不同。
-
追问:为何用左闭右开? 避免把预测时点事件同时当原因和待预测结果。
-
误区:7 天窗口就是最近 7 个自然日。 168 小时与自然日口径不同。
-
追问:迟到事件怎么办? 用 watermark、回补和版本化明确是否修正。
-
追问:为何同时输出 count? 同一均值由 1 条或 100 条计算,可信度不同。
八、加强记忆
滚动特征的四个词是“实体、截止、窗口、聚合”。
先画 [t-W,t),再讨论排序、迟到与在线状态,时间泄漏就容易发现。