2009-09-11 2 views
54

Я пытаюсь сортировать кучу продуктов по отзывам клиентов, используя 5-звездную систему. Сайт, для которого я настроен, не имеет большого количества рейтингов и продолжает добавлять новые продукты, поэтому у него обычно будет несколько продуктов с низким рейтингом.Что такое лучший способ сортировать по 5-звездочному рейтингу?

Я пробовал использовать средний рейтинг звезд, но этот алгоритм терпит неудачу, когда есть небольшое количество рейтингов.

Пример продукта, который имеет рейтинги 3x 5 звезд, будет отображаться лучше, чем продукт с 100-кратным номиналом 5 звезд и 2-звездочными рейтингами 2 звезды.

Не должен ли второй продукт подняться выше, потому что он статистически более заслуживает доверия из-за большего количества рейтингов?

+0

Правильный способ сделать это в среднем, а для элементов, которые еще не были причислены, имеют статус «не попал». Как вы пытались? Как это случилось? – David

ответ

61

Для их Топ-250 фильмов список IMDB использует . Это хороший способ учесть число избирателей.

От here:

Формула для вычисления Топ Rated 250 названия дает истинную байесовский оценку:

взвешенный рейтинг (WR) = (V ÷ (V + M)) × R + (м ÷ (у + т)) × С

где:

* R = average for the movie (mean) = (Rating) 
* v = number of votes for the movie = (votes) 
* m = minimum votes required to be listed in the Top 250 (currently 1300) 
* C = the mean vote across the whole report (currently 6.8) 

для Top 250, только голоса от считаются правильными.

+0

Вики-ответы, цитируемые цитируемой статьей, предполагают, что формула WR = (v * R + m * C)/(v + m), которая кажется более вероятной с учетом C, и значения, которые я получаю, выглядят лучше. –

+2

Формула на самом деле одна и та же, вы должны поставить исходный код неправильно (v/(v + m)) * R + (m/(v + m)) * C то же самое, что (v * R + m * C)/(v + m).Ссылка: http://goo.gl/IW9s1A – ParoX

7

Вы можете сортировать по median вместо среднего арифметического. В этом случае оба примера имеют медиану 5, поэтому оба будут иметь одинаковый вес в алгоритме сортировки.

Вы можете использовать mode с тем же эффектом, но медиана, вероятно, является лучшей идеей.

Если вы хотите присвоить дополнительный вес продукту со 100 рейтингами 5 звезд, вы, вероятно, захотите пойти в каком-то взвешенном режиме, присвоив больший вес рейтингам с той же медианной, но с более общим количеством голосов ,

+0

Если бы я использовал медианный метод, как бы вы определили, какой из них должен быть оценен лучше 5x 5 звездных рейтингов с рейтингами 4x 2 звезды или 5-кратным рейтингом 5 звезд с рейтингом 4x 1 звезда? Оба будут иметь 5 баллов за рейтинг. – Vizjerai

+0

В этот момент это будет зависеть от вас. Это зависит от того, как вы думаете, что он превосходит. Может быть, вы сначала сортируете медианным, а затем средним. Или, может быть, сначала медианным, то общим количеством голосов. – Welbog

+0

Взвешенная медиана: Сортировка по срединной, затем средней. Общее количество голосов повышает достоверность (уровень достоверности) оценки, но ничего не говорит о самой оценке. – richardtallent

0

Очевидно, что небольшое количество оценок ставит эту проблему со статистическим недостатком. Тем не менее ...

Ключевым элементом повышения качества совокупной оценки является «оценивание ратера», то есть сохранение вкладок оценок, которые каждый конкретный «rater» предоставил (относительно других). Это позволяет взвешивать свои голоса во время процесса агрегации.

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

-1

Я настоятельно рекомендую книгу «Программирование коллективного интеллекта» Тоби Сегаран (OReilly) ISBN 978-0-596-52932-1, в котором обсуждается, как извлечь значимые данные из поведения толпы. Примеры находятся в Python, но его достаточно легко конвертировать.

+1

Несмотря на то, что я могу рекомендовать эту книгу всем, кто интересуется этой областью, ваш ответ не дает решение вопроса. –

6

Ну, в зависимости от того, насколько сложным вы хотите это сделать, у вас могут быть рейтинги дополнительно взвешены в зависимости от того, сколько оценок сделал человек, и каковы эти оценки.Если человек сделал только один рейтинг, он может быть рейтингом шилла и может рассчитывать на меньшее. Или, если человек оценил многие вещи в категории a, но немного в категории b, и имеет средний рейтинг в 1,3 из 5 звезд, похоже, что категория a может быть искусственно отягощена низкой средней оценкой этого пользователя и следует отрегулировать.

Но достаточно сделать это сложным. Давайте сделаем это простым.

