2009-09-11 3 views
54

Ich versuche, eine Reihe von Produkten nach Kundenbewertungen mit einem 5-Sterne-System zu sortieren. Die Website, für die ich das eingerichtet habe, hat nicht viele Bewertungen und fügt weiterhin neue Produkte hinzu, so dass es in der Regel einige Produkte mit einer geringen Anzahl von Bewertungen gibt.Was ist eine bessere Möglichkeit, nach einer 5-Sterne-Bewertung zu sortieren?

Ich habe versucht, durchschnittliche Sterne-Rating, aber dieser Algorithmus schlägt fehl, wenn es eine kleine Anzahl von Bewertungen ist.

Beispiel: Ein Produkt mit 3x 5-Sterne-Bewertungen würde besser angezeigt als ein Produkt mit 100x 5-Sterne-Bewertungen und 2x 2-Sterne-Bewertungen.

Sollte das zweite Produkt nicht höher erscheinen, weil es aufgrund der größeren Anzahl von Bewertungen statistisch vertrauenswürdiger ist?

+0

Der richtige Weg, dies zu tun ist, mitteln, und für Gegenstände, die noch nicht gewählt worden ist, hat den Status „nicht gewählt“. Wie hast du es versucht? Wie ist es gescheitert? – David

Antwort

61

Für ihre Top 250 Filme Liste IMDB verwendet eine . Dies ist eine gute Möglichkeit, die Anzahl der Wähler in Betracht zu ziehen.

Von here:

Die Formel, um die Top bewertet 250 Titel zur Berechnung eines wahren Bayesian Schätzung ergibt:

gewichtete Bewertung (WR) = (v ÷ (v + m)) × R + (m ÷ (v + m)) × C

wobei:

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

für die Top 250, nur Stimmen von Stammwähler werden berücksichtigt.

+0

Die Wiki Antworten Artikel zitiert schlägt vor, dass die Formel WR = (v * R + m * C)/(v + m), die eher wahrscheinlicher als C berücksichtigt wird und die Werte, die ich bekomme, scheinen besser. –

+2

Die Formel ist eigentlich die gleiche, Sie müssen die ursprüngliche falsch eingeben als (v/(v + m)) * R + (m/(v + m)) * C ist das gleiche wie (v * R + m * C)/(v + m).Link: http://goo.gl/IW9s1A – ParoX

7

Sie könnten nach median statt arithmetischem Mittelwert sortieren. In diesem Fall haben beide Beispiele einen Median von 5, so dass beide in einem Sortieralgorithmus das gleiche Gewicht haben.

Sie könnten eine mode mit dem gleichen Effekt verwenden, aber Median ist wahrscheinlich eine bessere Idee.

Wenn Sie dem Produkt ein zusätzliches Gewicht mit 100 5-Sterne-Bewertungen zuweisen möchten, möchten Sie wahrscheinlich mit einem gewichteten Modus arbeiten und Bewertungen mit demselben Median, aber mit insgesamt mehr Stimmen, mehr Gewicht zuweisen .

+0

Wenn ich die Median-Methode verwenden würde, wie würdest du feststellen, welche besser bewertet werden sollte 5x 5 Sterne Bewertungen mit 4x 2 Sterne Bewertungen oder 5x 5 Sterne Bewertungen mit 4x 1 Sterne Bewertungen? Beide würden 5 für die Bewertung kommen. – Vizjerai

+0

Das wäre zu diesem Zeitpunkt an dir. Es kommt darauf an, was Sie für überlegen halten. Vielleicht sortieren Sie zuerst nach Median, dann nach Mittelwert. Oder vielleicht zuerst nach Median, dann nach Gesamtzahl der Stimmen. – Welbog

+0

Gewichtet Median: Sortiert nach Median zuerst, dann nach Mittelwert. Die Gesamtzahl der Stimmen verbessert die Zuverlässigkeit (Konfidenzniveau) der Punktzahl, sagt aber nichts über die Punktzahl selbst aus. – richardtallent

0

Offensichtlich stellt die geringe Anzahl der Bewertungen dieses Problem auf ein statistisches Handicap. Nichtsdestoweniger ...

Ein Schlüsselelement zur Verbesserung der Qualität einer Aggregatbewertung ist es, den Bewerter zu bewerten, d. H. Die Bewertungen der einzelnen "Bewerter" zu überwachen (im Vergleich zu anderen). Dies ermöglicht das Abwägen ihrer Stimmen während des Aggregationsprozesses.

Eine andere Lösung, die mehr aus dem Rahmen fällt, besteht darin, den Endbenutzern eine Anzahl (oder eine Bereichsangabe) von Stimmen für den zugrunde liegenden Gegenstand zu liefern.

