M2-065M2: Classical Machine LearningFeature EngineeringMedium
Mastery:

Feature Engineering: 时间特征的工程要点有哪些?如何避免泄漏。

📐 Mathematical Definition
rolling mean: xˉt−1−w:t−1 (不含 t)\text{rolling mean}:\ \bar x_{t-1-w:t-1}\ (\text{不含}\ t)
⚡ Executive Summary
Core Concept: 滞后、滚动统计、周期性编码、时间差;必须保证只用过去信息(滚动窗口右对齐)。

📌 Key Takeaways

  • •
    sin/cos 编码周期避免边界跳变
  • •
    时间序列 CV 必须按时间切分

📐 Mathematical Derivations

四类时间特征:① <strong>时间戳分解</strong>——年/月/日/时/星期/是否节假日;注意星期与月份的<strong>周期性编码</strong>(用 sin(2πk/7)、cos(2πk/7) 而非 0–6 的整数,避免'周日与周一距离最大'的假象);② <strong>滞后特征(lag)</strong>——过去 k 期的值(y_{t−1}, y_{t−2}…),捕捉自相关;③ <strong>滚动统计</strong>——过去 w 期的均值/标准差/最大最小/趋势斜率,捕捉局部动态;④ <strong>时间差特征</strong>——距上次事件的时间、事件频率、累积计数。<strong>泄漏的防范</strong>:核心原则是<strong>在时刻 t 只能用 t 之前(不含 t)的信息</strong>。具体做法:滚动窗口用 <code>x[t-w:t]</code>(右开区间,不含 t)而非 <code>x[t-w+1:t+1]</code>(含 t,泄漏);预测目标若是由 t 时刻信息决定的(如 t 时刻的转化),则特征必须严格早于该时点。

🏭 Production Trade-offs

实践要点:① <strong>最常见的泄漏写法</strong>——<code>df.rolling(w).mean()</code> 后再 <code>shift(-1)</code> 或直接对齐到当前行;正确做法是 <code>df.shift(1).rolling(w).mean()</code>(先滞后再滚动)或明确用右开区间。② <strong>时间序列 CV</strong>——必须用<strong>前向链式 CV</strong>(训练集只含验证集之前的时间),随机 K 折会用到未来信息导致严重乐观偏差;同理,特征标准化/分箱等预处理也必须只在训练时段拟合。③ <strong>周期性编码的选择</strong>——sin/cos 编码保留周期循环性;对非周期的时间(如'距项目开始的天数')用原始数值即可。④ <strong>节假日与事件</strong>——节假日、促销日、系统变更等外生事件对时间序列影响巨大,应显式建模(二值标记或事件类别特征)。⑤ <strong>多序列与面板数据</strong>——若数据含多个实体(用户/商品),滚动特征需<strong>按实体分组</strong>计算(groupby 后再 rolling),且注意实体的生命周期(新实体无历史);这是实践中极易出错的点。
⚠️ Common Interview Pitfalls
  • ✕
    用含当前时刻的滚动窗口(数据泄漏)
  • ✕
    对时间序列用随机 K 折做交叉验证
🎯 Interviewer Follow-ups
  • ?
    为什么用 sin/cos 编码小时?
  • ?
    滚动窗口常见的泄漏写法是什么?
📚

Associated Knowledge Base Guides & Mindmaps

Explore the comprehensive technical article, exam cards, and global architecture tree.

← PreviousM2-064: Feature Engineering: 解释特征交互与多项式特征,什么时候需要。📋Back to BankNext →M2-066: Feature Engineering: 什么是特征哈希(hashing trick)?它的优缺点。