Как применять соотношение лайков и дизлайков для ранжирования ответов
Что проверяют
Видите ли вы, что наивное соотношение даёт плохое ранжирование, и знаете ли, как учесть объём выборки. Следом обычно спрашивают, что делать с новым ответом без голосов и как ранжирование само влияет на голоса.
Как отвечать
Сначала покажите, почему простые формулы не работают:
L / D: делится на ноль без дизлайков, и ответ с 1:0 бесконечно лучше ответа с 500:10;L - D: поощряет старые популярные ответы, 600:400 оказывается выше 90:0;L / (L + D): доля лайков не знает о размере выборки, один голос «за» даёт 100% и обгоняет 95 из 100.
Затем рабочие варианты:
- нижняя граница интервала Уилсона: оцениваем долю лайков с поправкой на число голосов и берём пессимистичную границу, обычно для 95% (
z = 1.96). Голосов мало, интервал широкий, граница низкая. Классическая схема для сортировки «лучших» ответов; - байесовское сглаживание:
(L + a) / (L + D + a + b), гдеaиbзадают априорное Beta-распределение, подобранное по средней доле лайков на площадке. Новый ответ стартует со средней оценки, а не с нуля или единицы; - время: затухание голосов, если важна свежесть;
- вес голоса: репутация голосующего, фильтр накруток и аккаунтов-однодневок.
Отдельно назовите смещение позиции: ответы наверху получают больше просмотров и голосов просто потому, что они наверху. Помогает нормировать голоса на показы и отдавать часть трафика на исследование новых ответов (Thompson sampling по тому же Beta-распределению или UCB). Качество ранжирования проверяют офлайн по NDCG на размеченных данных и онлайн через A/B-тест по вовлечённости.
Где спотыкаются
Используют сырую долю лайков и получают наверху ответы с одним голосом.
Забывают про холодный старт. Новые ответы без голосов уходят вниз, их никто не видит и не оценивает, и ранжирование замыкается на старых лидерах.
Не отделяют качество ответа от позиции. Если сравнивать голоса без учёта показов, модель учится на собственных прошлых решениях и только закрепляет их.