Jaki jest lepszy sposób sortowania według 5 gwiazdek?

Próbuję posortować kilka produktów według ocen klientów za pomocą systemu 5 gwiazdek. Strona, dla której to konfiguruję, nie ma wielu ocen i nadal dodaje nowe produkty, więc zwykle będzie miała kilka produktów z niską liczbą ocen.

Próbowałem użyć średniej oceny gwiazdek, ale ten algorytm zawodzi, gdy jest mała liczba ocen.

Przykład produkt, który ma oceny 3x 5 gwiazdek pokazałby się lepiej niż produkt, który ma oceny 100x 5 gwiazdek i 2x 2 oceny gwiazdkowe.

Czy drugi produkt nie powinien pokazywać się wyżej, bo jest statystycznie bardziej wiarygodny ze względu na większą liczbę ocen?

Author: Mechanical snail, 2009-09-11

10 answers

[[1]}Lista 250 najlepszych filmów IMDB używa oszacowania bayesowskiego . Jest to miły sposób, aby wziąć pod uwagę liczbę wyborców.

From here :

Wzór na obliczenie wierzchołka Ocenione 250 tytułów daje prawdziwy Bayesian ocena:

Ocena ważona (WR) = (v ÷ (v+m)) × R + (M ÷ (v+m)) × 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)

Na Top 250, tylko głosy z uwzględnia się stałych wyborców.

 64
Author: Martin Harris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-11 14:33:29

Możesz spojrzeć na tę stronę, aby uzyskać dobrą analizę dla oceny gwiazdek:

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

I możesz spojrzeć na tę stronę, aby uzyskać dobrą analizę dla głosowania w górę iw dół:

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

W przypadku głosowania w górę iw dół chcesz oszacować prawdopodobieństwo, że biorąc pod uwagę posiadane oceny," prawdziwy " wynik (jeśli miałeś nieskończoną liczbę ocen) jest większy niż pewna ilość (np. podobna liczba dla innego elementu, z którym sortujesz.)

Zobacz drugi artykuł, aby uzyskać odpowiedź, ale wniosek jest taki, że chcesz użyć zaufania Wilsona. W artykule przedstawiono równanie i przykładowy kod Ruby (łatwo przetłumaczony na inny język).

 16
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-22 09:05:59

Evan Miller pokazuje bayesowskie podejście do rankingu 5-gwiazdkowych ocen: Tutaj wpisz opis obrazka

Gdzie

  • nk jest liczbą k-oceny gwiazdek,
  • sk jest "wart" (w punktach) k gwiazdek,
  • N to łączna liczba głosów
  • Jest to maksymalna liczba gwiazdek (np. K=5, w systemie 5 gwiazdek)
  • z_alpha/2 jest 1 - alpha/2 kwantylem rozkładu normalnego. Jeśli chcesz 95% pewności (na podstawie Bayesian posterior distribution), że rzeczywiste kryterium sortowania jest co najmniej tak duże jak obliczone kryterium sortowania, Wybierz z_alpha/2 = 1.65.

W Pythonie kryterium sortowania można obliczyć za pomocą

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 obiekt ma 60 pięciogwiazdkowych, 80 czterogwiazdkowych, 75 trzygwiazdkowych, 20 dwugwiazdkowych i 25 jednogwiazdkowych, to jego ogólna ocena wynosiłaby około 3,4:
x = (60, 80, 75, 20, 25)
starsort(x)
# 3.3686975120774694

I możesz sortować listę 5-gwiazdkowych ocen za pomocą

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 efekt że więcej ocen może mieć na ogólną wartość Gwiazdy.


Przekonasz się, że ta formuła ma tendencję do dawania ogólnej oceny, która jest nieco niższa niż ogólna ocena zgłaszana przez witryny takie jak Amazon, Ebay lub Wal-mart szczególnie, gdy jest niewiele głosów (powiedzmy, mniej niż 300). Odzwierciedla to wyższa niepewność, która przychodzi 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 (ważona) średnia ocena.


Ponieważ wzór zależy tylko od rozkładu częstotliwości ocen pięciogwiazdkowych dla samego artykułu, łatwo jest połączyć opinie z wielu źródeł (lub, update ogólna ocena w świetle nowych głosów) po prostu dodając częstotliwość dystrybucje razem.


W przeciwieństwie do Formuły IMDb, ta formuła nie zależy od średniego wyniku we wszystkich punktach, ani sztuczna minimalna liczba głosów wartość.

Ponadto ten wzór wykorzystuje pełny rozkład częstotliwości - nie tylko średnia Liczba gwiazdek i liczba głosów. I to ma sens, że to powinien ponieważ element z dziesięciu 5-gwiazdek i dziesięć 1-gwiazdek powinny być traktowane jako posiadające większą niepewność niż (a zatem Nie ocenione tak wysoko jak) pozycja z dwadzieścia trzygwiazdkowych ocen:

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ę.

 9
Author: unutbu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-08 23:50:18

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

Przydałby się tryb do tego samego efektu, ale mediana to chyba lepszy pomysł.

Jeśli chcesz przypisać dodatkową wagę do produktu z 100 ocenami 5-gwiazdkowymi, prawdopodobnie będziesz chciał przejść z jakimś trybem ważenia, przypisując większą wagę do ocen z tą samą medianą, ale z większą głosy za:

 7