-1

Ich empfehle das Buch Programming Collective Intelligence von Toby Segaran (OReilly) ISBN 978-0-596-52932-1, die erläutert, wie Sie aussagekräftige Daten aus Crowd-Verhalten extrahieren. Die Beispiele sind in Python, aber es ist einfach genug zu konvertieren.

+1

Obwohl ich dieses Buch jedem empfehlen kann, der sich für dieses Feld interessiert, bietet Ihre Antwort keine Lösung für die gestellte Frage. –

6

Nun, abhängig davon, wie komplex Sie es machen möchten, könnten Sie Bewertungen zusätzlich gewichtet werden basierend darauf, wie viele Bewertungen die Person gemacht hat, und was diese Bewertungen sind.Wenn die Person nur eine Bewertung erstellt hat, kann es sich um eine Shill-Bewertung handeln, die weniger zählen kann. Oder wenn die Person viele Dinge in Kategorie a bewertet hat, aber nur wenige in Kategorie b, und eine durchschnittliche Bewertung von 1,3 von 5 Sternen hat, klingt es wie Kategorie a künstlich durch die niedrige durchschnittliche Punktzahl dieses Benutzers belastet, und sollte eingestellt werden.

Aber genug, um es komplex zu machen. Lass es uns einfach machen.

Angenommen, wir arbeiten mit nur zwei Werten, ReviewCount und AverageRating, für ein bestimmtes Element, würde es Sinn machen, ReviewCount als im Wesentlichen den "Zuverlässigkeitswert" zu sehen. Aber wir wollen nicht nur Punkte für niedrige ReviewCount-Artikel abschreiben: Eine einzelne Ein-Sterne-Bewertung ist wahrscheinlich genauso unzuverlässig wie eine einzelne 5-Sterne-Bewertung. Also, was wir tun wollen, ist wahrscheinlich durchschnittlich in der Mitte: 3.

Also, im Grunde denke ich an eine Gleichung etwas wie X * AverageRating + Y * 3 = the-rating-we-wollen. Um diesen Wert richtig zu machen, müssen X + Y gleich 1 sein. Außerdem brauchen wir X, um den Wert zu erhöhen, wenn ReviewCount steigt ... bei einer Überprüfung von 0 sollte x 0 sein (was uns eine Gleichung von " 3 "), und mit einer unendlichen Überprüfung sollte X 1 sein (was die Gleichung = AverageRating macht).

