Quelle est la meilleure façon de sortinger par 5 écanvass?

J’essaie de sortinger un tas de produits en fonction des évaluations des clients en utilisant un système 5 écanvass. Le site pour lequel je mets en place n’a pas beaucoup d’évaluations et continue à append de nouveaux produits, de sorte qu’il aura généralement quelques produits avec un faible nombre de notes.

J’ai essayé d’utiliser le nombre moyen d’écanvass, mais cet algorithme échoue lorsqu’il y a un petit nombre d’évaluations.

Exemple: un produit avec 3x 5 écanvass apparaît mieux qu’un produit 100x 5 écanvass et 2x 2 écanvass.

Le deuxième produit ne devrait-il pas apparaître plus haut, car il est statistiquement plus fiable en raison du plus grand nombre d’évaluations?

Pour leur liste des 250 meilleurs films, IMDB utilise une estimation bayésienne . C’est un bon moyen de prendre en compte le nombre d’électeurs.

De là :

La formule de calcul des 250 meilleurs titres donne une estimation bayésienne vraie:

évaluation pondérée (WR) = (v ÷ (v + m)) × R + (m ÷ (v + m)) × C

où:

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

pour le Top 250, seuls les votes des électeurs réguliers sont pris en compte.

Vous pouvez consulter cette page pour obtenir une bonne parsing du nombre d’écanvass:

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

Et vous pouvez consulter cette page pour obtenir une bonne parsing du vote ascendant et descendant:

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

Pour le vote haut et bas, vous voulez estimer la probabilité que, compte tenu des notes que vous avez, le “vrai” score (si vous avez des notes infinies) est supérieur à une certaine quantité (comme, par exemple, un nombre similaire sortinger contre.)

Voir le deuxième article pour la réponse, mais la conclusion est que vous voulez utiliser la confiance de Wilson. L’article donne l’équation et l’exemple de code Ruby (facilement traduit dans une autre langue).

Evan Miller montre une approche bayésienne du classement 5 écanvass: entrer la description de l'image ici

  • nk est le nombre de cotes k star,
  • sk est la “valeur” (en points) de k écanvass,
  • N est le nombre total de votes
  • K est le nombre maximum d’écanvass (par exemple K = 5, dans un système de notation à 5 écanvass)
  • z_alpha/2 est le quantile 1 - alpha/2 d’une dissortingbution normale. Si vous voulez une confiance à 95% (basée sur la dissortingbution postérieure bayésienne) que le critère de sorting réel est au moins aussi grand que le critère de sorting calculé, choisissez z_alpha/2 = 1,65.

En Python, le critère de sorting peut être calculé avec

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

Par exemple, si un object a 60 cinq écanvass, 80 quatre écanvass, 75 trois écanvass, 20 deux écanvass et 25 une écanvas, sa cote globale serait d’environ 3,4:

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

et vous pouvez sortinger une liste de cotes 5 écanvass avec

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

Cela montre l’effet que plus de notes peuvent avoir sur la valeur globale de l’écanvas.


Vous constaterez que cette formule tend à donner une note globale un peu inférieure à la note globale rapscope par des sites tels que Amazon, Ebay ou Wal-Mart, en particulier quand il y a peu de votes (disons moins de 300). Cela reflète l’incertitude plus élevée qui se produit avec moins de votes. À mesure que le nombre de votes augmente (en milliers), globalement, ces formules de notation devraient avoir la moyenne (pondérée).


Étant donné que la formule ne dépend que de la dissortingbution de fréquence des cotes 5 écanvass pour l’élément lui-même, il est facile de combiner des avis provenant de plusieurs sources (ou de mettre à jour l’évaluation globale en fonction des nouveaux votes).


Contrairement à la formule IMDb, cette formule ne dépend pas du score moyen de tous les éléments, ni d’un nombre minimal de votes artificiel.

De plus, cette formule utilise la dissortingbution de fréquence complète – pas seulement le nombre moyen d’écanvass et le nombre de votes. Et il est logique qu’un article avec dix 5 écanvass et dix écanvass 1 soit considéré comme ayant plus d’incertitude que (et donc pas considéré comme hautement) un article avec vingt trois écanvass:

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

La formule IMDb ne prend pas cela en compte.

Vous pouvez sortinger par médiane au lieu de la moyenne arithmétique. Dans ce cas, les deux exemples ont une médiane de 5, de sorte que les deux auraient le même poids dans un algorithme de sorting.

Vous pouvez utiliser un mode pour le même effet, mais la médiane est probablement une meilleure idée.

Si vous voulez atsortingbuer un poids supplémentaire au produit avec 100 cotes 5 écanvass, vous voudrez probablement utiliser un mode pondéré, en atsortingbuant plus de poids aux cotes avec la même médiane, mais avec plus de votes globaux.