Author: Welbog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-11 14:29:13

Cóż, w zależności od tego, jak skomplikowane chcesz to zrobić, możesz mieć oceny dodatkowo ważone na podstawie tego, ile ocen dana osoba zrobiła i jakie są te oceny. Jeśli dana osoba zrobiła tylko jedną ocenę, może to być ocena szylkowa i może liczyć na mniej. Lub jeśli dana osoba oceniła wiele rzeczy w kategorii a, ale niewiele w kategorii b i ma średnią ocenę 1.3 na 5 gwiazdek, brzmi to jak kategoria a może być sztucznie obciążona niską średnią oceną tego użytkownika i powinny być dostosowane.

Ale dość skomplikowania tego. Uprośćmy to.

Zakładając, że pracujemy tylko z dwiema wartościami, ReviewCount i AverageRating, dla konkretnego artykułu, sensowne byłoby dla mnie spojrzenie na ReviewCount jako zasadniczo będącą wartością "niezawodności". Ale nie chcemy po prostu obniżać wyników za niskie punkty recenzji: pojedyncza ocena z jedną gwiazdką jest prawdopodobnie tak samo zawodna, jak pojedyncza ocena z 5 gwiazdkami. Więc to, co chcemy zrobić, to prawdopodobnie średnia w kierunku środka: 3.

Więc, w zasadzie, myślę o równaniu coś w rodzaju X * Średnia + Y * 3 = Ocena-chcemy. Aby ta wartość wyszła dobrze, potrzebujemy X + Y równe 1. Potrzebujemy również X, aby zwiększyć wartość wraz ze wzrostem liczby recenzji...z liczbą recenzji równą 0, x powinno wynosić 0 (dając nam równanie "3"), a z nieskończoną liczbą recenzji X powinno wynosić 1(co sprawia, że równanie = uśrednianie).

Czym są równania X I Y? Dla X równanie chce, aby zmienna zależna była asymptotycznie zbliżona do 1, ponieważ zmienna niezależna zbliża się do nieskończoności. Dobry zbiór równań to coś w rodzaju: Y = 1/(współczynnik^RatingCount) oraz (wykorzystując fakt, że X musi być równe 1-Y) X = 1 – (1 / (współczynnik^RatingCount)

Wtedy możemy dostosować "współczynnik" do zakresu, którego szukamy.

Użyłem tego prostego programu C#, 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 zawracaj sobie głowy kopiowaniem, to daje to Wyjście:

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ś w tym stylu? Można oczywiście dostosować wartość "czynnik" w razie potrzeby, aby uzyskać rodzaj ważenia chcesz.
 6
Author: Beska,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-11 16:06:16

Jeśli potrzebujesz szybkiego i taniego rozwiązania, które w większości sprawdzi się bez użycia dużej ilości obliczeń, oto jedna z opcji (przy założeniu skali ocen 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 25 i dzieląc przez całkowitą liczbę ocen + 20, dodajesz 10 najgorszych i 10 najlepszych wyników do łącznej liczby ocen, a następnie odpowiednio sortujesz.

To ma Znane problemy. Na przykład niesprawiedliwie nagradza produkty o niskiej punktacji z niewielką liczbą ocen (jak pokazuje Ten wykres, produkty ze średnią oceną 1 i tylko jedną oceną a 1.2, podczas gdy produkty ze średnią oceną 1 i 1k+ ocena bliżej 1.05). Można również argumentować, że niesprawiedliwie karze produkty wysokiej jakości z kilkoma ocenami.

Ten wykres pokazuje, co dzieje się dla wszystkich 5 ocen powyżej 1-1000 ocen: 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

Widać spadek w górę na samym dole, ale ogólnie to uczciwy ranking. 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 na tym wykresie, automatycznie będzie toczyć się w kierunku produktów z zarówno wyższymi wynikami, jak i wyższymi ocenami.

 3
Author: Jordan Reiter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-12 16:33:08

Oczywiście, niska liczba ocen stawia ten problem w statystycznym handicapie. Ani trochę...

Kluczowym elementem poprawy jakości ratingu zbiorczego jest "rate the rater", tzn. śledzenie ratingów, które dostarczył każdy konkretny rating (w stosunku do innych). Umożliwia to ważenie głosów podczas procesu agregacji.

Innym rozwiązaniem, bardziej jak cope out, jest dostarczenie użytkownikom końcowym liczby (lub wskazania zakresu) głosów dla pozycji bazowej.

 0
Author: mjv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-11 14:34:13

Jedną z opcji jest coś w rodzaju systemu TrueSkill Microsoftu, gdzie wynik jest podawany przez mean - 3*stddev, gdzie stałe mogą być poprawiane.

 0
Author: Yuliy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-12 17:03:48

Po jakimś czasie wybieram System Bayesowski. Jeśli ktoś używa Ruby, oto klejnot do niego:

Https://github.com/wbotelhos/rating

 0
Author: Washington Botelho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-11 22:10:05

Gorąco polecam książkę Programming Collective Intelligence autorstwa Toby Segaran (Oreilly) ISBN 978-0-596-52932-1, która omawia, jak wydobyć znaczące dane z zachowań tłumu. Przykłady są w Pythonie, ale jest wystarczająco łatwy do konwersji.

 -1
Author: Andiih,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-11 15:01:56