Was sind also X- und Y-Gleichungen? Für die X-Gleichung möchte die abhängige Variable asymptotisch 1 nähern, wenn sich die unabhängige Variable der Unendlichkeit nähert. Ein guter Satz von Gleichungen ist so etwas wie: Y = 1/(Faktor^RatingCount) und (unter Verwendung der Tatsache, dass X auf 1-Y gleich sein müssen) X = 1 - (1/(Faktor^RatingCount)

.

Dann können wir „Faktor“ stellen Sie den Bereich passen, die wir suchen

benutzte ich dieses einfache Programm C# ein paar Faktoren, um zu versuchen:

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

Kopieren So stören Sie nicht es in, gibt es diesen Ausgang:

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 

So ähnlich? Sie können natürlich den "Faktor" -Wert nach Bedarf anpassen, um die gewünschte Gewichtung zu erhalten.

16

Sie können auf dieser Seite sehen eine gute Analyse für Sterne zu bekommen:

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

Und Sie auf dieser Seite sehen kann eine gute Analyse bekommen für die Abstimmung auf und ab:

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

Für die Abstimmung nach oben und unten möchten Sie die Wahrscheinlichkeit schätzen, dass der "echte" Punktwert (wenn Sie unendliche Bewertungen hatten) größer ist als eine bestimmte Menge (z. B. das Gleichnis) Geben Sie den zweiten Artikel für die Antwort ein, aber die Schlussfolgerung ist, dass Sie das Wilson-Vertrauen verwenden möchten.

Der Artikel gibt die Gleichung und Beispiel Ruby-Code (leicht in eine andere Sprache übersetzt).

+4

Wilson-Konfidenzintervalle funktionieren nur für Binomialverteilungen (z. B. + 1/-1-Bewertungen); Es ist nicht klar, welchen Ansatz man für ein 5-Sterne-Bewertungsschema wählen sollte. – Alec

+0

Hier ist sein Artikel für Sterne-Rating-Systeme: http://www.evanmiller.org/ranking-items-with-star-ratings.html –

3

Wenn Sie nur eine schnelle und billige Lösung, die meist ohne arbeiten hier viele Berechnung unter Verwendung ist eine Option (eine 1-5 Rating-Skala unter der Annahme)

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 

Durch in 25 Hinzufügen und Teilen durch die Gesamtbewertungen + 20 Sie fügen der Gesamtbewertung im Durchschnitt 10 schlechteste und 10 beste Bewertungen hinzu und sortieren dann entsprechend.

Dies hat bekannte Probleme. Zum Beispiel belohnt es unfair Produkte mit niedriger Bewertung mit wenigen Bewertungen (wie this graph zeigt, Produkte mit einer durchschnittlichen Punktzahl von 1 und nur eine Bewertung mit einer Punktzahl von 1,2, während Produkte mit einer durchschnittlichen Punktzahl von 1 und 1k + näher bei 1,05 liegen). Man könnte auch argumentieren, dass es qualitativ hochwertige Produkte mit wenigen Bewertungen unfair bestraft.

Diese Grafik zeigt, was für alle 5 Bewertungen über 1-1000 Bewertungen passiert: 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

Sie den Dip nach oben zuunterst Bewertungen sehen können, aber insgesamt ist es ein gutes Ranking, glaube ich. Sie können auch es auf diese Weise aussehen:

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

Wenn Sie einen Marmor an den meisten Orten in diesem Diagramm fallen, wird es automatisch rollen hin zu Produkten mit sowohl höheren Werten und höheren Bewertungen.

0

Eine Option ist etwas wie das TrueSkill-System von Microsoft, bei dem die Bewertung durch mean - 3*stddev erfolgt, wo die Konstanten optimiert werden können.

7

Evan Miller shows ein Bayes-Ansatz 5-Sterne-Bewertungen auf Rang: enter image description here

wo

  • nk die Anzahl der k-Sterne Ratings ist,
  • sk ist der "Wert" (in Punkten) von k Sterne,
  • N ist die Gesamtzahl der Stimmen
  • K ist die maximale Anzahl von Sternen (z.B. K = 5, in einem 5-Sterne-Bewertungssystem)
  • z_alpha/2 ist das 1 - alpha/2 Quantil einer Normalverteilung. Wenn Sie eine Wahrscheinlichkeit von 95% (basierend auf der Bayesschen Posterior-Verteilung) haben möchten, dass das tatsächliche Sortierkriterium mindestens so groß wie das berechnete Sortierkriterium ist, wählen Sie z_alpha/2 = 1.65.

In Python, das Sortierkriterium kann mit

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

Zum Beispiel berechnet werden, wenn ein Artikel 60 Fünf-Stern hat, 80 Vier-Stern, 75 Drei-Stern, 20 Zwei-Sterne und 25 Ein-Sterne, dann würde seine Gesamtsternbewertung ungefähr 3 sein.4:

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

und Sie können eine Liste mit 5-Sterne-Bewertungen mit

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

dieser Art zeigt die Wirkung, die mehr Bewertungen auf den Gesamt Stern Wert haben kann.


Sie finden, dass diese Formel eine Gesamtnote zu geben neigt, die ein bisschen niedriger als die durchschnittliche Bewertung von Websites wie Amazon, Ebay oder Wal-Mart besonders gemeldet ist, wenn es wenige Stimmen (sagen wir, weniger als 300). Dies spiegelt die höhere Unsicherheit wider, die mit weniger Stimmen einhergeht. Da die Anzahl der Stimmen (in die Tausende) insgesamt steigt, sollten diese Rating-Formeln zum (gewichteten) durchschnittlichen Rating neigen.


Da die Formel hängt nur von der Frequenzverteilung von 5-Sterne-Bewertungen für das Element selbst, ist es leicht zu Bewertungen aus mehreren Quellen kombinieren (oder Update die Gesamtbewertung in Licht der neuen Stimmen), indem einfach die Häufigkeit Verteilungen zusammen addiert werden.


Im Gegensatz zu der IMDb Formel Diese Formel hängt nicht von Durschnitt über alle Artikel, noch eine künstliche Mindestanzahl von Cutoff-Wert Stimmen.

Darüber hinaus nutzt diese Formel die volle Häufigkeitsverteilung - nicht nur die durchschnittliche Anzahl der Sterne und die Anzahl der Stimmen. Und es macht Sinn, dass es sollte seit einem Artikel mit zehn 5-Sterne und zehn 1-Sterne als mit mehr Unsicherheit als behandelt werden soll (und daher nicht so hoch wie bewertet) ein Artikel mit zwanzig 3-Sterne-Bewertungen:

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

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

Die IMDb-Formel berücksichtigt dies nicht.

Verwandte Themen