Sobes.tech
Back to questions
Middle — Senior
10

Что такое slowly changing dimensions (SCD) и как они влияют на ML-фичи?

Companies where asked
VK CloudVK Cloud

Answer from AI

sobes.tech AI

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

SCD — это атрибуты справочника или сущности, которые меняются медленно и со временем. В ML важно понимать, брать ли актуальное значение на момент расчёта фичи или историческое значение на момент события. Ошибка в этом месте часто приводит к leakage и некорректной валидации.

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

Slowly Changing Dimensions — это измерения, значения которых изменяются не каждый день, но важно хранить их историю. В классическом DWH/SCD обычно решают, как вести версии атрибутов: перезаписывать текущее значение, хранить историю или добавлять записи с датами действия.

Для ML-фич это критично, потому что одна и та же сущность может иметь разные значения признака в разные моменты времени. Если фича строится “как есть сейчас” для старого события, получается использование будущей информации.

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

Например, у клиента есть фича segment или risk_level. Сегодня клиент в сегменте premium, а полгода назад был standard.
Если модель обучается на событиях за прошлый год, то для каждого события нужно брать значение сегмента, которое было актуально на ту дату, а не текущее.

-- Пример SCD Type 2: хранение истории по датам
SELECT
    e.event_id,
    e.event_time,
    d.segment
FROM events e
JOIN customer_dim d
  ON e.customer_id = d.customer_id
 AND e.event_time >= d.valid_from
 AND e.event_time <  d.valid_to;

В таком запросе для каждого события подтягивается именно та версия измерения, которая действовала в момент события.

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

Код показывает типичный способ работы со SCD Type 2.

  1. Таблица customer_dim хранит несколько версий одной сущности customer_id.
  2. У каждой версии есть интервал действия: valid_from и valid_to.
  3. Таблица events содержит время события event_time.
  4. JOIN выбирает ту запись справочника, чей интервал покрывает момент события.
  5. В результате для ML-фич используется исторически корректное значение, а не текущее.

Если код не использовать, то пример можно разложить так: сначала фиксируется момент события, затем ищется состояние сущности на этот момент, и только после этого строится фича.

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

  • SCD важны для временно корректного построения фич и предотвращения leakage.
  • Для ML почти всегда нужно брать значение измерения “на момент события”, а не “на сейчас”.
  • SCD Type 2 — наиболее полезен для ML, потому что сохраняет историю изменений.
  • Неправильная работа со SCD ломает train/serving consistency и искажает качество модели.
  • Для фичей важно явно определять временную привязку: event time, processing time или snapshot time.