Предполагая, что мы работаем только с двумя значениями: ReviewCount и AverageRating, для определенного элемента было бы разумно рассматривать ReviewCount как существенное значение «надежность». Но мы не просто хотим снизить баллы за низкие пункты ReviewCount: один рейтинг в одной звезде, вероятно, такой же ненадежный, как у одного 5-звездочного рейтинга. Так что мы хотим сделать, вероятно, средние по отношению к середине: 3.

Итак, в основном, я думаю об уравнении что-то вроде X * AverageRating + Y * 3 = the-rating-we-want. Для того, чтобы это значение получилось правильно, нам нужно X + Y равным 1. Также нам нужно, чтобы X увеличивался в стоимости по мере того, как ReviewCount увеличивается ... с подсчетом обзора 0, x должно быть 0 (давая нам уравнение " 3 "), а с бесконечным числом отсчетов X должно быть 1 (что делает уравнение = AverageRating).

Итак, каковы уравнения X и Y? Для уравнения X хотим, чтобы зависимая переменная асимптотически приближалась к 1, когда независимая переменная приближается к бесконечности. Хорошая система уравнений - это что-то вроде: Y = 1/(factor^RatingCount) и (используя тот факт, что X должен быть равен 1-Y) X = 1 - (1/(factor^RatingCount)

.

Тогда мы можем настроить «фактор», чтобы соответствовать диапазону, который мы ищем

Я использовал эту простую C# программы, чтобы попробовать несколько факторов:

 // We can adjust this factor to adjust our curve. 
     double factor = 1.5; 

     // Here's some sample data 
     double RatingAverage1 = 5; 
     double RatingCount1 = 1; 

     double RatingAverage2 = 4.5; 
     double RatingCount2 = 5; 

     double RatingAverage3 = 3.5; 
     double RatingCount3 = 50000; // 50000 is not infinite, but it's probably plenty to closely simulate it. 

     // Do the calculations 
     double modfactor = Math.Pow(factor, RatingCount1); 
     double modRating1 = (3/modfactor) 
      + (RatingAverage1 * (1 - 1/modfactor)); 

     double modfactor2 = Math.Pow(factor, RatingCount2); 
     double modRating2 = (3/modfactor2) 
      + (RatingAverage2 * (1 - 1/modfactor2)); 

     double modfactor3 = Math.Pow(factor, RatingCount3); 
     double modRating3 = (3/modfactor3) 
      + (RatingAverage3 * (1 - 1/modfactor3)); 

     Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}", 
      RatingAverage1, RatingCount1, modRating1)); 
     Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}", 
      RatingAverage2, RatingCount2, modRating2)); 
     Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}", 
      RatingAverage3, RatingCount3, modRating3)); 

     // Hold up for the user to read the data. 
     Console.ReadLine(); 

Таким образом, вы не потрудились копирования он вводит это значение:

RatingAverage: 5, RatingCount: 1, Adjusted Rating: 3.67 
RatingAverage: 4.5, RatingCount: 5, Adjusted Rating: 4.30 
RatingAverage: 3.5, RatingCount: 50000, Adjusted Rating: 3.50 

Что-то в этом роде? Вы могли бы, очевидно, настроить значение «фактор» по мере необходимости, чтобы получить нужный вес.

16

Вы можете посмотреть на этой странице, чтобы получить хороший анализ для звездочек:

http://www.evanmiller.org/ranking-items-with-star-ratings.html

И вы можете посмотреть на этой странице, чтобы получить хороший анализ вверх и вниз голосований:

http://www.evanmiller.org/how-not-to-sort-by-average-rating.html

Для голосования вверх и вниз вы хотите оценить вероятность того, что если у вас есть рейтинги, «реальный» счет (если у вас были бесконечные оценки) больше некоторого количества (например, simil ar для какого-либо другого предмета, который вы сортируете.)

См. вторую статью для ответа, но вывод заключается в том, что вы хотите использовать доверие Уилсона. В статье дается уравнение и образец кода Ruby (легко переведенный на другой язык).

+4

Уличные интервалы Wilson работают только для биномиальных распределений (например, рейтинги стиля + 1/-1); неясно, какой подход взять за что-то вроде 5-звездочной рейтинговой схемы. – Alec

+0

Вот его статья для рейтинговых систем звезд: http://www.evanmiller.org/ranking-items-with-star-ratings.html –

3

Если вам просто нужно быстро и дешевое решение, которое в основном работать без использования большого количества вычислений здесь один вариант (при условии 1-5 рейтинговую шкалу)

SELECT Products.id, Products.title, avg(Ratings.score), etc 
FROM 
Products INNER JOIN Ratings ON Products.id=Ratings.product_id 
GROUP BY 
Products.id, Products.title 
ORDER BY (SUM(Ratings.score)+25.0)/(COUNT(Ratings.id)+20.0) DESC, COUNT(Ratings.id) DESC 

