Что такое slowly changing dimensions (SCD) и как они влияют на ML-фичи?
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.
- Таблица
customer_dimхранит несколько версий одной сущностиcustomer_id. - У каждой версии есть интервал действия:
valid_fromиvalid_to. - Таблица
eventsсодержит время событияevent_time. - JOIN выбирает ту запись справочника, чей интервал покрывает момент события.
- В результате для ML-фич используется исторически корректное значение, а не текущее.
Если код не использовать, то пример можно разложить так: сначала фиксируется момент события, затем ищется состояние сущности на этот момент, и только после этого строится фича.
Ключевые моменты:
- SCD важны для временно корректного построения фич и предотвращения leakage.
- Для ML почти всегда нужно брать значение измерения “на момент события”, а не “на сейчас”.
- SCD Type 2 — наиболее полезен для ML, потому что сохраняет историю изменений.
- Неправильная работа со SCD ломает train/serving consistency и искажает качество модели.
- Для фичей важно явно определять временную привязку: event time, processing time или snapshot time.