机器学习统计


在学习机器学习时,首先遇到的是一大堆术语,如推理统计、统计检验、统计假设、零假设、替代假设、p值、概率分布...这份名单越来越长。

这对那些不熟悉统计学的人来说可能是令人沮丧的。这篇文章旨在为所有这些术语和概念提供一个温和的介绍。

推理统计学

推断统计学的目标是检验样本中变量之间的关系,然后预测这些变量与更大的人群之间的关系。

自然科学中的推理

这种工作方式——分析一个样本,然后对更大的人群进行归纳/预测——并不排斥统计学。相反,这是自然科学的工作方式。

例如,牛顿的引力理论根据众所周知的公式将相互作用的物体的质量和它们之间的距离结合起来:

通过公式预测结果与经验结果的比较,验证了模型的有效性。

统计学中的推理

在统计学中,没有通过某种规则组合变量的公式。相反,假设变量取随机值。

这是另一种说法,我们不知道支配这种现象的规律。或者我们可以,但是系统是如此复杂,有如此多的变量,传统的计算是不可行的。

例如,物理学领域称之为Statistical Mechanics以很大的自由度研究物理系统。虽然经典力学可以处理涉及几个物体的问题,请参阅n-body problem,统计力学用于研究包含数十亿个粒子的系统。

统计推断方法

即使统计模型的变量是随机的,也必须有某种方法来预测它们的行为,否则,就不可能测试这个模型。

通常,推断统计以两种方式运行:

  • 置信区间:通过分析样本,整个总体的参数值用区间和参数在区间内的置信度来表示。这种工作方式导致这样的陈述:“95%的概率,所有美国男人的平均身高都有一个区间值[165厘米,175厘米]”
  • 假设检验:通过分析一个样本,一个关于人口的声明就重要性水平而言。因此,有可能做出这样的声明:“一个骰子有95%的置信度(无效假设在5%的显著性水平上被拒绝)”

以下部分展示了每种方法的一些示例,以便更好地理解它们的工作原理。

假设检验

统计模型表示随机变量取某一值的概率。这些表示被称为概率分布。

有离散的概率分布(当变量只能从有限的集合中取值时)和连续的概率分布(当有无限的值时)。

例如,抛硬币的结果是一个随机变量。代表这种现象的一个模型是discrete uniform distribution,其中两个可能结果中的每一个都具有相同的概率(1/2)。如果掷硬币的次数足够多,结果与模型一致,我们说硬币是公平的。

让我们假设我们抛硬币7次,得到5个头。这是一枚公平的硬币吗?为了回答这个问题,我们将证明根据我们的模型得到这个结果的概率非常低,因此,它不可能是一个公平的硬币。多低?按照惯例,阈值设置为0.05。

以上段落可以用统计学术语来表达:

我们将拒绝零假设(即硬币是公平的),通过显示根据零假设从7次投掷中获得至少5个头的p值在统计学上是显著的(小于0.05的显著性水平阈值),因此,替代假设(即硬币是不公平的)将是有利的。

为了计算p值(7次投掷中至少有5次击中头部的概率),我们可以使用binomial distribution.

参数为n和p的二项分布决定了在一系列n个独立实验中获得一定数量成功的概率,这些实验的结果是随机变量,取值为真(概率为p)或假(概率为1-p)

在我们的例子中,我们想计算在一系列7个实验中得到至少5个头像的概率,因为我们处于零假设状态,即硬币是公平的,所以在每个单独的实验中得到一个头像的概率是0.5。有了这些信息,p值将是

因此,结果在统计学上并不显著,这意味着这还不足以否定无效假设。

置信区间

置信区间是一个数字范围,很可能包含实际的总体值。区间包含总体值的概率称为置信水平。

参见https://www.thoughtco.com/calculating-a-confidence-interval-for-a-mean-3126400更多细节。

假设我们想确定一群人的平均身高。我们将首先测量15名男性样本的平均身高,然后建立一个置信区间来推断整个人群的结果。

测量样本中个体的高度后,获得以下结果:

data = [169.94,173.12,166.3,162.79,174.34,185.83,169.63,173.41,172.92,165.0,169.29,160.28,168.38,171.87,163.66]

与这些结果相对应的平均值和标准偏差分别为169.78和6.16。

margin of error由公式给出:

它结合了临界值、标准偏差和样本量。