Добавляя в 25 и делением на общий рейтинг + 20 вы в основном добавляете 10 наихудших оценок и 10 лучших результатов в общий рейтинг, а затем сортируете соответственно.

У этого есть известные проблемы. Например, он несправедливо вознаграждает продукты с низким рейтингом с небольшим рейтингом (как показывает this graph, продукты со средним счетом 1 и только один рейтинг оценивается в 1,2, а товары со средним счетом 1 и 1к + рейтинги оцениваются ближе к 1.05). Вы также можете утверждать, что он несправедливо наказывает высококачественную продукцию с несколькими рейтингами.

Эта диаграмма показывает, что происходит для всех 5 оценок над 1-1000 оценок: http://www.wolframalpha.com/input/?i=Plot3D%5B%2825%2Bxy%29/%2820%2Bx%29%2C%7Bx%2C1%2C1000%7D%2C%7By%2C0%2C6%7D%5D

Вы можете увидеть падение вверх в самом низу рейтинга, но в целом это справедливо рейтинга, я думаю. Вы также можете посмотреть на это так:

http://www.wolframalpha.com/input/?i=Plot3D%5B6-%28%2825%2Bxy%29/%2820%2Bx%29%29%2C%7Bx%2C1%2C1000%7D%2C%7By%2C0%2C6%7D%5D

Если вы уронили мрамор на большинстве мест в этом графике, он будет автоматически катиться в стороне продукции с обеими более высокими оценками и более высокими оценками.

0

Один из вариантов - это что-то вроде системы Microsoft TrueSkill, где оценка дается mean - 3*stddev, где константы могут быть изменены.

7

Evan Miller shows байесовский подход к ранжированию 5-звездочный рейтинг: enter image description here

где

  • nk это число k -Star оценок,
  • sk является "стоит" (в пунктах) k stars,
  • N - общее количество голосов
  • K - максимальное количество звезд (например, K = 5, в системе с 5 звездами)
  • z_alpha/2 - 1 - alpha/2 квантиль нормального распределения. Если вы хотите, чтобы 95% -ная уверенность (на основе байесовского заднего распределения), что фактический критерий сортировки по крайней мере такой же, как и вычисленный критерий сортировки, выберите z_alpha/2 = 1,65.

В Python, критерий сортировки может быть вычислена с

def starsort(ns): 
    """ 
    http://www.evanmiller.org/ranking-items-with-star-ratings.html 
    """ 
    N = sum(ns) 
    K = len(ns) 
    s = list(range(K,0,-1)) 
    s2 = [sk**2 for sk in s] 
    z = 1.65 
    def f(s, ns): 
     N = sum(ns) 
     K = len(ns) 
     return sum(sk*(nk+1) for sk, nk in zip(s,ns))/(N+K) 
    fsns = f(s, ns) 
    return fsns - z*math.sqrt((f(s2, ns)- fsns**2)/(N+K+1)) 

Например, если элемент имеет 60 пять-звезд, 80 четыре-звезды, 75 три звезды, 20 две звезды и 25 однозвездочных, то его общий рейтинг звезд составит около 3.4:

x = (60, 80, 75, 20, 25) 
starsort(x) 
# 3.3686975120774694 

и вы можете сортировать список 5-звездочный рейтинг с

sorted([(60, 80, 75, 20, 25), (10,0,0,0,0), (5,0,0,0,0)], key=starsort, reverse=True) 
# [(10, 0, 0, 0, 0), (60, 80, 75, 20, 25), (5, 0, 0, 0, 0)] 

Это показывает эффект, который больше оценок может иметь от общей стоимости звезды.


Вы обнаружите, что эта формула имеет тенденцию давать общую оценку, которая немного ниже, чем общий рейтинг сообщил на таких сайтах, как Amazon, Ebay или Wal-Mart особенно, когда есть несколько голосов (скажем, менее 300). Это отражает более высокую неопределенность , которая приходит с меньшим количеством голосов. По мере увеличения количества голосов (в тысячах) все эти рейтинговые формулы должны иметь тенденцию к среднему рейтингу (взвешенный).


Поскольку формула зависит только от распределения частот 5-звездочный рейтингов для самого элемента, легко объединить отзывов из нескольких источников (или, обновления общей оценки в свете новых голосов), просто добавив частоту дистрибутивов вместе.


В отличии от формулы IMDb, эта формула не зависит от среднего балла по всем пунктам, ни искусственного минимального количества голосов значения отсечки.

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

In [78]: starsort((10,0,0,0,10)) 
Out[78]: 2.386028063783418 

In [79]: starsort((0,0,20,0,0)) 
Out[79]: 2.795342687927806 

Формула IMDb не учитывает это.

0

Посмотрите на какое-то время, я выбираю байесовскую систему. Если кто-то использует Ruby, здесь драгоценный камень для него:

https://github.com/wbotelhos/rating