Явный и неявный фидбэк

Урок объясняет два источника сигналов о предпочтениях — явный и неявный — и почему неявный фидбэк удобнее собирать, но сложнее интерпретировать.

Явный фидбэк — это оценки, которые пользователь поставил сознательно (звёзды, лайк/дизлайк). Неявный фидбэк — это поведенческие следы (клики, просмотры, время, покупки), из которых предпочтение выводится косвенно.

Явный фидбэк

Оценка по шкале (например, 1–5 звёзд) — самый чистый сигнал: пользователь прямо сказал, насколько ему понравилось. Минус в том, что оценок мало. Большинство людей не ставят рейтинги, а если ставят — то выборочно и с перекосом (чаще оценивают то, что вызвало сильные эмоции). Поэтому данных мало, и они смещены.

Неявный фидбэк

Клик, просмотр, добавление в корзину, время на странице, покупка — этих сигналов на порядки больше, они копятся автоматически. Но у неявного фидбэка две принципиальные сложности.

Нет негатива. Если человек посмотрел фильм — это слабый плюс. Но если не посмотрел — это не обязательно минус: он мог просто не знать о фильме. В неявных данных почти нет явного «не понравилось», есть только «взаимодействовал» и «неизвестно». Это превращает задачу из «предсказать оценку» в «оценить вероятность взаимодействия среди океана неизвестного».

Шум и неоднозначность. Клик мог быть случайным, покупка — подарком, долгий просмотр — потому что человек отвлёкся. Один сигнал слаб; силу даёт их объём и комбинация.

Сравнение

СвойствоЯвныйНеявный
Объём данныхМалоОчень много
Точность сигналаВысокаяШумная
Негативные примерыЕсть (низкие оценки)Почти нет
Усилие пользователяТребуетсяНе требуется

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

Неявные данные обычно превращают в матрицу «уверенности»: чем больше взаимодействий пользователя с объектом, тем выше уверенность, что объект ему интересен. Отсутствие взаимодействия трактуют как слабый отрицательный сигнал с малым весом — отсюда популярная схема «положительные взаимодействия + случайно подобранные отрицательные» (negative sampling), которую мы ещё встретим в нейросетевых моделях.

# превращаем события в неявные «веса доверия»
weights = {"клик": 1, "в корзину": 3, "покупка": 5}
events = [
    ("u1", "товар_A", "клик"),
    ("u1", "товар_A", "в корзину"),
    ("u1", "товар_A", "покупка"),
    ("u1", "товар_B", "клик"),
]
from collections import defaultdict
confidence = defaultdict(int)
for user, item, ev in events:
    confidence[(user, item)] += weights[ev]

for key, val in confidence.items():
    print(f"{key[0]} -> {key[1]}: уверенность {val}")

Вывод:

u1 -> товар_A: уверенность 9
u1 -> товар_B: уверенность 1

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

  • Трактовать отсутствие клика как «не нравится». Чаще это «не видел». Негатив в неявных данных надо моделировать осторожно.
  • Считать все события равными. Покупка и случайный клик несут разную информацию — взвешивайте.
  • Применять метрики оценок к неявным данным. Здесь нет «правильной оценки», есть ранжирование — и метрики должны быть ранжирующими.

Итоги

  • Явный фидбэк точен, но редок и смещён; неявный обилен, но шумен и почти без негатива.
  • Главная сложность неявного сигнала — отсутствие явного «не понравилось».
  • События взвешивают по силе и трактуют как «уверенность» в интересе.
  • Negative sampling — стандартный приём для неявных данных.
Проверьте себя
1. Почему неявный фидбэк сложнее явного?
AЕго слишком мало
BВ нём почти нет явных негативных примеров, и он шумный
CЕго невозможно собирать автоматически
DОн всегда точнее оценок
2. Как корректно трактовать отсутствие клика по товару?
AКак точный негатив — товар не нравится
BКак сильный позитив
CКак неизвестность или слабый негатив с малым весом
DКак ошибку данных