← к модулям

Feature-rich ranking: лестница классов моделей (Фаза 8)

D2b сознательно остановился на логистической регрессии. Здесь — следующий вопрос production-ранжирования: сколько платит смена класса модели на тех же фичах? Лестница логрег → +взаимодействия → градиентный бустинг, всё остальное зафиксировано — и честный разрез revisit/novel, без которого сравнение врёт.

⚠ Все три ранкера обучаются и оцениваются офлайн на реальном логе Brightkite (~2.02M событий); страница показывает готовый маленький артефакт. Бустинг (sklearn HistGB) на сервер не едет — как и весь Brightkite-трек, VPS видит только JSON.

загрузка артефакта лестницы ранкеров…

Теория простым языком

Ранжирование в проде — это почти всегда табличная задача: десятки-сотни фичей про пару (юзер, айтем) и вопрос «какой класс модели выжмет из них больше». Этот модуль отвечает на него так, как положено в инженерии: фиксируем всё, кроме класса модели, и меряем — включая срез, на котором агрегат врёт.

Зачем менять класс модели, если фичи те же
БылоD2b: логистическая регрессия на 8 фичах — сознательно простейший ранкер, весь интеллект в фичах (D2b).
ПроблемаЛинейная модель складывает вклады фичей независимо: «geo важно, ТОЛЬКО ЕСЛИ истории нет», «pop полезен, ТОЛЬКО ЕСЛИ transition молчит» — такие условные правила ей недоступны, сколько фичей ни подавай.
ИдеяДеревья решений строят такие правила по построению (split по одной фиче внутри ветки другой), а градиентный бустинг складывает сотни слабых деревьев в сильный ранкер. Взаимодействия находятся сами — не надо перечислять пары руками.
Стало лучшеНа тех же фичах агрегат почти не двигается (revisit-мираж съедает), а на местах, НОВЫХ ДЛЯ ПОЛЬЗОВАТЕЛЯ, бустинг даёт 16 попаданий из 110 против 4 у логрега — вчетверо, с непересекающимися bootstrap-интервалами, и обходит лучший однофичевый baseline (co-visitation, 0.109). Нелинейность платит там, где нет персональной истории.
Осталось слабымМодель перестала быть само-объяснимой (коэффициентов нет — важности только через permutation/SHAP); обучение и тюнинг дороже; на revisit-доминированном агрегате апгрейд почти не виден — без среза его не продать.
ДальшеДальше по лестнице индустрии: LambdaMART (обучение прямо на ранжирующую метрику), Wide&Deep / DeepFM / DCN-v2 (нейро-взаимодействия на кросс-фичах) — та же логика, больше ёмкость.

Лестница классов моделей для табличного ранжирования

1. Линейная модель — baseline с бесплатной интерпретацией: стандартизованный коэффициент ≈ условный эффект (с оговорками из D2b). Потолок: аддитивность.
2. Линейная + ручные взаимодействия — попытка купить нелинейность, оставаясь линейным: добавить произведения пар фичей. Наш замер показывает цену наивноговарианта — «добавить ВСЕ пары без отбора»: агрегат чуть просел, novel не сдвинулся ни на одно попадание, зато параметров стало в 4.5 раза больше. Это не доказывает, что interaction features бесполезны вообще; это показывает, что ручной перебор пар требует отбора, регуляризации и проверки по срезам — ровно той работы, которую хочется отдать модели.
3. GBDT (у нас sklearn HistGradientBoosting; в индустрии XGBoost/LightGBM/CatBoost) — рабочая лошадка табличного ранжирования/CTR и очень сильный baseline: находит взаимодействия и нелинейности сам, устойчив к масштабам фичей, быстро обучается. Важно: наш HistGB используется как pointwise-скорер — это не LambdaMART и не listwise ранкер, ranking-objective сюда не зашит.
4. Нейро-ранкеры (Wide&Deep, DeepFM, DCN-v2) — когда фичей тысячи, много категориальных с огромной кардинальностью (id-эмбеддинги), нужен multi-task и данных очень много; в больших рекомендательных системах они давно в проде. На маленьких табличках чаще проигрывают бустингу — «нейросеть ≠ лучше» (урок NeuMF) действует и здесь.