Eh bien, en fonction de la complexité que vous souhaitez en tirer, vous pouvez également pondérer les notations en fonction du nombre de notations que la personne a obtenues et de leurs notations. Si la personne n’a fait qu’une seule évaluation, cela pourrait être une note de shill et pourrait compter pour moins. Ou si la personne a noté beaucoup de choses dans la catégorie a, mais peu dans la catégorie b, et a une note moyenne de 1,3 écanvass sur 5, cela ressemble à la catégorie a peut être artificiellement alourdie par le faible score moyen de cet utilisateur. devrait être ajusté.

Mais assez de le rendre complexe. Rendons les choses simples.

En supposant que nous travaillions avec seulement deux valeurs, ReviewCount et AverageRating, pour un élément particulier, il serait logique de considérer ReviewCount comme étant essentiellement la valeur de «fiabilité». Mais nous ne voulons pas seulement réduire les scores pour les articles faibles de ReviewCount: une seule écanvas est probablement aussi peu fiable qu’une simple note de 5 écanvass. Donc, ce que nous voulons faire est probablement moyen vers le milieu: 3.

Donc, en gros, je pense à une équation comme X * AverageRating + Y * 3 = the-rating-we-want. Pour que cette valeur ressorte correctement, nous avons besoin que X + Y soit égal à 1. Nous devons également augmenter la valeur de X lorsque ReviewCount augmente … avec un compte de révision de 0, x devrait être 0 (nous obtenons une équation de ” 3 ”), et avec une revue infinie, le nombre X devrait être 1 (ce qui fait l’équation = AverageRating).

Alors, quelles sont les équations X et Y? Pour que l’équation X veuille que la variable dépendante approche asymptotiquement 1 lorsque la variable indépendante se rapproche de l’infini. Un bon ensemble d’équations est quelque chose comme: Y = 1 / (facteur ^ RatingCount) et (en utilisant le fait que X doit être égal à 1-Y) X = 1 – (1 / (facteur ^ RatingCount)

Ensuite, nous pouvons ajuster le “facteur” pour l’adapter à la gamme que nous recherchons.

J’ai utilisé ce programme simple en C # pour essayer quelques facteurs:

  // 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(Ssortingng.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}", RatingAverage1, RatingCount1, modRating1)); Console.WriteLine(Ssortingng.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}", RatingAverage2, RatingCount2, modRating2)); Console.WriteLine(Ssortingng.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}", RatingAverage3, RatingCount3, modRating3)); // Hold up for the user to read the data. Console.ReadLine(); 

Donc, vous ne prenez pas la peine de le copier, cela donne cette sortie:

 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 

Quelque chose comme ca? Vous pouvez évidemment ajuster la valeur du “facteur” pour obtenir le type de pondération souhaité.

Si vous avez juste besoin d’une solution rapide et peu coûteuse qui fonctionnera principalement sans utiliser beaucoup de calcul, voici une option (en supposant une échelle d’évaluation de 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 

En ajoutant 25 et en divisant par le total des notes + 20, vous ajoutez en fait 10 scores les plus mauvais et 10 meilleurs scores aux notes totales, puis vous sortingez en conséquence.

Cela a des problèmes connus. Par exemple, il récompense injustement des produits peu cotés avec peu de notations (comme le montre ce graphique , les produits avec un score moyen de 1 et un seul avec un score de 1,2 et des produits avec un score moyen de 1 et 1k +). Vous pourriez également faire valoir qu’il punit injustement les produits de haute qualité avec peu d’évaluations.

Ce graphique montre ce qui se passe pour les 5 évaluations de 1 à 1 000 évaluations: 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

Vous pouvez voir la tendance à la hausse dans les notes les plus basses, mais dans l’ensemble, c’est un classement juste, je pense. Vous pouvez également le regarder de cette façon:

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

Si vous déposez une bille sur la plupart des emplacements de ce graphique, elle sera automatiquement transférée vers des produits présentant à la fois des scores plus élevés et des classements plus élevés.

De toute évidence, le faible nombre de notations pose ce problème à un handicap statistique. Néanmoins…

Un élément clé pour améliorer la qualité d’une note globale est de «noter l’évaluateur», c’est-à-dire de garder une trace des notes fournies par chaque «évaluateur» (par rapport aux autres). Cela permet de peser leurs votes pendant le processus d’agrégation.

Une autre solution consiste à fournir aux utilisateurs finaux un décompte (ou une indication de distance) des votes pour l’élément sous-jacent.

Une option est quelque chose comme le système TrueSkill de Microsoft, où le score est donné par mean - 3*stddev , où les constantes peuvent être modifiées.

Après avoir regardé pendant un moment, j’ai choisi le système bayésien. Si quelqu’un utilise Ruby, voici un bijou:

https://github.com/wbotelhos/rating

Je recommande fortement le livre Programming Collective Intelligence de Toby Segaran (OReilly) ISBN 978-0-596-52932-1 qui explique comment extraire des données significatives du comportement de la foule. Les exemples sont en Python, mais c’est assez facile à convertir.