2009-09-11 27 views
54

Próbuję posortować kilka produktów według ocen klientów za pomocą systemu 5-gwiazdkowego. Strona, na którą to ustawiam, nie ma wielu ocen i nadal dodaje nowe produkty, więc zwykle będzie mieć kilka produktów o niskiej liczbie ocen.Jaki jest lepszy sposób sortowania według 5 gwiazdek?

Próbowałem używać średniej gwiazdki, ale ten algorytm kończy się niepowodzeniem, gdy liczba ocen jest niewielka.

Przykład produktu, który ma 3 gwiazdki i 5 gwiazdek, byłby lepszy niż produkt z ocenami 100 x 5 gwiazdek i 2x 2 gwiazdkami.

Czy drugi produkt nie powinien być wyższy, ponieważ jest statystycznie bardziej wiarygodny ze względu na większą liczbę ocen?

+0

Prawo sposobem na to jest średnie, a dla pozycji, które nie zostały jeszcze w rankingu, mają status „nie miejsce”. Jak próbowałeś? Jak to się nie udało? – David

Odpowiedz

61

Dla listy filmów z listy Top 250, IMDB używa numeru . To dobry sposób na wzięcie pod uwagę liczby wyborców.

Z here:

Wzór do obliczania górną oceniane 250 tytułów daje prawdziwy Bayesa ocenić:

ocena ważona (WR) = (V ÷ (v + M)) x R + (m ÷ (V + m)) x C

gdzie:

* 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) 

dla Top 250, tylko głosy od regularnych wyborców są brane pod uwagę.

+0

Na stronie wiki znajduje się cytowany artykuł sugerujący, że formuła to WR = (v * R + m * C)/(v + m), która wydaje się bardziej prawdopodobna, ponieważ C jest brane pod uwagę, a wartości, które otrzymuję, wydają się lepsze. –

+2

Formuła jest w rzeczywistości tym samym, należy umieścić oryginalną w nieprawidłowy sposób (v/(v + m)) * R + (m/(v + m)) * C jest taki sam jak (v * R + m * C)/(v + m).Link: http://goo.gl/IW9s1A – ParoX

7

Można sortować według median zamiast średniej arytmetycznej. W tym przypadku oba przykłady mają medianę 5, więc oba miałyby taką samą wagę w algorytmie sortowania.

Do tego samego efektu można użyć mode, ale mediana jest prawdopodobnie lepszym pomysłem.

Jeśli chcesz przypisać dodatkową wagę do produktu ze 100 pięciogwiazdkowymi ocenami, prawdopodobnie będziesz chciał przejść w tryb ważony, przypisując większą wagę ocenom z tą samą medianą, ale przy większej liczbie głosów .

+0

Gdybym użył metody medianowej, jak byś określił, która powinna być oceniona lepiej 5x 5 gwiazdek z 4x 2 gwiazdkami lub 5x 5 gwiazdkami z 4x 1 gwiazdkami? Obaj wymyśliliby 5 za ocenę. – Vizjerai

+0

To będzie od Ciebie zależało w tym momencie. To zależy od tego, co Twoim zdaniem jest lepsze. Być może najpierw sortujesz według mediany, a następnie przez średnią. A może najpierw przez medianę, a następnie przez całkowitą liczbę głosów. – Welbog

+0

Ważona mediana: najpierw posortuj według median, następnie według średniej. Ogólna liczba głosów poprawia wiarygodność (poziom pewności) wyniku, ale nie mówi nic o samym wyniku. – richardtallent

0

Oczywiście, niska liczba ocen stawia ten problem w statystycznym utrudnieniu. Nigdy nie mniej ...

Kluczowym elementem poprawiającym jakość ratingu agregatu jest "ocena wskaźnika", tj. Utrzymanie zakładek ocen poszczególnych dostarczonych "raterów" (w stosunku do innych). Pozwala to na ważenie głosów podczas procesu agregacji.

Innym rozwiązaniem, bardziej wymagającym, jest dostarczenie użytkownikom końcowym liczby (lub ich zakresu) głosów za przedmiot leżący u podstaw.

-1

