餐厅评级的反偏算法
anti-bias algorithm for rating a resturant
我正在开发一个餐厅应用程序,用户可以在逻辑上对餐厅进行评分,例如 10 人的评分公式如下:
用户可以从 1 到 5 评分
9 人评价 5
1 人评价 1
等式是((9 * 5)+(1 * 1))/ 10(人的总和)= 46/10 = 4.6
答案是 4.6,这是不公平的,因为 1 个人的低比率使结果下降到 4.6 在我看来结果应该是 4.9 我搜索并发现了一个叫做算法偏差的东西我不太明白,zomato 应用程序公司找到了解决方案对于这种情况,喜欢在低评级和虚假评级中保持公平
谁能帮我算出一个公平的方程式或算法
4.6是公平的,4.9是有偏见的。
从(非常)少的观测值中估计随机过程的未知参数(均值、方差等)的问题是一个非常困难的问题,已被深入研究。
此处目前使用术语偏差,但不应与概率偏差(随机过程的数学平均值与估计的数学平均值之间的差异)混淆。这里想要最小化的是误差本身,更准确地说是想要避免大的误差。在这种情况下,由于选民人数较少,一次简单的投票就可以有效地偏差估计。
另一个困难是我不相信符号的平均值是一个很好的标准。比率的直方图 (90% -> 5, 10% -> 1) 更有趣并提供更多信息。然而,这样的直方图不允许简单的排序...
我不是这个具体问题的专家,我只知道一种简单常用的方法:抑制较低和较高的值。然而,在提议的场景中,我们得到了 5 的排名,这远非完美。
我能想到的另一种方法是先进行粗略估计,然后对与第一次平均值相差太远的值进行权重较低的新平均。
但是,任何提议的方法都应该推导和检查from/with足够的数据:收集大量选票,推导对一家餐厅的准确估计,然后尝试获得与任何低的大致相同的结果从该数据库中提取的投票数。 最佳 算法取决于过程的概率法则,我不知道。
一种可能的解决方案是对投票给特定评级的人数求平方。通过将每个评级乘以平方来计算加权平均值。然后除以平方和,向下取整。这将使评级接近大多数人选择的值。
例如当收视率是
5 stars from 9 people
1 star from 1 person
那么计算就是
(5*(9*9) + 1*(1*1)) / ((9*9) + (1*1)) = 4.9
如果你有这样的分布
5 stars from 4 people
4 stars from 8 people
3 start from 11 people
2 stars from 6 people
1 star from 3 people
那么计算就是
(5*16 + 4*64 + 3*121 + 2*36 + 1*9) / (16+64+121+36+9) = 3.1
您也可以尝试不同的加权公式。例如,您可以使用 n * sqrt(n)
.
而不是 n * n
算法偏差
这个问题绝非微不足道。事实上根本无法解决。至少不是你认为的数学方式。我将首先尝试通过几个示例来解释算法偏差:
亚马逊训练了人工智能来做出招聘决定。一段时间后,他们意识到人工智能更喜欢男性而不是女性申请人,因为这种偏见也出现在训练数据集中。在这种情况下,判断 AI 是否有不公平的偏见是相当微不足道的。
假设我设置了另一个 AI,它也可以决定邀请哪些申请人参加面试。现在我从亚马逊那里学到了,通过简单地删除性别、姓名或种族等细节来避免 gender-bias。不,我的 AI 既不能是种族主义者,也不能是性别歧视者,所以它应该是公平的,对吧?好吧,我的 AI 了解到最好雇用 30 岁左右的求职者,因为他们有 state-of-the-art 技术经验并且对这个行业并不陌生。这对公司来说是理想的(可能至少——我会忽略那个细节,只是为了简单起见而假设它)。但是现在我们忽略了新人和超过一定年龄的人。这公平吗?越来越模糊了
之前描述的 AI 因不公平而被驳回,现在我还确保新 AI 忽略了年龄。它现在将以对待 30 岁和比 30 岁以上的人相同的方式对待新人。所以现在很公平,对吧?但现在它不太关心申请人的经验,会给那些没有头绪的人和已经投入时间和金钱来获得经验的人同样的机会。那么公平吗?好吧,我很难回答这个问题
或者最后但同样重要的是:对这个问题的评论已经表明定义什么是(不)公平是多么棘手。对于剩下的问题,我假设你提出的 rating-scheme 是公平的。
修改评级评估的可能方法
有很多方法可以用来编译评级。我只会展示两个简单的选项来实现你想要的,尽管确实有很多方法可以用一点创意来打乱数字。
中位数是一种很好的统计工具,可以消除由评级中的一些异常值引起的偏差。通常中位数计算为排序列表中间的值 - 或者如果评级数甚至是两个中间值的平均值。
def median(arr):
if len(arr) % 2 == 1:
return sorted(arr)[len(arr) // 2]
else:
i = len(arr) // 2
return sum(sorted(arr)[i - 1 : i + 1]) / 2
对于您的示例,有 9 个 5 星评级和 1 个 1 星评级,结果将是 5。这公平吗?可能不会,因为这将以相同的方式处理任何不等于中位数的评级。 IE。对于以上 user-rating 最后一个用户给一颗星还是四颗星都没有关系。另一方面,该统计数据对于具有极端异常值的偏斜数据非常稳健。所以无论如何它都不是正确的工具。
结合中位数和算术平均值
这个结果更接近您的预期 - 4.8。我们不再完全忽略异常值,但我们赋予它们的权重要小得多。所以总的来说,这个评级对最普遍的意见有很大的偏见,但并没有像以前那样给予它那么多的价值。
甚至可以添加中位数和平均值的权重来调整异常值的权重:
def weighted_rating(arr, w):
arithm = sum(arr) / len(arr)
m = median(arr)
return m * w + arithm * (1 - w)
在上面的代码中,w
应该介于 0(仅算术平均值)和 1(仅中值)之间。对于 w = 0.75
,评级为 4.9。因此,为了达到这样的评级,中位数的权重是平均值的两倍。
编辑:
以更公平的方式对待离群值的一个很好的实用方法是 。我的回答主要是为了展示 "fair" 统计数据的复杂性,而不是提供任何实际算法来计算评分。
问题的根本原因是评级量表是主观的 - 因此受到用户认知偏差的影响。因此,最好的解决方案是采用不同的评级方法,例如 Elo 系统——用户将被要求将他们最近访问过的餐厅与他们之前访问过的餐厅进行比较,从而创建一个真正的餐厅排名顺序(这可以让星级重新定义为五分位数)。本文更详细地讨论了该问题和可能的解决方案:https://www.linkedin.com/pulse/how-build-truly-5-star-user-rating-tobias-baer/
我正在开发一个餐厅应用程序,用户可以在逻辑上对餐厅进行评分,例如 10 人的评分公式如下: 用户可以从 1 到 5 评分 9 人评价 5 1 人评价 1 等式是((9 * 5)+(1 * 1))/ 10(人的总和)= 46/10 = 4.6 答案是 4.6,这是不公平的,因为 1 个人的低比率使结果下降到 4.6 在我看来结果应该是 4.9 我搜索并发现了一个叫做算法偏差的东西我不太明白,zomato 应用程序公司找到了解决方案对于这种情况,喜欢在低评级和虚假评级中保持公平
谁能帮我算出一个公平的方程式或算法
4.6是公平的,4.9是有偏见的。
从(非常)少的观测值中估计随机过程的未知参数(均值、方差等)的问题是一个非常困难的问题,已被深入研究。
此处目前使用术语偏差,但不应与概率偏差(随机过程的数学平均值与估计的数学平均值之间的差异)混淆。这里想要最小化的是误差本身,更准确地说是想要避免大的误差。在这种情况下,由于选民人数较少,一次简单的投票就可以有效地偏差估计。
另一个困难是我不相信符号的平均值是一个很好的标准。比率的直方图 (90% -> 5, 10% -> 1) 更有趣并提供更多信息。然而,这样的直方图不允许简单的排序...
我不是这个具体问题的专家,我只知道一种简单常用的方法:抑制较低和较高的值。然而,在提议的场景中,我们得到了 5 的排名,这远非完美。
我能想到的另一种方法是先进行粗略估计,然后对与第一次平均值相差太远的值进行权重较低的新平均。
但是,任何提议的方法都应该推导和检查from/with足够的数据:收集大量选票,推导对一家餐厅的准确估计,然后尝试获得与任何低的大致相同的结果从该数据库中提取的投票数。 最佳 算法取决于过程的概率法则,我不知道。
一种可能的解决方案是对投票给特定评级的人数求平方。通过将每个评级乘以平方来计算加权平均值。然后除以平方和,向下取整。这将使评级接近大多数人选择的值。
例如当收视率是
5 stars from 9 people
1 star from 1 person
那么计算就是
(5*(9*9) + 1*(1*1)) / ((9*9) + (1*1)) = 4.9
如果你有这样的分布
5 stars from 4 people
4 stars from 8 people
3 start from 11 people
2 stars from 6 people
1 star from 3 people
那么计算就是
(5*16 + 4*64 + 3*121 + 2*36 + 1*9) / (16+64+121+36+9) = 3.1
您也可以尝试不同的加权公式。例如,您可以使用 n * sqrt(n)
.
n * n
算法偏差
这个问题绝非微不足道。事实上根本无法解决。至少不是你认为的数学方式。我将首先尝试通过几个示例来解释算法偏差:
亚马逊训练了人工智能来做出招聘决定。一段时间后,他们意识到人工智能更喜欢男性而不是女性申请人,因为这种偏见也出现在训练数据集中。在这种情况下,判断 AI 是否有不公平的偏见是相当微不足道的。
假设我设置了另一个 AI,它也可以决定邀请哪些申请人参加面试。现在我从亚马逊那里学到了,通过简单地删除性别、姓名或种族等细节来避免 gender-bias。不,我的 AI 既不能是种族主义者,也不能是性别歧视者,所以它应该是公平的,对吧?好吧,我的 AI 了解到最好雇用 30 岁左右的求职者,因为他们有 state-of-the-art 技术经验并且对这个行业并不陌生。这对公司来说是理想的(可能至少——我会忽略那个细节,只是为了简单起见而假设它)。但是现在我们忽略了新人和超过一定年龄的人。这公平吗?越来越模糊了
之前描述的 AI 因不公平而被驳回,现在我还确保新 AI 忽略了年龄。它现在将以对待 30 岁和比 30 岁以上的人相同的方式对待新人。所以现在很公平,对吧?但现在它不太关心申请人的经验,会给那些没有头绪的人和已经投入时间和金钱来获得经验的人同样的机会。那么公平吗?好吧,我很难回答这个问题
或者最后但同样重要的是:对这个问题的评论已经表明定义什么是(不)公平是多么棘手。对于剩下的问题,我假设你提出的 rating-scheme 是公平的。
修改评级评估的可能方法
有很多方法可以用来编译评级。我只会展示两个简单的选项来实现你想要的,尽管确实有很多方法可以用一点创意来打乱数字。
中位数是一种很好的统计工具,可以消除由评级中的一些异常值引起的偏差。通常中位数计算为排序列表中间的值 - 或者如果评级数甚至是两个中间值的平均值。
def median(arr):
if len(arr) % 2 == 1:
return sorted(arr)[len(arr) // 2]
else:
i = len(arr) // 2
return sum(sorted(arr)[i - 1 : i + 1]) / 2
对于您的示例,有 9 个 5 星评级和 1 个 1 星评级,结果将是 5。这公平吗?可能不会,因为这将以相同的方式处理任何不等于中位数的评级。 IE。对于以上 user-rating 最后一个用户给一颗星还是四颗星都没有关系。另一方面,该统计数据对于具有极端异常值的偏斜数据非常稳健。所以无论如何它都不是正确的工具。
结合中位数和算术平均值
这个结果更接近您的预期 - 4.8。我们不再完全忽略异常值,但我们赋予它们的权重要小得多。所以总的来说,这个评级对最普遍的意见有很大的偏见,但并没有像以前那样给予它那么多的价值。
甚至可以添加中位数和平均值的权重来调整异常值的权重:
def weighted_rating(arr, w):
arithm = sum(arr) / len(arr)
m = median(arr)
return m * w + arithm * (1 - w)
在上面的代码中,w
应该介于 0(仅算术平均值)和 1(仅中值)之间。对于 w = 0.75
,评级为 4.9。因此,为了达到这样的评级,中位数的权重是平均值的两倍。
编辑:
以更公平的方式对待离群值的一个很好的实用方法是
问题的根本原因是评级量表是主观的 - 因此受到用户认知偏差的影响。因此,最好的解决方案是采用不同的评级方法,例如 Elo 系统——用户将被要求将他们最近访问过的餐厅与他们之前访问过的餐厅进行比较,从而创建一个真正的餐厅排名顺序(这可以让星级重新定义为五分位数)。本文更详细地讨论了该问题和可能的解决方案:https://www.linkedin.com/pulse/how-build-truly-5-star-user-rating-tobias-baer/