有时候,看到的统计数据会让人大吃一惊,让我们开始怀疑日常生活中看似显而易见的事情。伯克森悖论就是这样一个让人头疼的例子。它告诉我们,如果我们只看到一部分情况而不是全貌,就很容易错误地认为两件事之间有某种联系。对于做机器学习的人来说,这个悖论特别重要,因为它可能导致我们错误地假设变量之间的关系,这直接影响到预测模型的准确度。
来看看具体的例子吧
- 以Berkson最早提出的情境为例,想象一下在一家医院里进行的一项研究。研究人员在这里研究胆囊炎(一种胆囊疾病)的危险因素,比如糖尿病可能是其中之一。但是,因为研究的样本是从住院的人群中抽取的,而不是普通人群,这就引入了抽样偏差。这种偏差可能让人错误地认为糖尿病能预防胆囊炎。
- 另一个例子是Jordan Ellenberg提出的。在这个例子中,Alex建立了一个约会群体,但这个群体并不完全代表所有男性。这里存在抽样偏差,因为她挑选的男性要么非常友好,要么非常有吸引力,或者兼而有之。在Alex的约会经历中,发生了一些有趣的现象:她发现,在她约会的男性中,似乎越是友好的人越不吸引她,反之亦然。这种抽样偏差可能导致Alex错误地认为友好与吸引力之间存在着负相关关系。
我们试图把问题说得更清楚一些
假设我们有两个事件_X_和_Y_,这两个事件本来是互不相关的:
比如,有人可能会遇到胆囊炎,就像我们之前例子中讲的那样;或者有人可能会发现自己得了糖尿病。另外的情况,像是人的性格善良或外表美丽,也是随机分布的。但重点来了,当我提到这些事件是独立的,我是指在整个人群中,这些事件互不影响!
再来看我们之前的例子,我们发现样本采集时总是倾向于某一类型的偏见:不会同时遇到两种情况。比如在医院的样本里,你不会找到一个既不患胆囊炎也不患糖尿病的病人。在另一个场景中,比如说亚历克斯的观察中,也不会有人同时既不友好又不好看。所以,我们可以根据条件预测,至少会发生以下两种情况之一:事件X已经发生,或者事件Y已经发生,甚至可能两者都发生了。为了更好地说明这一点,我们引入一个新的概念,事件Z,它代表的是事件X和事件Y的集合。
现在,我们可以写出以下内容来表明我们处于抽样偏差假设之下:
这是在知道事件X或Y(或两者)已经实现的情况下,事件X发生的概率。_直观上,我们可以感觉到这个概率比P(X)更高......但形式上也可以表示出来。
为此,我们知道:
通过假设两个事件有可能不同时发生(例如,不患胆囊炎和不患糖尿病的人),前面的陈述可以变成严格的不平等;因为集合(X ∪ Y)不是样本空间 Ω:
现在,如果我们将这个严格不等式两边除以P(X ∪ Y) ,然后乘以P(X) ,我们得到:
在这里
因此,我们确实发现在整个总体中,抽样偏差P(X|Z)下的概率高于P(X) :
我们得弄清楚,在已知Y发生,并且我们的采样中有偏差Z的情况下,X发生的概率是多少。用数学语言说,就是P(X | Y ∩ Z)。这听起来可能有点绕,但其实就是在说,我们想知道,在一个特定的条件下,一个事件发生的可能性。而且,这里的P(X | Y ∩ Z)可以被简化成P(X | Y, Z),就是说,如果我们知道Y发生了,同时我们的采样存在偏差Z,那么X发生的概率是多少。
接下来,我们用一个小技巧。因为(Y ∩ Z) = (Y ∩ (X ∪ Y))实际上就等于Y,这里的逻辑是,如果Y已经发生了,不管X是否发生,都不会影响Y的发生。而X和Y是独立的,这意味着它们平时互不干涉。
最后,知道P(X) < P(X | Z),我们得到了我们正在寻找的东西:
该方程表明,在 Z 定义的采样偏差下,两个最初独立的事件X和Y变得相关(否则,我们将具有相等而不是">")。
回到 Alex 约会池的例子,如果
- Z 是进入 Alex 约会池的事件
- X是选择一个友好的人的事件
- Y是选择一个有魅力的男人的事件
让我们来聊聊Alex遇到好男人的奇妙旅程,这个故事里有两个重要的公式,不过别担心,我们不会让它变成高数课的。首先, (X | Z)这个看起来有点复杂的表达式,实际上就是在说Alex遇到一个好男人的情况。然后,我们有(X | Y ∩ Z) ,同样是关于Alex遇到好男人的事情,但这次的条件是这个男人长得还挺帅的。
让数字来揭示真相
在理解伯克森悖论时,让我们通过一个简单的骰子游戏来具体化一下:
- 事件 X:想象我们摇了第一个骰子,它停在了 6 上。
- 事件 Y:然后我们摇第二个骰子,结果显示 1 或者 2。
看起来,这两件事好像没有什么联系,对吧?第一个骰子的结果不会影响第二个骰子,所以我们说这两个事件是独立的。具体点说,P(X)=1/6,因为骰子有六面,每面出现的概率都是一样的;而_P(Y)=1/3_,因为第二个骰子落在 1 或 2 上的概率加在一起。
接下来,我们设定一个条件(我们称之为 Z),这个条件会排除两个同时不满足的情况:第一个骰子不是 6 且第二个骰子既不是 1 也不是 2。这就好比我们故意偏向于某些结果。
在这个特别的设置下,如果我们知道至少一个骰子满足条件(不管是_X_还是_Y_),我们想要找出在这种情况下,第一个骰子显示 6 的概率是多少,也就是_P(X|Z)_。
好的,现在我们要开始一些计算了......我知道,数学可能让人头疼,但别担心,我在这里帮你。让我们一步步来解释这个过程吧。:-)
接下来,我们计算给定 Z 时 X 的概率:
为了查看在Z发生的假设下X和Y之间是否存在依赖性,我们必须计算P(X | Y ∩ Z)。
作为
这时我们有
在探究伯克森悖论的奇妙世界时,我们会比较两个特殊的概率------_P(X|Z)与_P(X | Y ∩ Z) ,来看看它们之间的关系:
- 首先,我们发现_P(X|Z) = 0.375_。
- 然后,我们看到_P(X | Y ∩ Z) ≈ 0.1666..._。
这个结果让人眼前一亮!尽管我们只是在玩两个骰子,两个完全独立的随机事件,但伯克森悖论让它们看起来好像通过某种采样偏差(我们称之为Z)变得相互依赖了。
确实,这是相当令人惊讶的!我们有两个简单的骰子......两个看似毫无关联的随机事件......然而,通过特定的采样方式,它们竟然表现出了一种相互依赖的错觉。
让模拟来加强我们的信念
接下来,我们不妨用一点Python代码来实际模拟一下这个情况,看看现实中这个悖论是如何展现的。
下面的代码将执行一百万次的双骰子投掷模拟。在每次实验中,我们都会检查第一个骰子是否落在了6上(我们称之为事件X),以及第二个骰子是否显示了1或2(事件Y)。然后,我们会把这些实验的结果(不管是True还是False)分别记录在两个列表X和Y中。
ini
import random
#Get some observations for random variables X and Y
def sample_X_Y(nb_exp):
X = []
Y = []
for i in range(nb_exp):
dice1 = random.randint(1,6)
dice2 = random.randint(1,6)
X.append(dice1 == 6)
Y.append(dice2 in [1,2])
return X, Y
nb_exp=1_000_000
X, Y = sample_X_Y(nb_exp)
让我们搞清楚这两件事情---事件X和事件Y---他们之间是不是真的没有什么牵连。怎么搞清楚呢?来,我们用一段代码来帮忙。这段代码的任务就是要算出事件X发生的概率,以及在事件Y已经发生的情况下,事件X发生的概率(这个叫做条件概率)。我们怎么算呢?很简单,数一数哪些情况是我们要的结果,然后再看看总共有多少可能的情况,用前面的数目除以后面的数目,结果出来了,就这么简单。
scss
# compute P(X=1) and P(X1=1|Y=1) to check if X and Y are independent
p_X = sum(X)/nb_exp
p_X_Y = sum([X[i] for i in range(nb_exp) if Y[i]])/sum(Y)
print("P(X=1) = ", round(p_X,5))
print("P(X=1|Y=1) = ", round(p_X_Y,5))
ini
P(X=1) = 0.16693
P(X=1|Y=1) = 0.16681
就像我们观察到的那样,两个概率数字挺接近的,这意味着什么呢?没错,正如我们预期的(带着一点自豪的微笑;-)),这两个骰子彼此之间是独立的,互不干扰。
好,接下来的剧情有点变化,如果我们往实验里加入一点小小的采样偏差Z,情况会如何变化呢?让我们通过一段代码来揭晓答案。这段代码的任务是过滤实验的结果,但它只留下那些X=1、Y=1,或者两者同时满足的情况。然后,把这些筛选后的数据分别放进两个列表,XZ和YZ里。这样做的目的是什么呢?接着往下看,精彩即将展开。
ini
# keep only the observations where X=1, Y=1 or both (remove when X=0 and Y=0)
XZ = []
YZ = []
for i in range(nb_exp):
if X[i] or Y[i]:
XZ.append(X[i])
YZ.append(Y[i])
nb_obs_Z = len(XZ)
现在,让我们检查这些新变量是否仍然是独立的。
scss
# compute P(X=1|Z=1) and P(X1=1|Y=1,Z=1) to check if X|Z and Y|Z are independent
p_X_Z = sum(XZ)/nb_obs_Z
p_X_Y_Z = sum([XZ[i] for i in range(nb_obs_Z) if YZ[i]])/sum(YZ)
print("P(X=1|Z=1) = ", round(p_X_Z,5))
print("P(X=1|Y=1,Z=1) = ", round(p_X_Y_Z,5))
ini
P(X=1|Z=1) = 0.37545
P(X=1|Y=1,Z=1) = 0.16681
我们手头上有一个不等式,跟前面那一节讲的是一样的。这个不等式告诉我们一个事实:如果Z成立的话,那么Y的信息就会影响到X的概率;换句话说,X和Y就不再是互不干扰的了。
这个悖论对机器学习专家有什么影响?
我觉得很多机器学习的大佬们可能还没完全意识到这种偏见带来的问题。当我们聊到伯克森悖论,我们其实是在深挖机器学习领域里的一个很重要的议题。这个讨论的核心,是要让我们明白,我们是怎样被我们所依赖的数据给误导的。伯克森悖论就像是在警告我们,依赖有偏见或者不全面的数据是有危险的。
- 信用评分系统:比如在金融领域,如果一个模型只根据那些收入高或者信用评分高的申请人的数据来训练,它可能会错误地认为这两个因素是负相关的,很少会同时出现。这种情况可能会导致贷款行为对某些人群不公平,因为它偏向了某些特定的群体。
- 社交媒体算法:在社交媒体算法的场景中,如果模型是根据那些要么极度流行但参与度低,要么参与度高但不太流行的用户数据来训练的,那么伯克森悖论可能会出现。这种有偏差的抽样通常会导致错误的结论,比如认为受欢迎程度和参与深度是负相关的。因此,算法可能会低估那些流行度和参与度都适中的内容,这样就扭曲了内容推荐系统。
- 求职者筛选工具:对于那些基于高学历或丰富经验的求职者来训练的筛选模型,可能会错误地显示这些属性之间的反比关系,导致忽视了那些学历和经验都平衡的候选人。
在每一种情况下,忽略伯克森悖论都可能会让模型带来偏差,影响到决策和公平性。机器学习专家必须通过让数据源更加多样化,并且根据现实世界的场景不断地验证模型来解决这个问题。
结论
总的来说,伯克森悖论是给机器学习专业人士的一个重要提醒,告诫他们要仔细检查他们的数据源,避免被误导性的相关性所蒙蔽。通过理解和应对这个悖论,我们可以构建出更加准确、公平、实用的模型,真实地反映出现实世界的复杂性。记住,构建强大的机器学习解决方案的关键不仅仅在于复杂的算法,还需要深思熟虑、全面的数据收集和分析。