Gorąco polecam książkę Programowanie inteligencji zbiorowej autorstwa Toby Segaran (OReilly) ISBN 978-0-596-52932-1, która omawia sposób wydobywania znaczących danych z zachowania tłumu. Przykłady są w języku Python, ale można je łatwo przekonwertować.

+1

Mimo że mogę polecić tę książkę wszystkim, którzy są zainteresowani tą dziedziną, twoja odpowiedź nie zapewnia rozwiązania zadawanego pytania. –

6

Cóż, w zależności od tego, jak skomplikowane chcesz je uzyskać, możesz mieć oceny dodatkowo ważone na podstawie liczby ocen dokonanych przez daną osobę i ich oceny.Jeśli dana osoba dokonała tylko jednej oceny, może to być ocena szylinga i może liczyć mniej. Lub jeśli osoba oceniła wiele rzeczy w kategorii a, ale niewiele w kategorii b, i ma średnią ocenę 1,3 na 5 gwiazdek, to brzmi jak kategoria a może być sztucznie obciążona przez niski średni wynik tego użytkownika, i należy dostosować.

Ale wystarczająco dużo, aby było skomplikowane. Zróbmy to proste.

Zakładając, że pracujemy z tylko dwiema wartościami, ReviewCount i AverageRating, dla konkretnego przedmiotu, byłoby dla mnie ważne, aby wyglądać ReviewCount jako zasadniczo będącego wartością "niezawodności". Ale nie chcemy po prostu obniżać wyników w przypadku niskich pozycji ReviewCount: pojedyncza jednolita ocena jest prawdopodobnie tak niewiarygodna jak pojedyncza 5-gwiazdkowa ocena. To, co chcemy zrobić, to prawdopodobnie średnia do środka: 3.

Tak więc, w zasadzie myślę o równaniu czymś takim jak X * AverageRating + Y * 3 = the-rating-we-want. Aby ta wartość wypadła poprawnie, potrzebujemy X + Y do równej 1. Również potrzebujemy X, aby zwiększyć wartość, gdy liczba ReviewCount rośnie ... z liczbą sprawdzającą 0, x powinno wynosić 0 (dając nam równanie " 3 "), a przy nieskończonej liczbie sprawdzeń X powinno wynosić 1 (co czyni równanie = AverageRating).

