Гибридные системы

Урок показывает, как объединить контентные и коллаборативные сигналы в гибридную систему, которая берёт лучшее от обоих подходов.

Гибридная рекомендательная система комбинирует несколько источников сигналов (коллаборативный, контентный, популярностный), чтобы компенсировать слабости каждого по отдельности.

Зачем смешивать

У каждого подхода свои дыры. CF точна на «тёплых» данных, но беспомощна на холодном старте. Контент решает холодный старт по товарам, но переспециализирует. Популярность устойчива, но безлична. Гибрид собирает их так, чтобы там, где один молчит, говорил другой. Именно гибридные системы выигрывали знаменитый конкурс Netflix Prize и доминируют в индустрии.

Способы смешивания

  • Взвешенный (weighted). Итоговый скор = сумма скоров моделей с весами. Просто и прозрачно.
  • Переключение (switching). Выбираем модель по ситуации: мало истории → контент/популярное, много → CF. Это маршрутизатор холодного старта из прошлого раздела.
  • Каскад / смешение (cascade, mixed). Одна модель отбирает кандидатов, другая ранжирует; или результаты разных моделей показываются вперемешку.
  • Признаковый (feature combination). Контентные и коллаборативные сигналы становятся признаками единой модели ранжирования — самый мощный промышленный вариант (см. раздел про ранжирование).

Простой взвешенный гибрид

def normalize(scores):
    if not scores:
        return {}
    lo, hi = min(scores.values()), max(scores.values())
    if hi == lo:
        return {k: 0.5 for k in scores}
    return {k: (v - lo) / (hi - lo) for k, v in scores.items()}

cf = {"A": 0.9, "B": 0.2, "C": 0.5}
content = {"A": 0.3, "B": 0.8, "D": 0.7}
w_cf, w_ct = 0.6, 0.4

cf_n, ct_n = normalize(cf), normalize(content)
items = set(cf_n) | set(ct_n)
hybrid = {}
for it in items:
    hybrid[it] = w_cf * cf_n.get(it, 0) + w_ct * ct_n.get(it, 0)

print("Гибридный рейтинг:")
for it in sorted(hybrid, key=lambda x: -hybrid[x]):
    print(f"  {it}: {round(hybrid[it], 3)}")

Вывод:

Гибридный рейтинг:
  A: 0.6
  B: 0.4
  D: 0.32
  C: 0.257

Товар A силён в CF и попадает наверх; B вытягивает контент; D появляется только из контента (его нет в CF), но всё же ранжируется. Обратите внимание: перед сложением скоры нормированы в [0,1], иначе шкалы моделей несопоставимы.

Как работает под капотом

Ключевая тонкость гибрида — приведение шкал. Скоры разных моделей живут в разных диапазонах (косинус 0..1, факторное произведение может быть любым), поэтому перед смешиванием их нормируют или калибруют. Веса w подбирают по офлайн-метрикам и подтверждают онлайн-экспериментом. В крупных компаниях гибрид чаще реализуют как признаковую комбинацию: и коллаборативные факторы, и контентные эмбеддинги, и популярность подаются признаками в обучаемую модель ранжирования.

Частые ошибки

  • Складывать ненормированные скоры. Модель с большей амплитудой задавит остальные; нормируйте/калибруйте.
  • Фиксировать веса навсегда. Оптимальный баланс меняется; подбирайте по метрикам и проверяйте онлайн.
  • Дублировать сигнал. Если две модели измеряют по сути одно и то же, гибрид не добавляет ценности.

Итоги

  • Гибрид совмещает CF, контент и популярность, закрывая слабости каждого.
  • Способы: взвешивание, переключение, каскад, признаковая комбинация.
  • Перед смешиванием скоры обязательно приводят к одной шкале.
  • Самый мощный вариант — подавать все сигналы признаками в модель ранжирования.
Проверьте себя
1. Зачем строят гибридные рекомендательные системы?
AЧтобы усложнить код
BЧтобы компенсировать слабости одного подхода сильными сторонами другого
CЧтобы отказаться от данных
DЧтобы всегда показывать популярное
2. Почему перед взвешенным смешиванием скоры моделей нормируют?
AЧтобы ускорить вычисления
BПотому что скоры живут в разных диапазонах, и без нормировки модель с большей амплитудой задавит остальные
CЧтобы удалить отрицательные значения навсегда
DНормировка не нужна