Feature-rich ranking: лестница классов моделей (Фаза 8)
D2b сознательно остановился на логистической регрессии. Здесь — следующий вопрос production-ранжирования: сколько платит смена класса модели на тех же фичах? И отдельно — сколько платит другой апгрейд над той же базой сигналов: явные попарные взаимодействия, где класс модели не меняется. Всё остальное зафиксировано, ничего не выбрано по финальной метрике, а выводы проверены разрезом revisit/novel и парным интервалом для разности.
⚠ Все ранкеры лестницы обучаются и оцениваются офлайн на реальном логе Brightkite (~2.02M событий); страница показывает готовый маленький артефакт. Бустинг (sklearn HistGB) на сервер не едет — как и весь Brightkite-трек, VPS видит только JSON.
загрузка артефакта лестницы ранкеров…
Теория простым языком
Ранжирование в проде — это почти всегда табличная задача: десятки-сотни фичей про пару (юзер, айтем) и вопрос «какой класс модели выжмет из них больше». Этот модуль отвечает на него так, как положено в инженерии: раскладывает апгрейд на два независимых эксперимента, фиксирует всё остальное — и меряет, включая срез, на котором агрегат врёт, и парный интервал, без которого дельта не имеет смысла.
▸Зачем менять класс модели, если фичи те же
Две оси апгрейда, которые нельзя складывать в одну лестницу
Над одной и той же базой сигналов здесь стоят два разных эксперимента, и это главная дисциплинарная мысль модуля.
1. Смена класса модели: логрег на 8 исходных фичах → GBDT на тех же 8 фичах. Признаки идентичны, меняется только способ их использовать — дельту можно приписать классу.
2. Смена представления признаков: логрег на 8 фичах → логрег на 8 + 28 попарных произведениях. Класс модели не меняется; это попытка купить нелинейность, оставаясь линейным. Приписывать эту дельту «смене класса модели» — ошибка, которая стояла на этой странице до первого раунда ревью.
У второй оси есть собственная ловушка, которую мы померили: широкая модель при том же learning rate сходится медленнее, поэтому «добавили взаимодействия» и «дали оптимизатору больше итераций» очень легко перепутать. В таблице чувствительности выше видно, что число попаданий на новых местах гуляет от одного правила останова к другому сильнее, чем весь заявленный прирост — значит, эффект взаимодействий на этих данных не установлен, и так и надо говорить. Вывод не «interaction features бесполезны», а «ручной перебор пар требует отбора, регуляризации и проверки по срезам — ровно той работы, которую хочется отдать модели».
Лестница классов моделей для табличного ранжирования
1. Линейная модель — baseline с дешёвой интерпретацией: стандартизованный коэффициент ≈ условный эффект (с оговорками из D2b). Потолок: аддитивность.
2. GBDT (у нас sklearn HistGradientBoosting; в индустрии XGBoost/LightGBM/CatBoost) — рабочая лошадка табличного ранжирования/CTR и очень сильный baseline: находит взаимодействия и нелинейности сам, устойчив к масштабам фичей, быстро обучается. Важно: наш HistGB используется как pointwise-скорер — это не LambdaMART и не listwise ранкер, ranking-objective сюда не зашит. И это бустинг «из коробки»: подбора гиперпараметров у нас не было вообще, так что таблица говорит «GBDT с дефолтами против логрега», а не «лучший достижимый GBDT».
3. Нейро-ранкеры (Wide&Deep, DeepFM, DCN-v2) — когда фичей тысячи, много категориальных с огромной кардинальностью (id-эмбеддинги), нужен multi-task и данных очень много; в больших рекомендательных системах они давно в проде. На маленьких табличках чаще проигрывают бустингу — «нейросеть ≠ лучше» (урок NeuMF) действует и здесь.
Как это связано с остальным учебником
Это Фаза 8 — первая ступень полного capstone: класс ранкера обновлён, фичи и протокол — те же, что в D2b и воронке E3. Следующие ступени: B4 feature store (фичи становятся главным активом — им нужна инфраструктура: point-in-time корректность, train/serve consistency; утечку такого рода мы уже ловили в D2b) и B6 re-rank constraints (квоты, eligibility, разнообразие поверх ранкера). Потом — сборка полного capstone.
⚠️ Что может пойти не так
- Судить апгрейд модели по агрегированной метрике — она складывает выигрыш на одном срезе с проигрышем на другом и показывает их сумму; сравнение классов моделей без срезов почти бессмысленно.
- Приписывать смене класса модели дельту ступени, где класс не менялся: добавление попарных произведений — это другой эксперимент, про представление признаков.
- Сравнивать модели по двум отдельным доверительным интервалам вместо интервала для их разности — при общей eval-когорте нужен парный bootstrap по пользователям.
- Подбирать число итераций (или любой другой гиперпараметр) по финальной метрике — это выбор модели по тесту; у широкой логрегрессии именно так и получался «прирост», который не пережил объявленного правила останова.
- Читать permutation importance как вклад в Recall@10 — она посчитана на pair-level objective, на не отложенной выборке, и коррелированные фичи вдобавок делят важность произвольно (recency/seen/personal_freq здесь сильно связаны).
- Путать «новое для пользователя» с «новым в каталоге»: наш novel-срез — про таргет вне истории юзера; холодный АЙТЕМ (без взаимодействий вообще) — это B5, другая задача.
- Забывать, что у срезов разные потолки ретривала: на новых местах до ранкера доезжает меньше половины таргетов, и сравнивать его результат надо с этим потолком, а не с единицей.
- Ждать от смены класса модели прорыва сквозь потолок retrieval — он не пробивается ранкером в принципе; хочешь выше — чини кандидатов (E3).
- Тащить нейро-ранкер на маленькую табличку, потому что «в статьях DeepFM» — сначала бустинг-baseline; нейро платит при тысячах фичей и id-эмбеддингах.
- Забыть про стоимость: GBDT дороже логрега в обучении и тюнинге, а офлайн-прирост в доли процента может не окупить сложность — решает продукт, не лидерборд.
🧠 Проверь себя: Бустинг дал доли процента к агрегированному Recall@10 против логрега. Менеджер спрашивает: «стоит ли катить?» Какой ответ правильный?
Где это в дорожной карте
Фаза 8 — Feature-rich ranking, ступень 1 из 3 на пути к полному capstone (дальше B4 feature store → B6 re-rank constraints → сборка). Теоретическая лестница фазы — LambdaMART и нейро-ранкеры — намечена выше; практическая ценность здесь — дисциплина сравнения: разделить оси апгрейда, выписать контракт моделей, ничего не выбирать по тесту, мерить по срезам и парным интервалом, учесть стоимость.
Что дальше
Опирается на этот модуль — здесь он нужен как предпосылка
До финальной сборки не хватает ещё 7 модулей по этому пути.
Порядок здесь — рекомендация из карты курса, ничего не блокируется. Отметка «прочитано» хранится только в этом браузере.
Источники
- Practical Lessons from Predicting Clicks on Ads at FacebookX. He et al. · 2014 · статьясвязка деревьев и линейной модели, свежесть признаков и её цена
- DeepFM: A Factorization-Machine Based Neural Network for CTR PredictionH. Guo et al. · 2017 · статьявзаимодействия признаков без ручного конструирования
- Wide & Deep Learning for Recommender SystemsH.-T. Cheng et al. · 2016 · статьячто именно даёт добавление признаков поверх ID-модели