Więc czym są równania X i Y? Dla równania X chcemy, aby zmienna zależna asymptotycznie zbliżyła się do 1, jako że zmienna niezależna zbliża się do nieskończoności. Dobry zestaw równań to coś takiego: Y = 1/(współczynnik^RatingCount) i (wykorzystując fakt, że X musi być równe 1-Y) X = 1 - (1/(współczynnik^RatingCount)

.

Wtedy możemy dostosować „czynnik”, aby dopasować zakres, że szukamy

użyłem tego prostego C# program, aby wypróbować kilka czynników:

 // 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(); 

Więc nie przeszkadza kopiowanie to daje wynik:

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 

Coś takiego? Oczywiście można dostosować wartość współczynnika, aby uzyskać żądaną wagę.

16

Możesz zajrzeć na tę stronę, aby uzyskać dobrą analizę dla Star Rating:

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

I można spojrzeć na tę stronę, aby uzyskać dobrą analizę do góry i na dół głosowania:

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

Do głosowania w górę i w dół chcesz oszacować prawdopodobieństwo, że biorąc pod uwagę posiadane oceny, "rzeczywisty" wynik (jeśli miałeś nieskończoną liczbę ocen) jest większy niż pewna ilość (np. ar numer dla innego przedmiotu, który sortujesz przeciwko.)

Zobacz drugi artykuł odpowiedzi, ale wniosek jest taki, że chcesz użyć zaufania Wilsona. Artykuł podaje równanie i przykładowy kod Ruby (z łatwością przetłumaczony na inny język).

+4

Interwały ufności Wilsona działają tylko dla dwumianowych rozkładów (np. + 1/-1 stylów ocen); nie jest jasne, jakie podejście zastosować w przypadku czegoś w rodzaju 5-gwiazdkowego schematu oceny. – Alec

+0

Oto jego artykuł na temat systemów gwiazdek: http://www.evanmiller.org/ranking-items-with-star-ratings.html –

3

Jeśli wystarczy szybki i tanie rozwiązanie, które będzie przede wszystkim pracować bez użycia dużo obliczeń oto jedna opcja (zakładając, że ocena skali 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 

Dodając w 25 i podzielenie przez łączna ocena + 20 w zasadzie dodajesz 10 najgorszych wyników i 10 najlepszych wyników do łącznej oceny, a następnie odpowiednio sortujesz.

To ma znane problemy. Na przykład nieuczciwie nagradza niskoprocentowe produkty z niewielką liczbą ocen (jak pokazuje this graph, produkty o średniej punktacji 1 i tylko jednej ocenie ratingowej 1,2, a produkty o średniej ocenie 1 i 1k + oceny bliżej 1,05). Można również argumentować, że niesprawiedliwie karze produkty o wysokiej jakości z niewielką liczbą ocen.

Ten wykres pokazuje, co dzieje się na wszystkich ocen: 5 na ocenie 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

Można zobaczyć kąpieli w górę na samym dole rankingu, ale ogólnie jest to fair ranking, myślę. Można też spojrzeć na to w ten sposób:

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

Jeśli upuścisz kulkę w większości miejsc w tym wykresie, zostanie ona automatycznie toczyć w kierunku produktów zarówno z wyższymi wynikami i wyższe oceny.

0

Jedną z opcji jest coś w rodzaju systemu TrueSkill firmy Microsoft, w którym wynik jest podany przez mean - 3*stddev, gdzie można modyfikować stałe.

7

Evan Miller shows Bayesa podejście do rankingu ocen 5-STAR: enter image description here

gdzie

  • nk jest liczba k ocen -STAR,
  • sk jest "wart" (w punktach) z k gwiazd,
  • N to łączna liczba głosów
  • K to maksymalna liczba gwiazdek (np. K = 5, w systemie 5 gwiazdek)
  • z_alpha/2 jest kwantylem 1 - alpha/2 o rozkładzie normalnym. Jeśli chcesz uzyskać 95% pewności (w oparciu o Bayesian posterior distribution), że faktyczne kryterium sortowania jest co najmniej tak duże jak kryterium sortowania, wybierz z_alpha/2 = 1,65.

W Pythonie kryterium sortowania można obliczyć

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)) 

Na przykład, jeśli element ma 60 pięć-gwiazdy 80 czterema gwiazdy 75 trzy gwiazdy 20 dwie gwiazdki i 25 jednogwiazdkowych, wtedy jego ogólna ocena będzie wynosić około 3.4:

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

i można sortować listę ocenie 5-gwiazdkowego

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)] 

To pokazuje wpływ, jaki może mieć więcej ocen od ogólnej wartości gwiazdy.


Przekonasz się, że formuła ta ma tendencję, aby dać ogólną ocenę, która jest nieco niższa niż ocena zgłoszonych przez strony, takich jak Amazon, Ebay czy Wal-Mart szczególnie gdy istnieje kilka głosów (powiedzmy mniej niż 300). Odzwierciedla to większą niepewność, która wiąże się z mniejszą liczbą głosów. Wraz ze wzrostem liczby głosów (w tysiącach), wszystkie te formuły oceny powinny mieć tendencję do średniego ratingu (ważonej).


Ponieważ formuła zależy tylko od rozkładu częstotliwości oceny 5-gwiazdkowe dla samej pozycji, to jest łatwe do połączyć opinie z wielu źródeł (lub, aktualizacji ogólna ocena w świetle nowych głosów), po prostu dodając razem rozkłady częstotliwości .


przeciwieństwie do wzoru IMDb, formuła ta nie zależy od średniej oceny wszystkich elementów, ani sztucznym minimalnej liczby głosów wartości odcięcia.

Co więcej, ta formuła wykorzystuje pełny rozkład częstotliwości - nie tylko średnią liczbę gwiazdek i liczbę głosów. Ma to sens, ponieważ powinien on być traktowany jako element o dziesięciu 5 gwiazdach i dziesięciu gwiazdkach jako mający więcej niepewności niż (i dlatego nie ma tak wysokiej oceny jak) pozycji z dwudziestoma 3-gwiazdkowymi ocenami:

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

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

Formuła IMDb nie bierze tego pod uwagę.

Powiązane problemy