14个(样本大小- 1)自由度和90%置信度的临界值为1.34503(https://goodcalculators.com/student-t-value-calculator

因此,E = 2.14,观察到的平均值169.78落在167.64至171.92的90%置信区间内。

因此,我们可以说人口的真实平均值落在置信水平为90%的区间(167.64,171.92)内。

注意:为了应用误差范围公式,我们假设从样本获得的数据服从正态分布。

模拟

可以说,在计算机上运行模拟比分析/理论方法更直观。这一节举了一些例子https://docs.python.org/3/library/random.html作为启发,展示了如何使用模拟解决前面的问题。

假设检验

让我们试着复制在研究一枚硬币在7次投掷中给出5个头的公平性时获得的结果。

为了做到这一点,我们将进行数千次试验,每一次试验包括投掷硬币7次和数人头数。每次投掷的结果值取自离散均匀分布,即描述硬币行为的模型。

p值将被计算为试验的分数,其中头部的数量至少为5。

from random import choices
n = 7 #number of tosses
minNumberSuccesses = 5 #number of heads
p = 0.5 #probability of getting a head on a single experiment
trials = 100000 #number of trials
trial = lambda : choices(['heads','tails'], cum_weights=[p, 1.00], k=n).count('heads') >= minNumberSuccesses
sum(trial() for i in range(trials))/trials

运行模拟后,结果为0.2261,非常接近理论值0.2265。

置信区间

为了复制置信区间的结果,我们将使用一种称为bootstrapping包括替换重采样。

基于对方法的描述https://en.wikipedia.org/wiki/Bootstrapping_(statistics)#Approach,我们从原始样本中提取样本(重采样)。每个重采样都有与原始采样相同数量的元素,并且可能有重复的元素。

from random import choices
def bootstrap(data):
    return choices(data, k=len(data))

n = 10000
means = sorted([mean(bootstrap(data)) for i in range(n)])
print(f'resample mean: {mean(means):.2f}')
#90% confidence interval goes from 5% to 95%
print(f'lower bound: {means[round(n*.05)]:.2f}')
print(f'upper bound: {means[round(n*.95)]:.2f}')

运行程序的结果是:

resample mean: 169.80
lower bound: 167.37
upper bound: 172.43

重采样的平均值为169.80,与原始样本获得的值169.78非常相似。

根据上述结果,总体的真实平均值落在置信水平为90%的区间(167.37,172.43)内。该值与分析计算的区间(167.64,171.92)非常相似。

这种技术的一个优点是,它不对样本数据所遵循的分布做任何假设(与分析方法相反,分析方法期望数据遵循正态分布)

硬币问题再探

当实现硬币模拟时,我们有一个模型(离散均匀分布)作为我们模拟的基础。

然而,在许多现实生活中没有这样的模式;例如,当通过与对照组(安慰剂)进行比较来测试药物时。

为了说明这个想法,让我们假设描述硬币问题的基础模型是未知的。那么,如何确定硬币的公平性呢?

除了均匀分布模型,我们还需要一些其他的参考。那个参考将是另一个硬币,一个“魔法”我们把硬币作为衡量硬币公平的黄金标准。只要结果与参考硬币一致,任何其他硬币都将被认为是公平的。

回到问题上来,让我们假设这5个头部是按以下顺序获得的:

coin = [1, 1, 1, 1, 1, 0, 0]

然后,我们掷7次魔币,得到这个序列:

magic_coin = [1, 1, 0, 0, 0, 1, 0]

为了解决这个问题,我们将使用重采样的形式permutation tests(在我们以自举的形式处理重采样之前)。

在零假设下,每个硬币获得的结果是无法区分的。正因为如此,有可能互换两种硬币的结果,而不会注意到任何差异。

为了运行我们的假设检验,我们将把原始结果洗牌数千次,并计算硬币平均值的差异比原始差异大多少倍。这就是p值。

from statistics import mean
from random import shuffle

coin = [1,1,1,1,1,0,0]
magic_coin = [1,1,0,0,0,1,0]
observed_diff = mean(coin) - mean(magic_coin)

n = 10000
count = 0
combined = coin + magic_coin
for i in range(n):
    shuffle(combined)
    new_diff = mean(combined[:len(coin)]) - mean(combined[len(coin):])
    count += (new_diff >= observed_diff)

print(f'{n} label reshufflings produced {count} instances with a difference')
print(f'at least as extreme as the observed difference of {observed_diff:.2f}.')
print(f'The p-value is {count / n:.4f}')

运行该模拟的结果是:

10000 label reshufflings produced 2928 instances with a difference
at least as extreme as the observed difference of 0.29.
The p-value is 0.2928

由于0.2928 > 0.05,零假设不能被拒绝,因此,没有理由怀疑我们的硬币是不公平的。