-->

什么是更好的方式通过一个5星评级排序?(What is a better way to sort b

2019-07-17 17:41发布

我想排序使用5星系统的客户评级一堆产品。 我设置此功能的网站并没有很多的收视率,并不断增加新产品,它通常有几个产品数量较少的收视率。

我尝试使用的平均星级评分,但是当有评级的少数算法失败。

例如具有3个5星评级将出现较有100个的5星级和2级2星级评定产品更好的产品。

如果不是第二个产品显示更高,因为它是因为收视率的较大数量的统计上更值得信赖?

Answer 1:

此前2015年,互联网电影数据库(IMDB)上市用来排名的公式250强的电影名单。 报价:

计算评分最高250个标题的公式给出了真实的贝叶斯估计

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

哪里:

  • R =平均为电影(平均值)
  • V =票数的电影
  • 中m为顶部250(25000目前)中列出所需的最低票
  • C =在整个报告中的平均选票(目前7.0)

对于250强,从普通选民的投票只考虑。

这不是很难理解。 的公式为:

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

这可以在数学上简化为:

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

的变量是:

  • 的R - 该项目本身的评级。 R为项目的票平均水平。 (例如,如果一个项没有票,它的R为0。如果有人给它分,R变得5.如果他人赋予其1星,R为3,平均[1, 5]等上。)
  • c - 接收平均项的评级。 查找每一个项目中的R在数据库中,包括目前的一个,并把他们的平均值; 即C.(假设有在数据库4项,以及它们的评级是[2, 3, 5, 5] 。C为3.75,这些数的平均值。)
  • N - 票的项目数。 (给定的另一个例子,如果5人上的项目投票,v为5)
  • 米 - 可调谐的参数。 施加到等级“平滑”的量是基于相对于米票(V)的数量。 调整米,直到结果令你满意。 不要误解m的IMDB的描述为“上市所需的最低票数” - 这个系统是完全能够以小于m票数居项目。

所有的配方也是:计算平均之前添加米假想票,各为C的值,。 在一开始,当没有足够的数据(即票的数量是小于m显着更小),这将导致与平均数据被填充在空白。 然而,随着票的积累,最终虚选票将被以假乱真淹没。

在这个系统中,票不会导致评级大起大落。 相反,他们只是干扰它在某些方向的位。

当有零票,只存在虚票,和所有的人都℃。因此,每一个项目开始评级℃。

也可以看看:

  • 一个演示 。 点击“解决”。
  • 另一种解释 IMDB的系统。
  • 一种解释类似的贝叶斯星级评定制度。


Answer 2:

请参见本页面基于星级评定系统的一个很好的分析,以及这一次的upvote- / downvote-基础的系统的一个很好的分析。

对于上下投票想估计,鉴于你有收视率的概率,“真正的”得分(如果你有无限的收视率)比一些数量较大的(比如说,对于一些其他项目类似号码你”重新排序反对)。

请参阅答案的第二篇文章,但得出的结论是,你要使用的威尔逊的信心。 文章给出的方程和样品Ruby代码(方便地翻译成另一种语言)。



Answer 3:

埃文·米勒表示贝叶斯方法来排名的5星评级:

哪里

  • nk是数量k -star评分,
  • sk是的“身价”(以点为单位) k明星,
  • N是票的总数
  • K是分的最大数量(例如,K = 5,在一个5星级评级系统)
  • z_alpha/21 - alpha/2的正态分布的位数。 如果你想95%的置信度(基于贝叶斯后验分布),实际的排序标准是至少一样大的计算排序标准,选择z_alpha/2 = 1.65。

在Python中,排序标准可以与计算

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

例如,如果一个项目有60五颗星,80四星级,75三星级,20两星和25一星,那么它的总体星级评价将是约3.4:

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

你可以排序的5星级评级与列表

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

这表明更多的收视率可以在整体的明星价值的影响。


你会发现,这个公式往往给总评比由网站如亚马逊,eBay和沃尔玛特别是当有几票(比如,小于300)报告的总体评价低一点。 这反映了带有更少的票数较高的非确定。 由于票的数量增加(入千)所有这些总体评价公式应倾向于(加权)平均评级。


由于公式只依赖于对项目本身的5星评级的频率分布,很容易从多个来源的评论相结合 (或更新的新票光的总体评价)通过简单地将频率分布在一起。


不像IMDB公式,这个公式并不依赖于所有项目的平均分,也没有投票截止值的人工最小数量。

此外,这个公式利用全频率分布的 - 不只是恒星的平均数量和投票数。 它是有道理的,它应该因为十5分和10个1星的项目应具有比更多的不确定性(因此不评为高度为)具有二十三星级评级的项目进行处理:

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

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

IMDB的公式没有考虑到这一点。



Answer 4:

您可以通过排序中位数 ,而不是算术平均值。 在这种情况下这两个例子具有5的中值,因此两者将具有相同重量的排序算法。

你可以使用一个模式,达到同样的效果,但中间可能是一个更好的主意。

如果你想额外的重量分配到100 5星评级的产品,你可能会想要去与某种加权方式,以相同的位数,但更多的总得票数分配更多的权重评级。



Answer 5:

嗯,这取决于你想多么复杂,使之,你可以有收视率基础上的人有多少收视率做出另外进行加权,以及这些评级是。 如果对方只做了一个等级,它可能是一个抬价的评级,并可能算少。 或者,如果该人已评为A类的很多事情,但B类少,具有平均等级为1.3,满分5星,这听起来像A类可通过该用户的低平均得分被人为打压下来,应进行调整。

但足以使其复杂的。 让我们简单。

假设我们只有两个值,ReviewCount和AverageRating工作,对于一个特定的项目,它将使意义,我看ReviewCount本质上是作为“可靠性”的价值。 但是,我们不只是希望把分数下来低ReviewCount项目:一个一星评级是可能作为一个单一的5星评级是不可靠的。 所以我们想要做的可能是对中央的平均:3。

所以,基本上,我想的方程类似X * AverageRating + Y * 3 =评级,我们想学。 为了使这个数值出来的权利,我们需要X + Y等于1,我们还需要X来增加价值为ReviewCount增加......为0的审核数量,则x应为0(给我们的“方程式3” ),并具有无限审查计数X应为1(这使得方程= AverageRating)。

那么什么是X和Y的方程? 对于X方程要因变量渐近地接近1作为独立变量接近无穷大。 一个良好的方程组是这样的:Y = 1 /(因子^ RatingCount)和(利用的事实,X必须是等于1-Y)X = 1 - (1 /(因子^ RatingCount)

然后,我们可以通过调整“因子”,以适应我们正在寻找的范围。

我用这个简单的C#程序试试以下几种因素:

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

所以你不用费心在抄袭它,它给出了这样的输出:

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

类似的东西? 如需要得到一种加权你想要的,你可以明显调整“因子”值。



Answer 6:

如果你只是需要一个快速和廉价的解决方案,而无需使用大量的运算工作大多这里有一个选项(假定为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

通过增加在25和总收视率+ 20除以你基本上添加10场最差的得分和10分最好的成绩,以总收视率,然后相应地排序。

这是否有已知问题。 例如,它不公平地奖励低分产品具有很少的评分(如该曲线图表明,产品具有的1的平均得分和只有一个等级得分1.2而产品的1分1K +的评分的平均得分得分接近1.05)。 你也可以认为这不公平惩罚高品质的产品与几个等级。

此图显示了所有5个等级以上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

你可以看到向上浸在最底层的收视率,但总体而言,它是一个公平的排名,我想。 您还可以看看它是这样的:

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%

如果你在这个图上跌落大多数地方的大理石,它会自动向产品既具有较高的分数和较高的收视率滚动。



Answer 7:

显然,评级低数把这个问题在统计障碍。 从来没有少...

改善的聚合评价的质量的一个关键要素是“评分评估者”,即保留每个特定的“评估者”已提供的收视率(相对于其他人)的标签。 这使得在聚合过程称重他们的选票。

另一种解决方案,更多的是应付出来的,是与标的项目投票的计数(或其范围的指示)供给最终用户。



Answer 8:

一种选择是像微软的trueskill评分系统系统,其中分数由下式给出mean - 3*stddev ,其中常数可以调整。



Answer 9:

看一会儿后,我选择了贝叶斯系统。 如果有人使用Ruby,这里是一个宝石:

https://github.com/wbotelhos/rating



Answer 10:

我强烈建议由托比·西格伦(奥莱利)ISBN 978-0-596-52932-1其中讨论了如何从群体行为中提取有意义的数据本书编程集体智慧。 这些例子是Python,但它很容易转换。



文章来源: What is a better way to sort by a 5 star rating?