Feature store и train/serve skew (B4)
Фаза 8 улучшала модель. Здесь — вопрос, от которого зависит, доедет ли улучшение до пользователя: откуда ранкер берёт фичи и те ли это фичи, на которых он учился. Утечка через время, протухание, расхождение обучения и сервинга — измерено на том же логе и том же протоколе, что D2b.
⚠ Секции 2–4 — реальный замер на Brightkite (готовый офлайн-артефакт, VPS видит только JSON). Секции 1 и 5 — живая синтетическая механика: джойн по времени и симулятор расхождения, считаются на лету, без весов и без сырых данных.
загрузка артефакта feature store…
Теория простым языком
Feature store — единственный модуль учебника, где инфраструктура важнее модели. Причина простая: почти все истории «офлайн было +5%, онлайн ноль» заканчиваются не в алгоритме, а в том, что фича на обучении и фича на сервинге — разные величины с одним именем.
▸Зачем отдельный сервис фичей, если есть SQL и таблица
Четыре обязанности feature store
1. Point-in-time correctness. К каждому событию присоединяется значение фичи, известное на момент события, а не последнее известное. Это as-of join, и это не оптимизация — это определение корректности обучающей выборки.
2. Train/serve consistency. Одно определение фичи, исполняемое обоими путями. Если офлайн считает pandas, а онлайн — руками написанный Java-код, расхождение вопрос времени, а не вероятности.
3. Freshness и SLA. У каждой фичи есть горизонт устаревания: у «визитов за полгода» он дни, у «товаров в корзине» — секунды. SLA задаётся замером деградации, а не вкусом.
4. Backfill и версионирование. Новая фича должна быть пересчитана вглубь истории по тем же правилам, иначе обучение увидит её только на свежем куске данных. Определение меняется — версия меняется: старая модель продолжает получать старую версию.
Как это связано с остальным учебником
Утечку через время мы уже ловили дважды: в валидации (random split против temporal) и в D2b (метаданные мест выводятся только из train). Разница в уровне: там протокол оценки, здесь — хранилище фичей, из-за чего одна и та же ошибка попадает сразу во все модели компании. Мониторинг расхождения фичей — прямое продолжение дашборда B7, а вывод «офлайн-дельта не заменяет онлайн-замер» — это Фаза 14. Это ступень 2 из 3 к полному capstone: дальше B6 re-rank constraints, потом сборка.
⚠️ Что может пойти не так
- Джойнить фичи к меткам по ключу без условия на время — самая дорогая строчка SQL в индустрии: метрика вырастет, прод не заметит улучшения.
- Считать «фича квазистатична, можно агрегировать по всему логу» — координата места и его типичный час выглядят статичными, но в наших замерах они тоже часть утечки.
- Проверять утечку только метрикой: подозрительно высокое качество — сигнал, но слабый. Дешевле контракт на фичу и range-check (у нас 85.9% дырявых строк recency вышли за собственный диапазон).
- Считать train/serve skew поймавшимся, если офлайн-метрика не просела: монотонные искажения её почти не двигают, а выдачу переписывают на десятки процентов.
- Заполнять пропуск нулём «по умолчанию»: ноль — это значение, и модель прочитает его как утверждение о мире, а не как «неизвестно». Дефолт — часть контракта фичи, а не деталь реализации.
- Строить стриминг фичей до того, как измерена кривая freshness: у наших фич неделя простоя стоит полпроцента recall — стриминг здесь купил бы копейки за большие деньги.
- Добавлять фичу без backfill: модель увидит её только на последнем куске истории и научится тому, что это «признак недавних событий».
🧠 Проверь себя: Ранкер выкатили, офлайн-метрики стабильны, жалоб нет. Через неделю выясняется, что онлайн-конверсия просела. Логи показывают: сервис персональных фичей отдаёт по таймауту 12% запросов, в этих случаях фичи заполняются нулями. Что здесь главная системная проблема?
Где это в дорожной карте
B4 — Feature Store & Training-Serving Skew, ступень 2 из 3 на пути к полному capstone (Фаза 8 → B4 → B6 → сборка). Измеренная часть — на реальном Brightkite по протоколу D2b; механика джойна и симулятор скью — синтетические и живые. Главный урок модуля: модель бывает хороша офлайн и плоха онлайн из-за фичей, а не из-за алгоритма.