算法偏差
这个问题远非微不足道。事实上,它根本无法解决。至少不是你认为的数学方式。我将首先尝试通过几个示例来解释算法偏差:
亚马逊训练了一个人工智能来做出招聘决定。一段时间后,他们意识到人工智能更喜欢男性而不是女性申请者,因为这种偏见也出现在训练数据集中。在这种情况下,判断 AI 是否有不公平的偏见相当简单。
假设我设置了另一个 AI,它也决定邀请哪些申请人参加面试。现在我向亚马逊学习,并通过简单地删除性别、姓名或种族等细节来避免性别偏见。不,我的 AI 既不能是种族主义者,也不能是性别歧视者,所以应该是公平的,对吧?好吧,我的 AI 了解到,最好雇用 30 岁左右的申请人,因为他们有最先进技术的经验,而且对这个行业并不陌生。这对公司来说是理想的(可能至少——我会忽略这个细节,为了简单起见只是假设它)。但是现在我们忽略了新人和超过一定年龄的人。这公平吗?越来越模糊了
之前描述的 AI 被认为不公平而被驳回,现在我还确保新 AI 忽略了年龄。它现在对待新人的方式与对待 30 岁和年长者的方式相同。所以现在是公平的,对吧?但是现在它不太在乎申请人的经验,并且会给没有线索的人提供与投入时间和金钱来获得经验的人相同的机会。那么公平吗?好吧,我几乎无法回答这个问题
或者最后但并非最不重要的一点:这个问题的 cmets 已经表明定义什么是(不)公平是多么棘手。对于剩下的问题,我将假设您提出的评级方案是公平的。
修改评级评估的可能方法
有很多方法可以替代地编译评级。我只会展示两个简单的选项来实现你想要的,尽管确实有很多方法可以用一点创意来弄乱数字。
Median
中位数是一个很好的统计工具,可以消除由评分中的一些异常值引起的偏差。通常中位数计算为排序列表中间的值 - 或者如果评分数是两个中间值的平均值。
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。对于上面的用户评分,最后一个用户给一星还是四星都没有区别。另一方面,对于具有极端异常值的偏斜数据,该统计数据非常稳健。所以无论如何它都不是正确的工具。
结合中位数和算术平均值
这个创建的结果更接近您的预期 - 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。因此,为了获得这样的评级,中位数的权重是平均值的两倍。
编辑:
@user3386109's answer 是一种以更公平的方式处理异常值的实用方法。我的回答主要是为了展示“公平”统计数据的复杂性,而不是提供任何实际的算法来计算评分。