Pointwise / pairwise / listwiseНаш ранкер — pointwise: учим P(клик) на каждой паре (юзер, кандидат) независимо, а ранжируем сортировкой скора. Pairwise (BPR, RankNet) учит «позитив выше негатива», listwise (LambdaMART, LambdaRank) — прямо двигает NDCG списка. В проде pointwise часто достаточно, и его скор можно калибровать — но только при impression-aware логах и корректной поправке на схему сэмплирования негативов. В этом модуле калибровки нет и быть не может: лог positive-only, обучающие пары сэмплированы, поэтому наш скор — ranking score, а не вероятность чек-ина. Когда целевая метрика — порядок, pairwise/listwise выжимают больше; механику pairwise мы уже строили в BPR.
Важности без коэффициентовУ деревьев нет весов, которые можно прочитать. Permutation importance — перемешать колонку и посмотреть, насколько упало качество: честно про «на что модель опирается», но коррелированные фичи делят вклад непредсказуемо (как и коэффициенты в D2b — урок переносится). SHAP даёт по-примерные атрибуции той же природы. Важная оговорка про нашу таблицу: важности меряются на pair-level objective (те же сэмплированные обучающие пары, что видела модель), а не на Recall@10 по пользователям — «recency важнее всех» не означает «recency даёт столько-то Recall@10». Для ranking-эффекта честнее абляции с переобучением + user-level eval (как в D2b) — самый честный ответ и самый дорогой.

Как это связано с остальным учебником

Это Фаза 8 — первая ступень полного capstone: класс ранкера обновлён, фичи и протокол — те же, что в D2b и воронке E3. Следующие ступени: B4 feature store (фичи становятся главным активом — им нужна инфраструктура: point-in-time корректность, train/serve consistency; утечку такого рода мы уже ловили в D2b) и B6 re-rank constraints (квоты, eligibility, разнообразие поверх ранкера). Потом — сборка полного capstone.

⚠️ Что может пойти не так

  • Судить апгрейд модели по агрегированной метрике — revisit-доминирование прячет ×1.4 на novel; сравнение классов моделей без срезов почти бессмысленно.
  • Добавлять ВСЕ попарные взаимодействия «на всякий случай», без отбора и регуляризации — наш замер: ноль прироста на novel и минус в агрегате при 4.5× параметров.
  • Читать permutation importance как вклад в Recall@10 — она посчитана на pair-level objective; коррелированные фичи вдобавок делят важность произвольно (recency/seen/personal_freq здесь сильно связаны).
  • Путать «новое для пользователя» с «новым в каталоге»: наш novel-срез — про таргет вне истории юзера; холодный АЙТЕМ (без взаимодействий вообще) — это B5, другая задача.
  • Ждать от смены класса модели прорыва сквозь потолок retrieval — 0.958 не пробивается ранкером в принципе; хочешь выше — чини кандидатов (E3).
  • Тащить нейро-ранкер на маленькую табличку, потому что «в статьях DeepFM» — сначала бустинг-baseline; нейро платит при тысячах фичей и id-эмбеддингах.
  • Забыть про стоимость: GBDT дороже логрега в обучении и тюнинге, а офлайн-прирост в доли процента может не окупить сложность — решает продукт, не лидерборд.

🧠 Проверь себя: Бустинг дал доли процента к агрегированному Recall@10 против логрега. Менеджер спрашивает: «стоит ли катить?» Какой ответ правильный?

Где это в дорожной карте

Фаза 8 — Feature-rich ranking, ступень 1 из 3 на пути к полному capstone (дальше B4 feature store → B6 re-rank constraints → сборка). Теоретическая лестница фазы — LambdaMART и нейро-ранкеры — намечена выше; практическая ценность здесь — дисциплина сравнения классов моделей: всё зафиксировано, срезы обязательны, стоимость учтена.