Алгоритм ранжирования с использованием лайков / дислайков и средних просмотров за день
В настоящее время я оцениваю видео на веб-сайте, используя алгоритм байесовского ранжирования, каждое видео имеет:
likes
dislikes
views
upload_date
Любой может like
или же dislike
видео, видео всегда views + 1
при просмотре и все видео имеют уникальный upload_date
,
Структура данных
Данные представлены в следующем формате:
| id | title | likes | dislikes | views | upload_date |
|------|-----------|---------|------------|---------|---------------|
| 1 | Funny Cat | 9 | 2 | 18 | 2014-04-01 |
| 2 | Silly Dog | 9 | 2 | 500 | 2014-04-06 |
| 3 | Epic Fail | 100 | 0 | 200 | 2014-04-07 |
| 4 | Duck Song | 0 | 10000 | 10000 | 2014-04-08 |
| 5 | Trololool | 25 | 30 | 5000 | 2014-04-09 |
Текущий взвешенный рейтинг
Следующий алгоритм взвешенного отношения используется для ранжирования и сортировки видео, чтобы сначала показывались лучшие по рейтингу.
Этот алгоритм учитывает байесовское среднее значение, чтобы улучшить общий рейтинг.
Weighted Rating (WR) = ((AV * AR) + (V * R))) / (AV + V)
AV = Average number of total votes
AR = Average rating
V = This items number of combined (likes + dislikes)
R = This items current rating (likes - dislikes)
Пример текущего MySQL Query
SELECT id, title, (((avg_vote * avg_rating) + ((likes + dislikes) * (likes / dislikes)) ) / (avg_vote + (likes + dislikes))) AS score
FROM video
INNER JOIN (SELECT ((SUM(likes) + SUM(dislikes)) / COUNT(id)) AS avg_vote FROM video) AS t1
INNER JOIN (SELECT ((SUM(likes) - SUM(dislikes)) / COUNT(id)) AS avg_rating FROM video) AS t2
ORDER BY score DESC
LIMIT 10
Замечания: views
а также upload_date
не учитываются в.
Проблема
Рейтинг в настоящее время работает хорошо, но, похоже, мы не используем в полной мере все имеющиеся в нашем распоряжении данные.
имеющий likes
, dislikes
, views
и upload_date
но только использование двух кажется пустой тратой, потому что views
а также upload_date
не учитывается, сколько весит каждый like
/ dislike
должен иметь.
Например, в приведенной выше таблице структуры данных 1
а также 2
оба имеют одинаковое количество likes
/ dislikes
Однако пункт 2
был загружен совсем недавно, поэтому его среднее количество просмотров за день выше.
С пункта 2
имеет больше симпатий и антипатий за более короткое время, чем те, likes
/ dislikes
наверняка должен быть взвешен сильнее?
Новый алгоритм Результат
В идеале новый алгоритм с views
а также upload_date
Факторинг в сортирует данные в следующий результат:
Замечания: avg_views
будет равно (views / days_since_upload)
| id | title | likes | dislikes | views | upload_date | avg_views |
|------|-----------|---------|------------|---------|---------------|-------------|
| 3 | Epic Fail | 100 | 0 | 200 | 2014-04-07 | 67 |
| 2 | Silly Dog | 9 | 2 | 500 | 2014-04-06 | 125 |
| 1 | Funny Cat | 9 | 2 | 18 | 2014-04-01 | 2 |
| 5 | Trololool | 25 | 30 | 5000 | 2014-04-09 | 5000 |
| 4 | Duck Song | 0 | 10000 | 10000 | 2014-04-08 | 5000 |
Выше приведено простое представление, с большим количеством данных становится намного сложнее.
Вопрос
Подводя итог, мой вопрос, как я могу учесть views
а также upload_date
в мой текущий алгоритм ранжирования в стиле, чтобы улучшить рейтинг видео?
Я думаю, что приведенный выше пример путем расчета avg_views
хороший путь, но куда мне тогда добавить это в алгоритм ранжирования, который у меня есть?
Вполне возможно, что могут существовать более эффективные алгоритмы ранжирования, если это так, то приведите пример другого алгоритма, который я мог бы использовать, и укажите преимущества его использования.
5 ответов
Я могу указать вам на непараметрический способ получить лучший порядок в отношении системы взвешенных линейных оценок, не зная точно, какие веса вы хотите использовать (только ограничения на веса). Во-первых, обратите внимание, что средние ежедневные просмотры могут вводить в заблуждение, потому что фильмы, вероятно, загружаются меньше в последующие годы. Поэтому первое, что я хотел бы сделать, это подобрать полиномиальную модель (степень 10 должна быть достаточно хорошей), которая предсказывает общее количество просмотров в зависимости от того, сколько дней фильм был доступен. Затем, как только вы подберете форму, для каждой даты вы получите прогнозируемое общее количество просмотров, на которое вы делитесь, чтобы получить "относительное среднее количество просмотров", которое является индикатором множителя, который сообщает вам, во сколько раз вероятнее (или менее вероятно) фильм нужно смотреть по сравнению с тем, что вы ожидаете в среднем, учитывая данные. Таким образом, 2 будет означать, что фильм будет смотреться в два раза чаще, а 1/2 означает, что фильм будет смотреться в два раза чаще. Если вы хотите, чтобы 2 и 1/2 были "отрицательными" по отношению друг к другу, что имеет смысл с точки зрения подсчета очков, то возьмите журнал множителя, чтобы получить оценку.
Теперь есть несколько величин, которые вы можете вычислить, чтобы включить в общий балл, например, (журнал) "относительное среднее количество просмотров", которое я упомянул выше, и (лайки / общее количество просмотров) и (неприязнь / общее количество просмотров). В US News and World Report ранжируются университеты каждый год, и они просто используют взвешенную сумму из 7 различных оценок по категориям, чтобы получить общий балл для каждого университета, по которому они ранжируются. Поэтому использование взвешенной линейной комбинации баллов по категориям определенно не плохой путь. (Отметив, что вы можете сделать что-то вроде преобразования журнала в некоторых категориях, прежде чем брать линейную комбинацию баллов). Проблема в том, что вы можете не знать точно, какие веса использовать для "наиболее желательного" рейтинга. Первое, на что нужно обратить внимание: если вы хотите, чтобы веса были одинаковыми, то вам следует нормализовать оценку каждой категории, чтобы стандартное отклонение было равно 1 для всех фильмов. Тогда, например, если вы используете равные веса, то каждая категория действительно взвешена одинаково. Тогда вопрос в том, какие веса вы хотите использовать. Очевидно, что весовые коэффициенты для относительного количества просмотров и пропорций лайков должны быть положительными, а вес для доли антипатий должен быть отрицательным, поэтому умножьте оценку неприязни на -1, и тогда вы можете предположить, что все веса положительные. Если вы считаете, что каждая категория должна составлять не менее 20%, то вы получите, что каждый вес по меньшей мере в 0,2 раза превышает сумму весов. Если вы считаете, что нелюбовь важнее любящих, то вы можете сказать (не нравиться вес) >= c*(например, вес) для некоторого c > 1 или (dislike_weight) >= c*(сумма весов) + (как вес) для некоторого c > 0. Аналогичным образом вы можете определить другие линейные ограничения для весов, которые отражают ваши убеждения относительно того, какими должны быть веса, без выбора точных значений для весов.
Теперь вот самое интересное, что является основным направлением моего поста. Если у вас есть линейные ограничения неравенства для весов, все в той форме, что линейная комбинация весов больше или равна 0, но вы не знаете, какие веса использовать, то вы можете просто вычислить все возможные топ-10 или топ-20 рейтингов фильмов, которые вы можете получить для любого выбора весов, которые удовлетворяют вашим ограничениям, и затем выбрать порядок топ-k, который поддерживается наибольшим ОБЪЕМОМ весов, где объем весов является телесным углом многогранный конус весов, который приводит к определенному упорядочению top-k. Затем, выбрав "наиболее поддерживаемый" рейтинг топ-k, вы можете ограничить параметры скоринга в конусе, который дает вам этот рейтинг, и удалить топ-k фильмов и вычислить все возможности для следующего топ-рейтинга. 10 или топ-20 рейтинга оставшихся фильмов, когда весовые коэффициенты ограничены в соответствии с рейтингом оригинальных топ-фильмов. Вычисление всех рейтингов фильмов top-k getale для ограниченных весов может быть сделано намного, намного быстрее, чем перечисление всех n(n-1)...(n-k+1) возможных рангов top-k и проверка их всех. Если у вас есть две или три категории, то с использованием методов построения многогранника можно получить вычисляемые ранжировки top-k за линейное время с точки зрения выходного размера, то есть количества получаемых ранжирований top-k. Подход к многогранным вычислениям также дает неравенства, которые определяют конус оценочных весов, которые дают каждому рангу top-k, также в линейном времени, если у вас есть две или три категории. Затем, чтобы получить объем весов, которые дают каждое ранжирование, вы триангулируете конус и пересекаетесь с единичной сферой и вычисляете области сферических треугольников, которые вы получаете. (Опять линейная сложность, если количество категорий 2 или 3). Кроме того, если вы масштабируете свои категории так, чтобы они находились в диапазоне, таком как [0,50], и округлились до ближайшего целого числа, то вы можете доказать, что количество доступных рейтингов top-k на самом деле довольно мало, если количество категорий равно 5 или менее. (Даже если у вас много фильмов и k - высокий). И когда вы исправляете порядок для текущей верхней группы фильмов и ограничиваете параметры, чтобы быть в конусе, который приводит к фиксированному верхнему порядку, это еще больше ограничит выходной размер для доступных следующих лучших лучших фильмов. Размер вывода зависит (полиномиально) от k, поэтому я рекомендовал установить k=10 или 20 и вычислить фильмы top-k и выбрать лучший (самый большой объем) порядок и исправить его, а затем вычислить следующие лучшие фильмы top-k что уважать порядок оригинального топ-к и т. д.
В любом случае, если этот подход кажется вам привлекательным (итеративный поиск последовательных вариантов ранжирования топ-k, которые поддерживаются наибольшим объемом весов, которые удовлетворяют вашим ограничениям веса), дайте мне знать, и я могу произвести и опубликовать рецензию на многогранник необходимые вычисления, а также ссылка на программное обеспечение, которое позволит вам сделать это с минимальным дополнительным кодированием с вашей стороны. Тем временем вот статья http://arxiv.org/abs/0805.1026 я написал в аналогичном исследовании данных ранжирования университетов 7-й категории, где веса были просто ограничены, чтобы все были неотрицательными (обобщая произвольные линейные ограничения на Веса это просто).
Прямой процент просмотров также не дает точного представления о популярности предмета. Хотя 9 лайков из 18 "сильнее", чем 9 лайков из 500, тот факт, что одно видео набрало 500 просмотров, а другому всего 18, является гораздо более сильным показателем популярности видео.
Видео, которое получает много просмотров, обычно означает, что оно очень популярно среди широкого круга зрителей. То, что он получает только небольшой процент симпатий или антипатий, обычно является второстепенным соображением. Видео, которое получает небольшое количество просмотров и большое количество лайков, обычно является показателем видео с очень узким таргетингом.
Если вы хотите включить представления в уравнение, я бы посоветовал умножить среднее значение по Байесу, полученное из лайков и дислайков, на логарифм количества просмотров. Это должно все уладить.
Если только вы не хотите использовать многофакторное ранжирование, где симпатии, антипатии и мнения учитываются отдельно и с учетом индивидуальных весов. Математика более сложная и требует некоторой настройки, но, как правило, дает лучшие результаты. Предположим, например, что людям часто "нравится" видео, которое они считают слегка забавным, но им "не нравится", только если они считают его нежелательным. Нелюбовь - намного более сильный признак, чем подобное.
Простой подход состоит в том, чтобы придумать подходящий масштабный коэффициент для каждого среднего значения, а затем суммировать "веса". Трудной частью будет настройка масштабных коэффициентов для получения желаемого порядка.
Исходя из данных вашего примера, отправной точкой может быть что-то вроде:
Weighted Rating = (AV * (1 / 50)) + (AL * 3) - (AD * 6)
Ключ и объяснение
AV = Среднее количество просмотров в день: 5000 - это высокое, поэтому разделите на 50, чтобы снизить вес до 100 в этом случае.
AL = Среднее число лайков в день: 100 за 3 дня = 33,33 - это высоко, поэтому умножьте на 3, чтобы довести вес до 100 в этом случае.
AD = Среднее число неприязнений в день: здесь 10000 кажется экстремальным значением - согласуется с точкой зрения Джима Мишеля о том, что неприязнь может быть более значимой, чем лайки, поэтому изначально я использую отрицательный масштабный коэффициент, вдвое превышающий масштабный коэффициент "лайков".
Это дает следующие результаты (см. Демонстрацию SQL Fiddle):
ID TITLE SCORE
-----------------------------
3 Epic Fail 60.8
2 Silly Dog 4.166866
1 Funny Cat 1.396528
5 Trololool -1.666766
4 Duck Song -14950
[Я намеренно придерживаюсь этого простого, чтобы представить идею отправной точки - но с реальными данными вы можете обнаружить, что линейного масштабирования недостаточно; в этом случае вы можете рассмотреть полосатости или логарифмическое масштабирование.]
Поскольку никто еще не указал на это (и я немного удивлен), я сделаю это. Проблема с любым алгоритмом ранжирования, который мы можем придумать, заключается в том, что он основан на нашей точке зрения. Что вы, безусловно, ищете, так это алгоритм, который учитывает среднюю точку зрения пользователя.
Это не новая идея. У Netflix это было некоторое время назад, только они персонализировали его, основываясь на своем индивидуальном выборе. Мы ищем, как я уже сказал, средний рейтинг лучших пользователей.
Так как этого добиться? Как уже предлагали другие, вы ищете функцию R(L,D,V,U), которая возвращает действительное число для ключа сортировки. R(), вероятно, будет совершенно нелинейным.
Это классическая проблема машинного обучения. "Тренировочные данные" состоят из выбора пользователя. Когда пользователь выбирает фильм, это утверждение о правильности рейтинга: выбор высокопоставленного - это вотум доверия. Низкий рейтинг - это упрек. Функция R () должна пересмотреть себя соответственно. Первоначально текущая система ранжирования может использоваться для обучения системы отражать ее выбор. Оттуда он будет адаптироваться к отзывам пользователей.
Существует несколько схем и обширная исследовательская литература по машинному обучению для таких проблем: регрессионное моделирование, нейронные сети, репрезентативное обучение и т. Д. См., Например, страницу Википедии для некоторых указателей.
Я мог бы предложить некоторые схемы, но не буду, если нет интереса к этому подходу. Скажите "да" в комментариях, если это правда.
Реализация будет не тривиальной - конечно, больше, чем просто настройка вашего SELECT
заявление. Но с другой стороны, вы сможете с уверенностью сказать, что ваши клиенты получают то, о чем они просят!
Каждое видео имеет:
- нравится
- Не понравилось:
- Просмотры
- Дата загрузки
Таким образом, мы можем вычесть из них следующие параметры:
like_rate = лайки / просмотры
dislike_rate = лайки / просмотры
view_rate = views / number_of_website_users
video_age = count_days (upload_date, today)
avg_views = views / upload_age
avg_likes = лайки / upload_age
avg_dislikes = dislikes / upload_age
Прежде чем мы сможем установить формулу для использования, нам нужно указать, как должна работать популярность разных видео, одним из способов является объяснение в точках свойства популярного видео:
Популярное видео является недавним в большинстве случаев
Чем старше видео, тем выше avg_views, которое требуется, чтобы стать популярным
Видео с like_rate over like_rate_threshold или dislike_rate over dislike_rate_threshold может конкурировать по разнице от своего порога с тем, сколько ему лет
Высокая частота просмотров видео является хорошим показателем того, что это видео предлагается пользователю, который не смотрел его ранее.
Если avg_likes или avg_dislikes составляют большую часть avg_views, видео считается активным, в случае активных видео нам не нужно проверять, сколько ему лет
Вывод: у меня нет формулы, но ее можно построить, преобразовав одну единицу в ось другой, например, сократить возраст видео по дням на основе вычислений, выполненных с использованием avg_likes, avg_dislikes и avg_views