Sobes.tech
Back to questions
Middle — Senior
9

Что такое feature engineering для time series (lags, rolling stats, datetime features)?

Companies where asked
филиппинский банк Salmon

Answer from AI

sobes.tech AI

Что хотят услышать интервьюеры:

Feature engineering для временных рядов — это преобразование исходного ряда в набор признаков, которые помогают модели улавливать тренд, сезонность и локальную динамику. Обычно используют лаги, скользящие статистики и признаки из даты/времени. Важно уметь делать это без утечки будущей информации.

Определение:

Feature engineering для time series — это создание дополнительных признаков на основе временной структуры данных.
Для временных рядов часто строят:

  • Lags — значения ряда в прошлые моменты времени, например y(t-1), y(t-7).
  • Rolling stats — статистики по скользящему окну, например среднее, медиана, стандартное отклонение за последние 7 дней.
  • Datetime features — признаки из календаря: день недели, месяц, час, выходной, начало/конец месяца и т.д.

Цель таких признаков — дать модели контекст о прошлой динамике и календарных закономерностях, которые в исходном одном столбце обычно не видны.

Пример использования:

Допустим, нужно прогнозировать ежедневные продажи. Для каждого дня можно добавить продажи за вчера и неделю назад, средние продажи за последние 7 дней, а также день недели и месяц. Это помогает модели учитывать, что продажи в выходные и перед праздниками могут отличаться от будних дней.

import pandas as pd

df = pd.DataFrame({
    "date": pd.date_range("2024-01-01", periods=10, freq="D"),
    "sales": [10, 12, 11, 15, 14, 13, 18, 17, 16, 20]
})

df["lag_1"] = df["sales"].shift(1)
df["lag_7"] = df["sales"].shift(7)
df["roll_mean_3"] = df["sales"].shift(1).rolling(window=3).mean()
df["day_of_week"] = df["date"].dt.dayofweek
df["month"] = df["date"].dt.month

print(df)

Пояснение кода:

  • shift(1) создает лаг: значение предыдущего дня.
  • shift(7) берет значение неделю назад.
  • shift(1).rolling(window=3).mean() считает среднее по трем предыдущим значениям, не включая текущий день, чтобы не было утечки.
  • dt.dayofweek и dt.month извлекают календарные признаки из даты.
  • Такие признаки можно подать в регрессию, деревья решений, бустинг или другие модели для прогнозирования временного ряда.

Ключевые моменты:

  • Лаги дают модели доступ к прошлым значениям ряда и часто являются базовым сильным признаком.
  • Rolling features помогают сгладить шум и показать локальный уровень/волатильность.
  • Datetime features полезны для сезонности, календарных эффектов и циклов.
  • Важно избегать data leakage: все признаки должны строиться только по прошлым данным относительно точки прогноза.
  • Для временных рядов нельзя случайно перемешивать данные как в обычной ML-задаче; обычно нужен time-based split.