Frage

Ich versuche, eine Reihe von Produkten von Kundenbewertungen zu sortieren einem 5-Sterne-System. Die Seite, die ich dieses up habe die Einrichtung für nicht viele Bewertungen hat und weiterhin neue Produkte hinzuzufügen, so dass es in der Regel ein paar Produkte mit einer geringen Anzahl von Bewertungen haben wird.

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

Beispiel ein Produkt, das 3x 5-Sterne-Bewertungen hat, würde zeigen, besser als ein Produkt, das 100x 5-Sterne-Bewertungen und 2x 2-Sterne-Bewertungen hat.

Sollte nicht das zweite Produkt erscheint höher, weil sie wegen der größeren Anzahl der Bewertungen statistisch mehr vertrauenswürdig ist?

War es hilfreich?

Lösung

Vor 2015, das Internet Movie Database (IMDb) aufgeführt öffentlich die Formel verwendet, um ihre Top 250 Liste Filme. Zu zitieren:

  

Die Formel der am besten bewerteten 250 Titel für die Berechnung gibt eine true Bayesian Schätzung :

weighted rating (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C
     

Dabei gilt:

     
      
  • R = Durchschnitt für den Film (arithmetisches Mittel)
  •   
  • v = Anzahl abgegebener Stimmen für den Film
  •   
  • m = Stimmen mindestens benötigt in der Top 250 (derzeit 25.000)
  • aufgeführt werden   
  • C = die Durchschnittsbewertung für den gesamten Bericht (derzeit 7.0)
  •   
     

Für die Top 250, nur die Stimmen von regulären Wähler berücksichtigt werden.

Es ist nicht so schwer zu verstehen. Die Formel lautet:

rating = (v / (v + m)) * R +
         (m / (v + m)) * C;

Welche mathematisch vereinfacht werden kann:

rating = (R * v + C * m) / (v + m);

Die Variablen sind:

  • R - Der eigene Bewertung des Artikels. R ist der Durchschnitt der Stimmen Stück. (Zum Beispiel, wenn ein Element keine Stimmen hat, ist seine R 0. Wenn jemand es 5 Sterne gibt, wird R 5. Wenn jemand anderes es 1 Stern gibt, wird R 3, der Durchschnitt der [1, 5]. Und so weiter.)
  • C - Die Bewertung des durchschnittlichen Artikel. Finden Sie die R jeden einzelnen Artikel in der Datenbank, einschließlich der aktuellen und den Durchschnitt von ihnen; dh C (Angenommen, es gibt 4 Elemente in der Datenbank, und ihre Bewertungen sind [2, 3, 5, 5]. C ist 3,75, der Durchschnitt dieser Zahlen.)
  • v - Die Zahl der Stimmen für einen Artikel. (Um ein anderes Beispiel gegeben, wenn 5 Personen auf ein Element abgegebenen Stimmen haben, v 5).
  • m - Der abstimmbare Parameter. Die Menge der „Glättung“ die Bewertung basiert auf der Anzahl der Stimmen (v) in Bezug auf m richten. Stellen Sie m, bis die Ergebnisse, die Sie erfüllen. Und fehlinterpretieren nicht IMDb Beschreibung von m als „Stimmen mindestens erforderlich aufgelistet werden.“ - dieses System ist durchaus in der Lage Produkte mit weniger Stimmen als m-Ranking

Die ganze Formel tut, ist: m imaginäre Stimmen, die jeweils mit einem Wert von C, vor der Berechnung der durchschnittlichen hinzufügen. Am Anfang, wenn es nicht genügend Daten (das heißt die Anzahl der Stimmen ist dramatisch kleiner als m), dies bewirkt, dass die Rohlinge mit durchschnittlichen Daten ausgefüllt werden. Doch wie Stimmen sammeln, schließlich die imaginären Stimmen werden von realen tönt.

In diesem System Stimmen verursachen nicht die Bewertung wild schwanken. Stattdessen sie es nur stören ein wenig in irgendeiner Richtung.

Wenn es null Stimmen sind nur imaginäre Stimmen existieren, und alle von ihnen sind C. So beginnt jedes Element mit einem Rating von C.

Siehe auch:

Andere Tipps

Siehe diese Seite für eine gute Analyse der Sterne -basierte Ratingsysteme und diese für eine gute Analyse der upvote- / downvote- basierte Systeme.

Für oben und unten stimmen Sie die Wahrscheinlichkeit abschätzen wollen, dass die Ratings gegeben haben Sie, die „echte“ Score (wenn man unendlich Bewertungen hatte) größer ist als eine gewisse Menge (wie etwa die gleiche Zahl für eine andere Artikel, den Sie Sortierung gegen).

Siehe den zweiten Artikel für die Antwort, aber die Schlussfolgerung ist, dass Sie das Wilson Vertrauen verwenden möchten. Der Artikel gibt die Gleichung und Probe Ruby-Code (leicht in einer anderen Sprache übersetzt).

Evan Miller zeigt einen Bayes-Ansatz 5- bis Ranking Sterne-Bewertungen: eingeben Bild Beschreibung hier

Dabei steht

  • nk ist die Anzahl der k-Sterne-Bewertungen,
  • sk ist der "Wert" (in Punkten) von k Sterne,
  • N ist die Gesamtzahl der Stimmen
  • K ist die maximale Anzahl der Sterne (z K = 5, in einem 5-Sterne-Rating-System)
  • z_alpha/2 ist die 1 - alpha/2 Quantil einer Normalverteilung. Wenn Sie 95% wollen (basierend auf der Bayes-posteriori-Verteilung), dass das eigentliche Sortierkriterium mindestens so groß wie das berechnete Sortierkriterium ist, wählt z_alpha/2 = 1,65.

In Python kann das Sortierkriterium mit berechnet werden

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, wenn ein Element 60 Fünf-Stern hat, 80 Vier-Stern, 75 Drei-Stern, 20 Zwei-Sterne und 25 Ein-Stern, dann seine Gesamt Sterne wären etwa 3.4:

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

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

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

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


Sie werden feststellen, dass diese Formel eine Gesamtnote zu geben neigt, die ein bisschen niedriger als die von Websites berichtet Gesamtbewertung wie Amazon, Ebay oder Wal-Mart insbesondere, wenn es nur wenige Stimmen (sagen wir, weniger als 300). Dies spiegelt die höhere uncertainy, die mit weniger Stimmen kommen. Da die Anzahl der Stimmen erhöht (In die Tausende) alle Gesamt diese Bewertung Formeln die dazu neigen, sollten (Gewichtet) durchschnittliche Bewertung.


Da die Formel hängt nur von der Frequenzverteilung von 5-Sterne-Bewertungen für das Element selbst, ist es leicht zu kombinieren Bewertungen aus mehreren Quellen (oder, update die Gesamtbewertung im Lichte neuer Stimmen) durch Zugabe einfach die Frequenz Verteilungen zusammen.


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

Darüber hinaus macht diese Formel Nutzung der vollen Frequenzverteilung - nicht nur die durchschnittliche Anzahl der Sterne und die Zahl der Stimmen. Und es macht Sinn, dass es da ein Element als mit zehn 5-Sterne und zehn 1-Sterne sollten behandelt werden sollten mehr Unsicherheit, die als (und damit bewerten nicht so hoch wie) ein Element 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 findet nicht dies berücksichtigen.

Sie sortieren könnte von Median statt arithmetische Mittel. In diesem Fall haben beide Beispiele einen Median von 5, so würden beide das gleiche Gewicht in einem Sortieralgorithmus haben.

Sie können einen Modus auf den gleichen Effekt verwenden, aber Median ist wahrscheinlich ein bessere Idee.

Wenn Sie zusätzliches Gewicht auf das Produkt mit 100 5-Sterne-Bewertungen zuweisen mögen, werden Sie wahrscheinlich wollen mit irgendeiner Art von gewichteten Modus gehen, mehr Gewicht auf Ratings mit den gleichen Median zuweisen, aber mit insgesamt mehr Stimmen.

Nun, je nachdem, wie komplex Sie es machen wollen, könnten Sie Bewertungen haben zusätzlich auf, wie viele Bewertungen gewichtet werden die Person gemacht hat, und was diese Bewertungen sind. Wenn die Person nur eine Bewertung vorgenommen hat, könnte es ein Lockvogel-Rating, und für weniger zählen könnte. Oder, wenn die Person viele Dinge in der Kategorie ein, aber nur wenige in der Kategorie b, und hat eine durchschnittliche Bewertung von 1,3 von 5 möglichen Sternen bewertet hat, klingt es wie Kategorie eine künstlich durch die niedrige durchschnittliche Punktzahl dieses Benutzers nach unten gewogen werden kann, und sollte eingestellt werden.

Aber genug davon komplex macht. Sagen wir es einfach machen.

Unter der Annahme, wir arbeiten mit nur zwei Werten, und review AverageRating, für ein bestimmtes Element, würde es Sinn für mich review aussehen, als im Wesentlichen der „Zuverlässigkeit“ Wert zu sein. Aber wir wollen nicht nur Noten für niedrigen review Artikel zu Fall bringen: ein einzelner Stern wahrscheinlich als einzige 5 Sterne als unzuverlässig ist. Also, was wir tun wollen, ist wahrscheinlich durchschnittlich zur Mitte: 3.

Also, im Grunde, ich denke an eine Gleichung so etwas wie X * AverageRating + Y * 3 = die Bewertung-wir-wollen. Um diesen Wert kommt richtig zu machen brauchen wir X + Y 1. Auch zu entsprechen brauchen wir X in Wert zu erhöhen, wie review erhöht ... mit einer Überprüfung Zahl von 0, sollte x 0 sein (was uns eine Gleichung „ 3” ), und mit einer unendlichen Bewertung Zahl X sollte 1 (welche die Gleichung = AverageRating) macht.

Also, was sind X und Y Gleichungen? Für die X-Gleichung wollen die abhängige Variable asymptotisch 1 zu nähern als die unabhängige Variable gegen unendlich geht. Ein guter Satz von Gleichungen ist so etwas wie: Y = 1 / (Faktor ^ RatingCount) und (unter Verwendung der Tatsache, dass X gleich sein müssen, um 1-Y) X = 1 - (1 / (Faktor ^ RatingCount)

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

habe ich dieses einfache C # Programm 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();

Damit Sie nicht die Mühe es zu kopieren, es gibt diese Ausgabe:

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 etwas wie das? Man könnte natürlich den „Faktor“ Wert einstellen, wie erforderlich, um die Art der Gewichtung Sie wollen zu bekommen.

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

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

Mit dem in 25 Hinzufügen und Teile durch die Bewertungen insgesamt + 20 Sie im Grunde 10 schlechteste Noten hinzufügen und 10 beste Ergebnisse zu den Bewertungen insgesamt und dann entsprechend zu sortieren.

Dies hat Probleme bekannt. Zum Beispiel, belohnt es unfair Low-Scoring-Produkte mit wenigen Bewertungen (wie 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 können die Dip nach oben zuunterst Bewertungen sehen, aber insgesamt ist es ein gutes Ranking, glaube ich. Sie können es auf diese Weise auch einen Blick:

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 eine Marmor auf den meisten Plätze in diesem Diagramm fallen, wird es automatisch rollen hin zu Produkten mit sowohl höheren Werten und höheren Bewertungen.

Offensichtlich setzt die geringe Anzahl der Bewertungen dieses Problem bei einer statistischen Handicap. Nie weniger ...

Ein Schlüsselelement der Qualität eines Aggregats Bewertung zu verbessern ist es, „die Beurteiler zu Rate“, d.h. Laschen der Bewertungen jeweils bestimmten „Beurteiler“ geliefert (relativ zu anderen) hat, zu halten. Dies ermöglicht es, ihre Stimmen bei der Aggregation Prozesswägetechnik.

Eine andere Lösung, eher ein fertig wird, wird der Endanwender mit einer Zählung (oder einem Bereich Anzeige davon) der Stimmen für das darunter liegende Element zu liefern.

Eine Option ist so etwas wie Microsofts Trueskill-System, in dem die Gäste von mean - 3*stddev gegeben, wobei die Konstanten gezwickt werden kann.

Nach dem Blick für eine Weile, wähle ich das Bayes-System. Wenn jemand mit Ruby, hier ein Juwel für sie:

https://github.com/wbotelhos/rating

Ich würde sehr das Buch Programming Collective Intelligence von Toby Segaran (OReilly) ISBN 978-0-596-52932-1 empfehlen, die beschreiben, wie aussagekräftige Daten aus dem Verhalten der Masse zu extrahieren. Die Beispiele sind in Python, aber es ist leicht genug, um zu konvertieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top