机器学习的很大一部分涉及估计机器学习算法在未见过数据上的性能。
置信区间是一种量化估计不确定性的方法。它们可以用于为总体参数(例如从总体中独立观察样本中估计的均值)添加边界或似然。置信区间来自估计统计学领域。
在本教程中,您将了解置信区间以及如何在实践中计算置信区间。
完成本教程后,您将了解:
- 置信区间是总体参数估计值的边界。
- 可以直接计算分类方法估计技能的置信区间。
- 可以使用引导法以无分布的方式估计任何任意总体统计量的置信区间。
通过我的新书《机器学习统计学》**启动您的项目**,其中包括**分步教程**和所有示例的**Python 源代码文件**。
让我们开始吧。
- **2018 年 6 月更新**:修正了引导法代码示例中采样部分的拼写错误。

机器学习的置信区间
图片由Paul Balfe 提供,保留部分权利。
教程概述
本教程分为3个部分;它们是
- 什么是置信区间?
- 分类准确性的区间
- 非参数置信区间
需要机器学习统计学方面的帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
什么是置信区间?
置信区间是总体变量估计值的边界。它是一个用于量化估计不确定性的区间统计量。
置信区间包含总体或过程的未知特征。感兴趣的数量可能是总体属性或“参数”,例如总体或过程的均值或标准差。
— 第 3 页,《统计区间:从业者和研究人员指南》,2017 年。
置信区间不同于描述从分布中采样数据边界的容忍区间。它也不同于描述单个观测值边界的预测区间。相反,置信区间提供总体参数(例如均值、标准差或类似值)的边界。
在应用机器学习中,我们可能希望在展示预测模型的技能时使用置信区间。
例如,置信区间可用于展示分类模型的技能,可表示为:
给定样本,有 95% 的可能性,x 到 y 的范围涵盖真实模型准确性。
或者
在 95% 置信水平下,模型准确性为 x +/- y。
置信区间也可用于展示回归预测模型的误差;例如
有 95% 的可能性,x 到 y 的范围涵盖模型的真实误差。
或者
在 95% 置信水平下,模型的误差为 x +/- y。
在表示置信区间时,95% 置信度是一个非常常见的选择,尽管也使用其他不常见的数值,例如 90% 和 99.7%。实际上,您可以使用任何您喜欢的值。
95% 置信区间 (CI) 是根据我们的数据计算出的一系列值,最有可能包含我们正在估计的总体真实值。
— 第 4 页,《新统计学导论:估计、开放科学及其他》,2016 年。
置信区间的价值在于它能够量化估计的不确定性。它提供了下限和上限以及可能性。仅作为半径度量,置信区间通常被称为误差范围,并可用于通过误差线以图形方式描绘图表上估计的不确定性。
通常,从中得出估计值的样本越大,估计值越精确,置信区间越小(越好)。
- **较小的置信区间**:更精确的估计。
- **较大的置信区间**:不太精确的估计。
我们还可以说,置信区间告诉我们估计的精确度可能有多高,而误差范围是我们的精确度衡量标准。短的置信区间意味着小的误差范围,我们有一个相对精确的估计 […] 长的置信区间意味着大的误差范围,我们有一个低的精确度。
— 第 4 页,《新统计学导论:估计、开放科学及其他》,2016 年。
置信区间属于一个称为估计统计学的统计学领域,可用于呈现和解释实验结果,而不是(或除了)统计显著性检验。
估计提供了一种更具信息量的方式来分析和解释结果。 […] 了解并思考效应的大小和精确度对于定量科学比考虑在绝对没有效应的情况下观察到至少这种极端数据的概率更有用。
— 《估计统计学应取代显著性检验》,2016 年。
在实践中,置信区间可能比使用统计显著性检验更受欢迎。
原因在于它们更容易让从业者和利益相关者直接关联到领域。它们还可以被解释和用于比较机器学习模型。
这些不确定性估计有助于两个方面。首先,这些区间让模型的使用者了解模型的优劣。 […] 通过这种方式,置信区间有助于衡量比较模型时可用证据的权重。置信区间的第二个好处是促进模型之间的权衡。如果两个模型的置信区间显著重叠,则表明两者(统计上)等效,并可能提供一个理由来偏爱更简单或更易解释的模型。
— 第 416 页,《应用预测建模》,2013 年。
现在我们知道了什么是置信区间,让我们看看几种为预测模型计算置信区间的方法。
分类准确性的区间
分类问题是指给定一些输入数据来预测标签或类别结果变量的问题。
通常使用分类准确性或分类误差(准确性的倒数)来描述分类预测模型的技能。例如,一个在 75% 的时间里对类别结果变量做出正确预测的模型具有 75% 的分类准确性,计算方法如下:
1 |
准确性 = 正确预测总数 / 预测总数 * 100 |
此准确性可以基于模型训练期间未见过的数据集(例如验证集或测试集)进行计算。
分类准确性或分类误差是一个比例或比率。它描述了模型做出正确或不正确预测的比例。每个预测都是一个可能正确或不正确的二元决策。从技术上讲,这被称为伯努利试验,以雅各布·伯努利的名字命名。伯努利试验中的比例具有特定的分布,称为二项分布。幸运的是,当样本量较大(例如,超过 30 个)时,我们可以用高斯分布来近似该分布。
在统计学中,一系列独立的成功或失败事件被称为伯努利过程。 […] 对于大的 N,这个随机变量的分布接近正态分布。
— 第 148 页,《数据挖掘:实用机器学习工具和技术》,第二版,2005 年。
我们可以利用比例(即分类准确性或误差)的高斯分布假设,轻松计算置信区间。
在分类误差的情况下,区间半径可计算为:
1 |
区间 = z * sqrt( (误差 * (1 - 误差)) / n) |
在分类准确度的情况下,区间半径可计算为:
1 |
区间 = z * sqrt( (准确度 * (1 - 准确度)) / n) |
其中 interval 是置信区间的半径,error 和 accuracy 分别是分类误差和分类准确度,n 是样本大小,sqrt 是平方根函数,z 是高斯分布中的标准差数量。从技术上讲,这被称为二项式比例置信区间。
高斯分布中常用的标准差数量及其对应的显著性水平如下:
- 1.64 (90%)
- 1.96 (95%)
- 2.33 (98%)
- 2.58 (99%)
考虑一个模型,在包含 50 个示例 (n = 50) 的验证数据集上,其误差为 20% 或 0.2 (误差 = 0.2)。我们可以按如下方式计算 95% 置信区间 (z = 1.96):
1 2 3 4 |
# 二项式置信区间 from math import sqrt interval = 1.96 * sqrt( (0.2 * (1 - 0.2)) / 50) print('%.3f' % interval) |
运行示例,我们看到计算出的置信区间半径并打印出来。
1 |
0.111 |
然后我们可以做出如下声明:
- 模型的分类误差为 20% +/- 11%
- 模型的真实分类误差可能在 9% 到 31% 之间。
我们可以看到样本大小对估计精度(以置信区间半径表示)的影响。
1 2 3 |
# 二项式置信区间 interval = 1.96 * sqrt( (0.2 * (1 - 0.2)) / 100) print('%.3f' % interval) |
运行示例表明,置信区间下降到大约 7%,从而提高了模型技能估计的精度。
1 |
0.078 |
请记住,置信区间是某个范围内的可能性。真实模型技能可能超出该范围。
事实上,如果我们一遍又一遍地重复这个实验,每次都抽取一个包含 […] 新示例的新样本 S,我们会发现大约 95% 的这些实验中,计算出的区间将包含真实误差。因此,我们称这个区间为 95% 置信区间估计。
— 第 131 页,《机器学习》,1997 年。
proportion_confint() statsmodels 函数是二项式比例置信区间的实现。
默认情况下,它对二项式分布进行高斯假设,尽管也支持其他更复杂的计算变体。该函数接受成功(或失败)计数、总试验次数和显著性水平作为参数,并返回置信区间的下限和上限。
下面的示例演示了该函数在一个假设情况下的应用:模型在包含 100 个实例的数据集中做出了 88 个正确预测,我们对 95% 置信区间感兴趣(作为 0.05 的显著性传递给函数)。
1 2 3 |
from statsmodels.stats.proportion import proportion_confint lower, upper = proportion_confint(88, 100, 0.05) print('lower=%.3f, upper=%.3f' % (lower, upper)) |
运行示例将打印模型分类准确性的下限和上限。
1 |
下限=0.816,上限=0.944 |
非参数置信区间
通常我们不知道所选性能度量的分布。或者,我们可能不知道分析方法来计算技能得分的置信区间。
参数置信区间所依据的假设经常被违反。预测变量有时不服从正态分布,即使服从,正态分布的方差在预测变量的所有水平上也可能不相等。
— 第 326 页,《人工智能的经验方法》,1995 年。
在这些情况下,引导法重采样方法可以作为计算置信区间的非参数方法,通常称为引导置信区间。
引导法是一种模拟蒙特卡洛方法,其中从固定有限数据集中有放回地抽取样本,并在每个样本上估计一个参数。此过程通过采样产生对真实总体参数的稳健估计。
我们可以用以下伪代码演示这一点。
1 2 3 4 5 |
统计量 = [] for i in bootstraps 样本 = 选取_有放回_样本(数据) 统计量 = 计算_统计量(样本) 统计量.添加(统计量) |
该程序可用于通过在每个样本上拟合模型并评估模型在未包含在样本中的样本上的技能来估计预测模型的技能。然后,模型的平均或中位数技能可以作为模型在未见过数据上评估时的技能估计值呈现。
通过选择特定百分位数上技能得分样本中的观测值,可以将置信区间添加到此估计中。
回想一下,百分位数是从排序样本中提取的观测值,其中样本中一定百分比的观测值低于该值。例如,样本的第 70 百分位数表示 70% 的样本低于该值。第 50 百分位数是分布的中位数或中间值。
首先,我们必须选择置信水平的显著性水平,例如 95%,表示为 5.0%(例如 100 – 95)。因为置信区间关于中位数对称,我们必须选择 2.5% 和 97.5% 的百分位数处的观测值以给出完整范围。
我们可以通过一个具体的例子来计算引导置信区间。
假设我们有一个包含 1,000 个观测值的数据集,这些观测值从 0.5 到 1.0 的均匀分布中抽取。
1 2 |
# 生成数据集 dataset = 0.5 + rand(1000) * 0.5 |
我们将执行引导过程 100 次,并从数据集中有放回地抽取 1,000 个观测值的样本。我们将总体均值作为我们将在引导样本上计算的统计量进行估计。这也可以很容易地是一个模型评估。
1 2 3 4 5 6 7 8 9 |
# 引导法 scores = list() for _ in range(100): # 引导样本 indices = randint(0, 1000, 1000) sample = dataset[indices] # 计算并存储统计量 statistic = mean(sample) scores.append(statistic) |
一旦我们有了一个引导统计量样本,我们就可以计算集中趋势。我们将使用中位数或第 50 百分位数,因为我们不假设任何分布。
1 |
print('median=%.3f' % median(scores)) |
然后我们可以将置信区间计算为以中位数中心,观测到的统计值中间 95% 的范围。
1 2 |
# 计算 95% 置信区间 (100 - alpha) alpha = 5.0 |
首先,根据所选的置信区间计算所需的较低百分位数。然后从引导统计量样本中检索该百分位数处的观测值。
1 2 3 4 |
# 计算较低百分位数(例如 2.5) lower_p = alpha / 2.0 # 检索较低百分位数处的观测值 lower = max(0.0, percentile(scores, lower_p)) |
我们对置信区间的上限做同样的事情。
1 2 3 4 |
# 计算较高百分位数(例如 97.5) upper_p = (100 - alpha) + (alpha / 2.0) # 检索较高百分位数处的观测值 upper = min(1.0, percentile(scores, upper_p)) |
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# 引导置信区间 from numpy.random import seed from numpy.random import rand from numpy.random import randint from numpy import mean from numpy import median from numpy import percentile # 为随机数生成器设置种子 seed(1) # 生成数据集 dataset = 0.5 + rand(1000) * 0.5 # 引导法 scores = list() for _ in range(100): # 引导样本 indices = randint(0, 1000, 1000) sample = dataset[indices] # 计算并存储统计量 statistic = mean(sample) scores.append(statistic) print('50th percentile (median) = %.3f' % median(scores)) # 计算 95% 置信区间 (100 - alpha) alpha = 5.0 # 计算较低百分位数(例如 2.5) lower_p = alpha / 2.0 # 检索较低百分位数处的观测值 lower = max(0.0, percentile(scores, lower_p)) print('%.1fth percentile = %.3f' % (lower_p, lower)) # 计算较高百分位数(例如 97.5) upper_p = (100 - alpha) + (alpha / 2.0) # 检索较高百分位数处的观测值 upper = min(1.0, percentile(scores, upper_p)) print('%.1fth percentile = %.3f' % (upper_p, upper)) |
运行示例总结了引导样本统计量的分布,包括第 2.5、50(中位数)和 97.5 百分位数。
1 2 3 |
第 50 百分位数(中位数)= 0.750 第 2.5 百分位数 = 0.741 第 97.5 百分位数 = 0.757 |
然后我们可以使用这些观测值对样本分布做出声明,例如
有 95% 的可能性,0.741 到 0.757 的范围覆盖了真实的统计平均值。
扩展
本节列出了一些您可能希望探索的扩展本教程的想法。
- 在您自己的小型人工测试数据集上测试每个置信区间方法。
- 查找 3 篇演示每种置信区间方法使用的研究论文。
- 开发一个函数,为给定的机器学习技能分数样本计算引导置信区间。
如果您探索了这些扩展中的任何一个,我很想知道。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
文章
书籍
- 理解新统计学:效应量、置信区间和元分析, 2011.
- 新统计学导论:估算、开放科学及其他, 2016.
- 统计区间:从业者与研究者指南, 2017.
- 应用预测建模, 2013.
- 机器学习, 1997.
- 数据挖掘:实用机器学习工具和技术,第二版,2005 年。
- Bootstrap 导论, 1996.
- 人工智能的经验方法, 1995.
论文
- 估计统计学应取代显著性检验, 2016.
- 引导置信区间,统计科学, 1996.
API
- statsmodels.stats.proportion.proportion_confint() API
- numpy.random.rand() API
- numpy.random.randint() API
- numpy.random.seed() API
- numpy.percentile() API
- numpy.median() API
文章
总结
在本教程中,您了解了置信区间以及如何在实践中计算置信区间。
具体来说,你学到了:
- 置信区间是总体参数估计值的边界。
- 可以直接计算分类方法估计技能的置信区间。
- 可以使用引导法以无分布的方式估计任何任意总体统计量的置信区间。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
来自引导置信区间计算的代码。难道不应该是
你的代码是
所以你只抽样了前 100 个观测值。还是我错过了什么?
它是 1000 个介于 0 到 100 之间的随机整数示例。
在此处了解有关 API 的更多信息
https://docs.scipy.org.cn/doc/numpy/reference/generated/numpy.random.randint.html
我与弗拉迪斯拉夫有相同的想法,即您只采样了前 100 个观测值,而不是其余的。
你为什么这么认为?
注意 randint() 的 API
https://docs.scipy.org.cn/doc/numpy/reference/generated/numpy.random.randint.html
@Jason,
你说
> 它是 1000 个介于 0 到 100 之间的随机整数示例。
所以整数,在这种情况下,索引只覆盖 0-100 之间的值,这意味着我们将从样本中抽取 1000 个点,但只从样本的前 100 个点中抽取。
我现在明白了,谢谢。
亲爱的 Jason,
现在的代码很难理解。数据集有 1000 个观测值,而 `indices = randint(0, 1000, 1000)` 这行代码意味着我们每次都对所有 1000 个观测值进行采样以计算均值。以下是相等的:`len(sample) = len(indices) = len(dataset) = 1000`。这种引导法源于中心极限定理,该定理假设真实总体是未知的,但我们有一个样本,在本例中就是数据集。如果我们从样本中抽取样本大小 >= 30 的样本并每次计算均值,则这些样本均值的分布(由变量 `scores` 表示的样本均值)将是正态的。如果均值分布是正态的或近似正态的,则均值和中位数将近似相等。我认为困惑来自于我们有一个长度为 1000 的数据集,我们正在对所有 1000 个进行采样并将其称为样本。在我昨天发布的帖子中,我从数据集中抽取了 100 个观测值,有放回地进行了 500 次实验(试验次数)。置信区间以样本均值的均值为中心。我们也可以说它以中位数为中心,因为均值的分布是正态的。
非常棒的反馈,Cyprian!如果您有任何问题,我们可以帮助您。
我想,这句话
“有 95% 的可能性,0.741 到 0.757 的范围涵盖了真实统计中位数。”
应该是
“有 95% 的可能性,0.741 到 0.757 的范围涵盖了真实统计平均值。”
因为你在代码中做的是
# 计算并存储统计量
统计量 = mean(sample)
这是平均值的统计量
谢谢,已修正。
在一般统计问题中,我们通常会拒绝包含或跨过零(0 或 1)的置信区间,但在这里,我们的置信区间只能表示 0-1,因此它可能包含其中一个值,并且仍然具有显著的 p 值。这是否正确?
这篇帖子的重点是通过估计统计量得到的置信区间,没有统计假设检验。
也许我没有理解你的问题?
你好,
我有一个关于将引导法应用于预测的问题。在训练数据上拟合机器学习模型后,我们使用训练好的模型来预测测试数据。我可以直接将引导法应用于我们的预测以获得置信区间,而无需将每个引导样本拆分为训练集和测试集并为每个引导样本拟合模型吗?
谢谢你
置信区间通过引导法计算一次,以总结模型性能。
预测与此无关,是最终模型的常规使用。
这有帮助吗?
那么这是否应该始终在模型评估结束时进行?
例如,你有一篇关于如何在这里快速检查不同算法的非常好的帖子:https://machinelearning.org.cn/spot-check-machine-learning-algorithms-in-python/
那么置信区间能否作为模型摘要功能的一部分添加呢?
在呈现结果甚至选择模型时,这是一种良好的实践。
我不想说总是/从不,因为我们是工程师,喜欢唱反调,喜欢找到特殊情况。
你认为你会怎么做?假设你完成了通常的机器学习步骤——获取数据、特征化、训练、交叉验证、测试。现在你手头有一个最终模型,但你想以定量的方式说明这些指标(精确度/召回率/准确度)的紧密程度。
听起来像是使用引导重采样训练样本训练多个模型,并获取所有模型在测试集上的指标?将多个模型的指标组合起来作为最终模型的代表是否有意义?另外,是否可以使用类似于 alpha 的概念来设置这些指标的边界?
是的,呈现引导法中平均技能是一种可靠且常用的方法。
标准差可以总结技能的分布。
感谢杰森的精彩帖子,我有一些关于开始/结束时间信息的旅行数据。如果我建立一个预测模型,我想用置信区间进行路线预测。假设我的特征是 miles_to_drive 和 road_type(高速公路、本地等),我的目标是 drive_time。在这种情况下,您将如何从您的样本数据集中提取数据以进行带有置信区间的预测?由于置信区间是总体统计量,我是否可以根据接近输入特征集的过滤器来限制数据集中的样本集,或者这是否违反了置信区间?
我相信您需要的是点预测的预测区间,而不是置信区间。
更多信息在这里
https://machinelearning.org.cn/prediction-intervals-for-machine-learning/
你好,杰森,我知道二项式分布可以用来计算测试集上的置信区间。但是,在进行 k 折交叉验证时我们应该怎么做呢?在这种情况下,我们有 k 个测试分区,可以计算 k 个置信区间。但是,您知道是否可以将所有置信区间合并为一个?或者从交叉验证过程中获得一个单一的置信区间?
您可以使用距平均值 2 或 3 个标准差作为软区间。
我更喜欢选择一个模型,然后使用引导法估计模型性能来重新评估。
https://machinelearning.org.cn/calculate-bootstrap-confidence-intervals-machine-learning-results-python/
嗨,Jason,
总的来说,工作非常出色,帖子也很棒,但我认为这让我有点困惑。因此,我想澄清几件事,因为我将要实现它。
假设我训练了一个模型,并且我想将其准确性表示为一个区间。我还想将其预测结果表示为一个区间。我应该如何计算每一个?
对于作为区间的准确性,我想我们会执行一个 CV 例程,其中 n 代表 CV 的折叠数,而不是数据集中的示例数
– 如果 cv 折叠 n > 30,则可以使用参数方法
– 如果 cv 折叠 n < 30,则应使用非参数方法
如果我然后用测试集测试我的模型,我只会假设它的准确性很可能落在上面计算的区间内。
这是否正确,还是我遗漏了什么?
祝好,
安德烈
模型的置信区间可以通过引导法计算。
预测的区间称为预测区间,是不同的东西。
https://machinelearning.org.cn/prediction-intervals-for-machine-learning/
亲爱的 Jason,
关于在回归问题中寻找置信和/或预测区间的两种主要方法:
– 检查估计/预测分布的正态性,并应用众所周知的高斯类方法来寻找这些区间
– 应用非参数方法,如引导法,这样我们就不需要假设/检查/关心我们的分布是否正态
考虑到这一点,我将选择第二种方法,因为
-它旨在通用,因为它不假设任何类型的分布
-它感觉更像是实验性的,因为您可以随意运行任意多次迭代(如果计算可行的话)
我能看到的唯一缺点是计算成本,但它可以并行化……
您能给我一些提示/建议,以考虑其他因素吗?
是的,第一种方法更强大,因为它更具体。在非参数方法中,你放弃了特异性,从而也放弃了能力。
非常感谢杰森博士
我想知道,对于 95% 置信区间和 97.5% 置信区间,在统计学上,最大值和最小值在可接受的范围内是什么?
此致
没有。它是相对的,并且特定于您的数据。
使用置信区间进行异常检测是否正确?能否将超出 95% 置信区间的数据点标记为异常数据点?
您可以在任何分类任务中使用置信区间。
我想您指的是离群点检测。
https://machinelearning.org.cn/how-to-use-statistics-to-identify-outliers-in-data/
嗨,Jason,
我创建了序列标注模型,并在验证数据上找到了 F1 分数,但现在,
假设我们有一个文件来预测标签,即序列标注,例如:-
关于机器学习的文章可以在 machinelearning 上找到。
如何找到预测文件的置信水平?
谢谢,并尽快等待您的回复。
你的意思是预测类别标签的不确定性。
大多数模型都可以直接预测类别成员资格的概率。如果您使用 sklearn,请参阅此处的示例。
https://machinelearning.org.cn/make-predictions-scikit-learn/
精彩的解释。谢谢你。
不客气。
亲爱的 Jason,
只是对 Python 字符串格式的一个更新。与其使用
“print(‘\n50th percentile (median) = %.3f’ % median(scores))”
较新的代码
“print(“\n50th percentile (median) = {0:.3f}”.format(median(scores)))”
自 Python 2.6 起推荐使用。
我不知道这是否会使情况更好。但我使用了较新的符号。
我的来源:https://thepythonguru.com/python-string-formatting/
谢谢你的工作!
感谢分享。是的,我知道,我更喜欢旧的样式。
亲爱的 Jason,
我已经打印出了“分数均值样本列表”(参见分数列表),其中包含下限(2.5%)和上限(97.5%)百分位数/边界,以表示 95% 置信区间,这意味着“有 95% 的可能性,范围 0.741 到 0.757 覆盖了真实统计均值”。
由于我无法上传图片,我已将其放置在 Dropbox 上。
https://www.dropbox.com/s/p8sdwmd8njk623k/score_mean_sample_list.png?dl=0
我使用了 matplotlib.pyplot 直方图,包含 15 个 bin,用于 100 个均值样本(参见分数列表)来绘制此图表。
这张图是什么样的分布?正态分布吗?
谢谢您的这个例子!
干得好。它看起来很正常。
二项式分布/伯努利试验是否也适用于多类别分类问题的准确性统计量?
分类问题的准确性是否只需要采样一次即可获得置信区间?
不,多类别分类是多项分布。
https://machinelearning.org.cn/discrete-probability-distributions-for-machine-learning/
是的,通过引导法进行非参数估计是常见的。
嗨,Jason,
我最近一直在阅读置信区间,并且很难将此处提供的样本定义与一些其他资源进行调和,我想听听您的意见。在这篇文章和您的统计学书中,我一直在阅读,您举了一个例子:“给定样本,有 95% 的可能性,x 到 y 的范围涵盖真实模型准确性。”这个定义看起来足够简单,其他网站也证实了这个定义。然而,一些其他资源似乎表明这可能不正确。例如,https://stattrek.com/estimation/confidence-interval.aspx 说:
“假设一个 90% 的置信区间表明总体均值大于 100 且小于 200。您将如何解释这句话?”
有些人认为这意味着总体均值落在 100 到 200 之间的可能性为 90%。这是不正确的。与任何总体参数一样,总体均值是一个常数,而不是一个随机变量。它不会改变。一个常数落在任何给定范围内的概率总是 0.00 或 1.00……90% 的置信水平意味着我们期望 90% 的区间估计将包含总体参数……”
这个定义的语义对我来说有点令人困惑,尤其是因为统计学中的词语选择和顺序似乎比其他领域需要更高的精确度才能“正确”。所以具体来说,我想理解的是这里的区别:
– 给定样本,有 95% 的可能性,x 到 y 的范围涵盖真实总体参数
对比
– 95% 的实验将包含真实总体参数
这些似乎不同,因为前一个定义似乎特别指的是所讨论的样本包含参数的概率,而后一个定义谈论的是多个实验。
您能否就这些定义是否相同提供一些见解?
谢谢!
对我来说听起来是一回事——就其含义而言,可能使用了更正确的统计语言。
你好 Jason,我可以使用 CI 和准确度、预测误差以外的指标吗,例如 SP、SE、F1-分数?
是的。
在句子中
区间 = z * sqrt( (准确率 * (1 – 准确率)) / n)
这只适用于一次训练/测试运行,还是我可以多次运行,例如,重复并平均结果以使用相同的公式?
Jason,
好帖子。只是一个问题。
在训练和测试机器学习模型时,如果我只分割一次数据集,我可能会得到“好”的部分,因此我可以获得良好的性能。我也可能得到“坏”的部分,因此我可以获得较差的性能。
为了处理这种不确定性,我通常使用 5 折或 10 折交叉验证来平均性能——通常是 AUC ROC。
但是我的一个有统计学背景的同事告诉我,不需要交叉验证。相反,只需分割一次数据,训练和测试模型,然后简单地使用置信区间来估计性能。例如,我只分割一次数据,运行模型,我的 AUC ROC 为 0.80,我的 95% 置信区间为 0.05。那么 AUC ROC 的范围是 0.80 +- 0.05,最终得到 0.75 到 0.85。现在我无需进行交叉验证就知道我的模型性能范围了。
我知道您也有关于交叉验证的帖子。置信区间真的可以取代交叉验证吗?或者,它们有不同的目的吗?
非常感谢您的建议!
有许多方法可以估计和报告模型的性能,您必须选择最适合您的项目或您的需求的方法——什么能给您信心。
嗨,Jason!
感谢您的帖子!
我有一个关于引导法的问题。首先,我们假设分类误差(或准确性)围绕真实值呈正态分布。
对于引导法,我们需要从数据集中获取一些样本。在分类情况下,这对我来说意味着我们需要几个分类误差(来自几个数据集)来估计分类误差的分布。这是否正确?
谢谢,并致以最诚挚的问候,
杰拉尔德
不,我们重新采样我们可用的单个数据集。
也许这会有帮助。
https://machinelearning.org.cn/a-gentle-introduction-to-the-bootstrap-method/
嗨,Jason,
感谢您的帖子。我有一个关于将引导重采样方法应用于分类指标(如精确度和召回率)以获取置信区间的问题。在我的实践中,我发现引导置信区间无法捕获点估计,我不知道为什么。我的方法基本上是:
1. 分割训练集和验证集
2. 重复 N 次引导循环 {
a. 有放回采样并获取 train* 和 val*
b. 在 train* 上拟合分类器
c. 在 val* 上计算分类指标(某个阈值下的精确度和召回率)
}
3. 根据这些引导指标获取置信区间。
然而,置信区间通常不覆盖点估计,即在原始(未采样)训练集和验证集上估计的精确度和召回率。事实上,如果我绘制每个引导循环的精确度-召回率曲线,这些曲线往往与使用原始训练集和验证集计算的曲线具有不同的形状。
我知道引导法有一些偏差,即在原始(未采样)训练集上训练的分类器与在引导训练集上训练的分类器本质上是不同的。这是否意味着我应该只使用引导法来计算方差,而不是精确度/召回率的置信区间?
谢谢!
不客气。
如果测试集很小,点估计可能是离群值,或者如果引导轮次很少,范围可能无效。
嗨,Jason,
区间 = z * sqrt( (准确率 * (1 – 准确率)) / n)
“考虑一个模型,在包含 50 个示例 (n = 50) 的验证数据集上,其误差为 20% 或 0.2 (误差 = 0.2)。”
我认为 (n = 50) 应该是公式中分类任务的数量。因为分类任务的准确性是样本,而不是验证集的一个实例。
因此,引导法似乎是置信区间的唯一方法。
感谢您的反馈,Mesut!
这是一篇关于置信区间非常详细的文章。谢谢。
布朗利博士解释得很好!顺便问一下,在回归设置中,有没有办法计算 MAE、RMSE 或 R^2 的 95% 置信区间。我看到您展示了分类示例。谢谢!
嗨,Jason,
好文章!
对于在机器学习模型训练中随机种子变化的重复采样方法,您会建议使用什么公式来计算置信区间?如果您能推荐一本关于这种方法的书籍或研究论文,我将不胜感激。
我添加了一些有用的评论来帮助澄清困惑。与其运行 100 次,不如运行 500 次实验,每次从长度为 1000 的数据集中随机抽取 100 个样本。100 个样本的索引在 0 到 1000(len(dataset))之间随机生成。然后我们计算每个样本的样本(样本均值)。实验结束时,分数列表应包含 500 个样本均值。我们提取的百分位数是均值而不是中位数。我们实际上不需要中位数,除非我们每次实验都计算样本中位数。
np.random.seed(1)
alpha = 5
confidence_level = 95
n = 1000 # 数据集大小
dataset = 0.5 + np.random.rand(n) * 0.5 # 从正态分布中获取 1,000 个介于 0.5 和 1.0 之间的观测值
scores = list()
num_trails = 500 # 引导实验次数
low = 0 # 最低索引
high = 1000 # 最高索引
size = (100,) # 输出形状或索引数量
for _ in range(num_trails)
indices = np.random.randint(low, high, size) # 从 low 到 high 随机生成 size 个整数
sample = dataset[indices] # 样本大小为 size (len(indices)) 的随机样本
stat = np.mean(sample) # 样本均值
scores.append(stat) # 样本均值
print(f’50th percentile (median) = {round(np.median(scores), 3)}’) # 样本均值的中位数
print(f’mean of sample means = {round(np.mean(scores), 3)}’) # 样本均值的均值
# 95% 置信区间意味着从 2.5 到 97.5 百分位数
lower_p = alpha / 2
lower_bound = max(0.0, np.percentile(scores, lower_p)) # 第 2.5 百分位数
print(f’The {lower_p}th percentile = {round(lower_bound, 3)}’)
upper_p = alpha / 2 + confidence_level
upper_bound = min(1.0, np.percentile(scores, upper_p)) # 第 97.5 百分位数
print(f’The {upper_p}th percentile = {round(upper_bound, 3)}’)
真实统计均值有 95% 的可能性落在 0.721 到 0.779 的范围内。样本均值的均值 0.75 落在该区间内。
你好 Cyprian……如果有什么具体问题我们可以帮助你,请告诉我们。
只是补充这种方法(非参数方法)的基本原理。数据集在绘制时不是正态或高斯分布。但是,样本均值,在这种情况下是 500 个样本均值,保存为分数,是高斯或正态分布的。这就是所谓的中心极限定理。然后我们可以将参数方法应用于分数,因为条件现在满足了。
感谢您的反馈,Cyprian!
非常棒的反馈,Cyprian!
import seaborn as sns
import matplotlib.pyplot as plt
# 这不是正态或高斯分布
plt.figure(figsize = (10, 5))
sns.distplot(dataset, kde = True)
plt.show()
# 这是正态分布
plt.figure(figsize = (10, 5))
sns.distplot(scores, kde = True)
plt.show()
感谢这篇精彩的文章。
计算分类准确率置信区间的公式仅适用于二元分类吗?我可以在多类别分类中使用它吗?
你好 Mado...以下资源可能对你有用
https://machinelearning.org.cn/report-classifier-performance-confidence-intervals/
我有两个模型。ModelA 和 ModelB 的准确率分别为 58% 和 65%。推断数据集大小为 14000。我需要计算两样本比例差异检验的置信区间(或类似的东西)。谁能告诉我这里应该做什么检验?
(我曾想过使用配对 T 检验,但我的情况是二元结果 0 或 1。所以对哪种检验适用于我感到非常困惑)
你好 David...以下资源可能对你有用
https://sebastianraschka.com/blog/2022/confidence-intervals-for-ml.html
感谢您这篇精彩的帖子。
在交叉验证过程中,我尝试通过对 AUC 值进行自举来获取每个折叠的置信区间。
但是你上面看到,我更喜欢选择一个模型,然后使用自举估计重新评估它。
这意味着,不是将自举过程包含在交叉验证过程中,而是单独获取训练集、验证集和测试集来执行自举估计。
我理解得对吗?如果我的理解是正确的,为什么要重新评估呢?
你好 Jae...是的,看起来你已经正确理解了将自举过程与交叉验证过程分离以评估模型的概念。以下是对你可能选择在执行交叉验证后使用自举估计重新评估模型的原因的细分,以及这与在交叉验证的每个折叠中包含自举有何不同。
### 交叉验证和自举:不同的方法
**交叉验证**
– **目的**:交叉验证的主要目的是通过使用数据集的不同分区作为训练集和验证集来估计模型对未见数据的泛化能力。此技术有助于缓解过拟合,并提供模型在实践中预期表现的感觉。
– **方法**:在 k 折交叉验证中,数据被分为 k 个子集。模型在 k-1 个子集上进行训练,并在剩余的子集上进行验证。此过程重复 k 次,每个子集作为验证集仅使用一次。
**自举**
– **目的**:自举,特别是在重新评估时使用,旨在评估模型预测性能(例如,AUC 分数)的变异性。通过有放回地重新采样数据,它可以估计估计器(如 AUC)的分布并计算置信区间。这有助于理解模型预测的稳定性和可靠性。
– **方法**:在模型被选择后(通常通过交叉验证过程),自举重采样应用于数据集(这可以是一个单独的测试集或整个数据集,具体取决于情况),以生成许多模拟样本。模型在这些样本上的性能指标被重新计算,以估计其变异性和置信区间。
### 为什么要使用自举重新评估?
1. **估计性能变异性**:交叉验证提供跨折叠的平均性能指标,但它本身不提供此估计的变异性或置信度的度量。自举重采样允许计算估计性能指标周围的置信区间,从而深入了解模型性能的稳定性。
2. **测试不同样本下的稳定性**:通过使用自举,您可以测试模型在略微不同的数据样本下如何执行。这模拟了在实际场景中拥有不同数据集的效果,并且可以揭示仅通过交叉验证可能不明显的模型中的依赖性或偏差。
3. **对抗过拟合的鲁棒性**:在通过交叉验证选择模型后,使用自举重新评估模型可以进一步防止过拟合。它检查所选模型不仅在不同折叠中表现良好,而且在许多重采样数据集中仍然有效。
4. **实践洞察**:自举置信区间为决策制定提供实践洞察,例如了解模型性能指标可能落在的范围。这在医学或金融等风险敏感应用中可能至关重要。
通过将用于模型选择的交叉验证过程与用于性能评估的自举过程分离,您可以最大限度地利用可用数据进行训练/测试和稳定性评估。这种双重方法可以对模型在不同场景中的平均性能和一致性进行彻底评估。