在为分类问题选择机器学习算法后,您需要向利益相关者报告模型的性能。
这很重要,因为这样您可以为模型在新数据上的表现设定预期。
一个常见的错误是仅报告模型的分类准确率。
在本文中,您将学习如何计算模型性能的置信区间,从而为模型的技能提供经过校准且可靠的指示。
通过我的新书《机器学习统计学》启动您的项目,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

如何用置信区间报告分类器性能
照片由 Andrew 拍摄,保留部分权利。
分类准确率
分类机器学习算法的技能通常以分类准确率来报告。
这是所有预测中正确预测的百分比。计算方法如下:
1 |
分类准确率 = 正确预测数 / 总预测数 * 100.0 |
分类器的准确率可能是 60% 或 90%,其好坏程度仅在问题域的上下文中才有意义。
分类错误
在与利益相关者谈论模型时,谈论分类错误或直接说错误可能更相关。
这是因为利益相关者假设模型表现良好,他们可能真正想知道模型容易犯错的程度。
您可以将分类错误计算为错误预测数占总预测数的百分比,表示为 0 到 1 之间的值。
1 |
分类错误 = 错误预测数 / 总预测数 |
分类器的错误可能是 0.25 或 0.02。
此值也可以通过乘以 100 转换为百分比。例如,0.02 将变为 (0.02 * 100.0) 或 2% 的分类错误。
验证数据集
您使用什么数据集来计算模型技能?
最好将验证数据集从建模过程中分离出来。
这意味着从可用数据中随机选择并移除一部分数据样本,以便在模型选择或配置期间不使用它。
在训练数据上准备好最终模型后,可以使用它在验证数据集上进行预测。这些预测用于计算分类准确率或分类错误。
需要机器学习统计学方面的帮助吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
置信区间
与其仅呈现一个误差分数,不如计算置信区间并将其作为模型技能的一部分进行呈现。
置信区间包含两部分:
- 范围。这是模型技能的下限和上限。
- 概率。这是模型技能落在该范围内的概率。
总的来说,分类误差的置信区间可以按以下方式计算:
1 |
误差 +/- 常数 * sqrt( (误差 * (1 - 误差)) / n) |
其中误差是分类误差,常数是定义所选概率的常数值,sqrt 是平方根函数,n 是用于评估模型的观测数(行数)。从技术上讲,这称为威尔逊得分区间。
常数值来自统计学,常用的值是:
- 1.64 (90%)
- 1.96 (95%)
- 2.33 (98%)
- 2.58 (99%)
使用这些置信区间会做出一些假设,您需要确保您能满足这些假设。它们是:
- 验证数据集中的观测值是从该域独立抽取的(例如,它们是独立同分布的)。
- 至少使用了 30 个观测值来评估模型。
这是基于一些抽样理论的统计学原理,该原理将分类器的误差视为二项分布,我们有足够的观测值来近似二项分布的正态分布,并且根据中心极限定理,我们分类的观测值越多,就越接近真实但未知的模型技能。
置信区间示例
考虑一个在包含 50 个样本的验证数据集(n = 50)上误差为 0.02(误差 = 0.02)的模型。
我们可以计算 95% 置信区间(常数 = 1.96),如下所示:
1 2 3 4 5 |
误差 +/- 常数 * sqrt( (误差 * (1 - 误差)) / n) 0.02 +/- 1.96 * sqrt( (0.02 * (1 - 0.02)) / 50) 0.02 +/- 1.96 * sqrt(0.0196 / 50) 0.02 +/- 1.96 * 0.0197 0.02 +/- 0.0388 |
或者,换句话说:
模型在看不见的数据上的真实分类误差有 95% 的可能性会落在置信区间 [0.0, 0.0588] 内。
请注意,分类误差的置信区间必须截断为 0.0 和 1.0。不可能出现负误差(例如小于 0.0)或大于 1.0 的误差。
进一步阅读
- 第五章,机器学习,1997
- 维基百科上的二项比例置信区间
- 维基百科上的置信区间
总结
在本文中,您了解了如何为分类器计算置信区间。
具体来说,你学到了:
- 在报告结果时,如何计算分类准确率和分类错误。
- 在计算要报告的模型技能时使用什么数据集。
- 如何为选定的似然水平计算分类误差的下限和上限。
您对分类器置信区间有任何疑问吗?
请在下面的评论中提出您的问题。
这个(置信区间)与 F1 分数有何不同?F1 分数被广泛使用,而且 IMHO 更容易理解,因为它是一个同时涵盖精确率和召回率的分数。
F1 是模型的技能度量。它可以是准确率或任何其他指标。
在本文中,我们讨论的是计算出的技能分数的置信度(不确定性)。
嗨,Jason,
感谢您发布的好文章。您报告的这个误差置信区间仅对应于二元分类。那么对于多类分类呢?
此致
一个非常好的问题。我预计您会使用 logloss 或 AUC,并报告这些指标的置信区间。
我明白了。
但是,我认为(AUC 或任何其他指标)的置信区间表达式会有所不同,因为这个过程不会用二项分布来描述。
对于多类分类,分布是否应该是多项分布?在这种情况下,误差置信区间的表达式是否会发生变化,我猜是这样。
此致
Elie
我明白了,是的,您是正确的。我建议采用一种经验方法来总结分布,使用引导法(一篇文章已安排)。
嗨,Jason,
非常好的文章。但我有一个问题。如果我们使用不同的技能度量(例如 F1 分数)来评估我们的模型,分类错误是否会有所不同?
谢谢
你好 Jonad,
不同的度量将以不同的方式评估技能。它们将从同一潜在模型错误中提供不同的视角。
这有道理吗?
是的,我当时就在想,分类误差公式(错误预测数 / 总预测数)可能会根据评估指标的不同而有所不同。现在我明白了。
谢谢
好文章!
如何将置信区间与交叉验证结合使用?
这是一个棘手的问题,我们通常对模型选择期间和最终模型呈现期间的模型技能的方差感兴趣。
通常使用 CV 分数的标准差来捕捉模型技能方差,也许这通常足够了,我们可以将置信区间留给呈现最终模型或特定预测?
我愿意接受更好的想法。
好的,谢谢!
最后一个问题:当我使用 k 折交叉验证时,“n”的值是等于所有观测值的数量还是所有观测值减去 k?
@Simone,AFAIK n 的值是一个经验值,通常选择为 5 或 10。Jason 在这篇帖子中(像往常一样)解释得非常清楚。
https://machinelearning.org.cn/k-fold-cross-validation/
哦,@Simone,顺便说一句,如果“n”等于所有观测值的数量,那么这是一种称为“留一法交叉验证”(LOOCV)的交叉验证类型,它使用原始样本中的单个观测值作为验证数据,其余观测值作为训练数据。
@Jason,关于这个呢?(我还没有完全读完,而且我还在努力理解它,但……嗯,我认为它可能也有效)
Mach Learn. 2018;107(12):1895–1922。在线发布于 2018 年 5 月 9 日。doi:10.1007/s10994-018-5714-4。PMCID:PMC6191021,PMID:30393425。用于高效准确交叉验证的预测集外预测的引导。Ioannis Tsamardinos,Iissavet Greasidou(通讯作者)和 Giorgos Borboudakis。
https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6191021/
是的,这是一个很好的方法。我有很多关于它的帖子,您可以从这里开始
https://machinelearning.org.cn/a-gentle-introduction-to-the-bootstrap-method/
我建议将其用于总结最终模型性能,而不是模型选择。CVV 更适合模型选择。
嗯,@Simone,从开发者的角度来看,如果您查看 scikit-learn 文档,然后阅读“3.1.1. 计算交叉验证指标”部分(https://scikit-learn.cn/stable/modules/cross_validation.html#computing-cross-validated-metrics),您会看到分数估计的 95% 置信区间报告方式与 Jason 在本帖中的说法一致。
我不明白为什么在 https://scikit-learn.cn/stable/modules/cross_validation.html#computing-cross-validated-metrics 中,他们只使用(标准差 * 2)来给出 k 折结果平均值的 CI。
因此,平均分数和分数估计的 95% 置信区间给出为:
>>> print(“Accuracy: %0.2f (+/- %0.2f)” % (scores.mean(), scores.std() * 2))
Accuracy: 0.98 (+/- 0.03)
是的,这是一种快速粗略的计算区间的方法,假设是高斯分布。
嗨 Jason
是否有用于计算 CI 和绘制它们的 R 代码?
谢谢
我敢肯定有,我手头没有,抱歉。
错误只是准确率的相反,难道不说这个会更简单吗?
这导致了一个基本问题,即准确率或分类误差本身通常是平庸的或无用的指标,因为数据集通常是不平衡的。因此,对该错误的信心同样无用。
我因为另一个原因发现了这篇帖子,我想找找是否有人像我一样,按类别概率对指标进行分组。当模型具有 0.9 的类别概率时,其精确度是多少?比如 0.6?这对于最终用户来说可能非常有用的信息,因为指标通常会根据类别概率而发生很大的变化。
是的,分类错误是分类准确率的倒数。
您可以使用不同的度量来克服不平衡问题。
https://machinelearning.org.cn/classification-accuracy-is-not-enough-more-performance-measures-you-can-use/
Thomas,我认为我做到了你所描述的那样。我编写了一个函数来计算不同概率阈值下的一系列不同性能指标,并将其存储在数据框中。这有助于我选择一个能够平衡业务需求的概率阈值。如果需要,我可以分享代码。
嗨,Jason,
好文章。在计算误差、AUC 或其他指标的置信区间时,需要指标的标准误差。我应该如何计算标准误差?
一个好问题,这是公式:
https://en.wikipedia.org/wiki/Standard_error
感谢您的回复。这是否意味着我需要通过多次运行(引导或交叉验证)来获得多个误差值来计算标准误差?
是的,如果您想计算引导结果分布的标准误差。
嗨,Jason,
我正在尝试对我的客户进行分组。例如,GAP HK、GAP US 应归入客户 GAP 组。
一些客户已经分组。例如 GAP HK 已分组到 GAP 下,但 GAP US 未分组。
我正在使用随机森林分类器。我将已分组的客户名称作为训练数据,将分组客户代码作为要预测的标签。
分类器正在按预期分配标签。我面临的问题是,即使客户名称与训练数据不完全匹配,分类器也会为客户分配标签或分组客户代码。它尽力匹配。这对我来说是个问题,因为我需要手动取消这些客户的分组。您能建议如何克服这个问题吗?是否有可能知道分类器对每个预测标签的正确概率?如果可能,那么我可以忽略概率较低的那些。
提前感谢您的建议。
也许您可以预测概率,并且只接受高概率的预测?
没有模型是完美的,我们必须预期会有一些错误。
https://machinelearning.org.cn/faq/single-faq/why-cant-i-get-100-accuracy-or-zero-error-with-my-model
尽管如此,这些想法也许可以帮助您提高模型的技能。
https://machinelearning.org.cn/machine-learning-performance-improvement-cheat-sheet/
嗨,Jason,
我不确定是否有人提过,但我发现了一个问题。您建议的基于置信区间的度量不是“威尔逊得分区间”。根据维基百科页面(该页面在本链接中引用)。它实际上是“正态近似区间”,在威尔逊得分段落上方。如果我错了,请纠正我。
谢谢
-Anish
谢谢 Anish。
嗨,Jason,
我对交叉验证与此方法的关系感兴趣。
拥有 150 个示例,我决定使用 100 次重复的 5 折交叉验证来了解我的分类器的行为。此时,我有了 100×5 个结果,我可以使用误差率的平均值和标准差来估计模型技能的方差。
mean(errorRate) +/- 1.96*(std(errorRate))
我可以使用平均误差率来估计真实误差(我将在看不见的数据上获得)的置信区间。
mean(errorRate) +/- const * sqrt( (mean(errorRate) * (1 – mean(errorRate))) / n)
两个问题
1. 您认为这种方法正确吗?
2. 在第二个方程中设置 n=150 是否正确,或者我应该使用每次 CV 折叠中使用的测试数据平均数量?
您有 5 次 5 折 CV 的结果。结果有些依赖,它们不是 iid 的。
您可以使用高斯置信区间,但要谨慎。您也可以使用引导法。
我在这里解释了更多
https://machinelearning.org.cn/confidence-intervals-for-machine-learning/
你好 Jason,感谢您发布关于机器学习置信区间/引导法的精彩文章。
假设您使用
A) 5 折 CV
B) 30 折 CV
进行模型评估。您选择最终模型,并在所有可用数据上训练它。
在每种情况下,报告最终模型技能的范围(不确定性)有哪些选择?
是否仍然应该保留一些数据点用于验证+二项置信区间?
使用引导置信区间是否为时已晚,因为最终模型已经训练完毕?
谢谢
我不确定是否理解您的问题?
选择一个最终模型,并使用首选方法来报告预期性能。这与您如何选择该模型无关。
谢谢 Jason。我发现您另一篇关于测试集和验证集区别的帖子非常有帮助。
我可以确认以上报告分类器性能及置信区间的程序是否适用于最终训练模型吗?如果是这样,那么似乎应该将提到的验证数据集称为测试集,以使其与链接帖子的定义一致?
是的。
嗨,Jason,
谢谢您的帖子!
在您的示例中,您使用了准确率和误差率,并计算了置信区间。
可以将“误差率”替换为例如精确率、召回率或 F1 分数吗?为什么可以或不可以?
例如,假设样本量为 50,f1 评分为 0.02。
这是否意味着……
模型在看不见的数据上的真实 F1 分数有 95% 的可能性会落在置信区间 [0.0, 0.0588] 内?
谢谢!
也许对某些评分可以。本示例中的示例特定于比率。我相信您可以将其用于其他比率,如精确率、召回率和 F1 分数。
嗨 Jason
感谢您的帖子。
如何在 python 中获取 AUC 曲线的标准误差?
我不确定是否理解。标准误差是指分布的统计量,我不确定如何为一个曲线计算它。
你好 Jason,
我想知道我是否可以计算召回率和精确率的置信区间。如果可以,您能否解释一下我该如何做?
非常感谢您,
此致
Lorenzo
是的,我认为引导法是一个不错的起点。
Jason 的又一篇优秀文章。谢谢。
“[0.0, 0.0588]”中可能有一个小笔误——我认为应该是 [0.0, 0.0388]。
谢谢。
不,0.02 + 0.0388 = 0.0588]
我正在运行一个分类器,训练集为 41,验证集为 14(共 55 个观测值)。我使用不同的随机数据切片作为训练集和测试集重复了 50 次。显然,我无法用这么小的验证集来计算置信区间。
但是,由于我使用不同的训练集和验证集切片重复运行,我能否获得 50 次测试的平均误差率并计算置信区间?
const * sqrt( (error * (1 – error)) / n)
N 将是 700(14*50)。如果我有 50 次测试,平均准确率为 77.4%(误差为 0.226),那么置信区间将是 0.26 和 0.2。
这可行吗?或者这些置信区间是否不可靠?
感谢您出色的文章。
Dan
为什么它们会不可靠?
您具体担心什么?每次试验的数据集选择?
布朗利先生,您好,
感谢您的及时回复,也很抱歉我的回复晚了。我正在处理社会科学数据,验证集相当有限。我担心如何为有限的验证样本确定置信区间。
我的一位朋友想出了一个解决方案,就是将所有准确率输出保留在一个向量中,然后像直方图一样绘制出来(我好像无法将直方图粘贴到此回复窗口中,但如有必要,可以通过电子邮件发送)。
通过查看准确率向量的第5个和第95个百分位数,我能否获得置信区间?
有放回地随机抽样(引导法)是否比无放回抽样有优势?
再次感谢
Dan
只是重复而不进行引导?我认为这种分布只能捕捉模型的方差,而不能捕捉数据的方差。
我鼓励您使用引导法来计算准确率得分的分布。
感谢您的及时回复。我目前使用的方法是子抽样。我随机选择不同的观测值作为训练集和验证集50次,并收集准确率得分以生成准确率得分的分布。我认为这称为子抽样。但我乐意改用引导法。
为了澄清一下,我是在对数据进行引导以划分训练集和验证集,对吗?这意味着训练集中的一个观测值也可能出现在验证集中。
您能否推荐一篇解释为什么引导法优于子抽样的文章(我已经占用您很多时间,非常感谢您迄今为止的所有帮助)
也许从这里开始
https://machinelearning.org.cn/a-gentle-introduction-to-the-bootstrap-method/
然后是这里
https://machinelearning.org.cn/calculate-bootstrap-confidence-intervals-machine-learning-results-python/
谢谢 Jason,
最后一个问题,
我的训练模型有以下输出,最好的调整后的邻居数量是5。
我通过创建重采样中准确率的直方图来创建置信区间。有没有办法子集化模型最佳调整的重采样结果(在这种情况下是k = 5)?
无预处理
重采样:引导(1000次重复)
样本量摘要:32、32、32、32、32、32、...
跨调优参数的重采样结果
k 准确率 Kappa
5 0.7262690 0.4593792
7 0.6830904 0.3830819
9 0.6655405 0.3522427
准确度用于使用最大值选择最优模型。
模型使用的最终值为 k = 5。
我建议使用一个带有选定配置和引导法的新程序来估计模型性能的置信区间。
抱歉,作为更新,我在train control方法中为returnResamp参数选择了‘final’。我认为这应该只保留最佳调整模型的重采样结果。
但通常当我检查重采样的平均值,mean(model$resample$Accuracy)时,平均值低于k=5的准确率(通常是0.65)。这是有原因的吗?我认为最佳调整重采样的平均准确率应该等于结果中的模型准确率。
在此之后,我保证不再打扰您(感谢您一直以来的耐心)
这对分类非常有用。
对于回归分析,我将如何计算置信区间?
我是否可以使用相同的公式,但用MAE代替分类错误,或者我应该使用RMSE?
好问题
可能使用误差得分的标准差,从平均值来看,例如+/- 2或3个标准差将涵盖系统的预期行为。
https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule
嗨 Jason,我的问题与此主题关系不大,只是略有涉及。
我有一个用于二元分类的神经网络(MLP),具有介于0和1之间的逻辑输出。每次运行,我都需要在测试集上调整我的阈值以最小化误分类。我的问题是,在呈现我的结果时,我是否应该多次运行,每次都调整阈值,然后取其他指标(如F1分数)的平均值,或者我根本不优化阈值?
嗯,好问题。
我会将测试视为对“系统”的评估,该系统包括模型和自动阈值调整程序。在这种情况下,对整个系统的结果进行平均是合理的,前提是您清楚地说明了您正在做什么。
太酷了!
嗨 @Jason,我有一个与此主题相关的问题。
在以下论文中 http://arno.uvt.nl/show.cgi?fid=147278,用户计算AUC标准差作为稳健性指标。
假设我进行了一个重复(10次)10折交叉验证实验,并通过马尔可夫链模型实现了预测。作为稳健性指标,我想计算测试集在各次运行/折叠上的AUC的标准差。
直观地说,相对较小的标准差意味着模型在区分转化与非转化方面产生了稳定的结果。
该项目基于10x10交叉验证程序,因此会产生100个AUC。
现在,为了导出总结模型的AUC SD,我认为过程应该是(论文中没有明确定义):
a. SD是根据实际折叠的AUC值在折叠之间计算的(我们得到10个SD,每个重复一个)。
b. 在步骤b1中获得的SD在各次运行之间进行平均(最后留下1个SD)。
然而,由于关于这个主题的文献不多,我想知道是否有人能验证上述推理。
任何帮助或建议都将不胜感激。
是的。
您应该收集所有重复和所有折叠的AUC得分样本。然后计算平均值和标准差等汇总统计数据。
Wilson分数是不同的,您描述的是根据维基百科的“正态近似区间” https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval#Normal_approximation_interval
Wilson分数区间是不对称的。
谢谢。
对于不平衡数据集的二元分类问题,当无法平衡数据时,如何计算置信区间?
没有区别。
另外,请看这个:
https://machinelearning.org.cn/confidence-intervals-for-machine-learning/
谢谢 Jason – 很棒的文章!
关于样本量最小要求,使(样本)错误率满足正态分布近似的一个后续问题 ->
我看到一些帖子/幻灯片提到CLT,它们指出-为了使二项分布的样本比例(或
平均值或错误率)近似于正态分布(以计算置信区间),它应该遵循以下两个条件:
np > 10
n(1-p) > 10
例如,参考 http://homepages.math.uic.edu/~bpower6/stat101/Sampling%20Distributions.pdf
在当前示例中,对于样本量(n)=50且错误率=0.02,n*p (50 * 0.02 = 1) 不满足 np > 10。
在这种情况下,我们是否应该增加n以满足上述要求(或者)我是否遗漏了什么?
感谢分享。
也许可以尝试增加样本量,看看它是否会影响结果。
如何使用交叉验证计算CI?我们是否使用CI来汇总平均结果?n值是测试部分还是它们的总和?在 https://scikit-learn.cn/stable/modules/cross_validation.html#computing-cross-validated-metrics 中使用的公式,通过乘以std * 2并不清楚。
您可以使用引导法来获得可靠的估计。
也许是不可靠的估计,是否有参考或论文/书籍说明这个公式的来源?CV会给我一个[acc1, acc2, acc3, … acc30]的准确率列表,我只需要计算平均值+/- 2 * std来表示CI(CI = 2* std)。“n”值或1.96 z值呢?
是的,在这里
https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule
非常感谢您的评论……那么您对此场景有何看法?
第一步 – 将数据分为训练/验证集80/20,并使用训练集(80%)进行交叉验证,以获取作为均值和标准差的性能指标。
第二步 – 使用引导法在剩余的20%数据上训练最终模型,并计算带有置信区间的性能。
这是一个有效的场景吗?有什么建议吗,或者我可以使用嵌套交叉验证来完成?在CV循环内进行引导是否有效?
我不确定我是否喜欢它 – 除非您有大量数据。但如果它对您有效,那就去做吧!
嵌套CV适用于在单个测试框架中选择模型和超参数。
用于报告的最终评估可以是您拥有的整个数据集的引导。
关于这个公式的讨论正在进行中: https://github.com/scikit-learn/scikit-learn/issues/6059
这篇文章的结论是,在交叉验证方案中无法计算可靠的CI。那十几篇展示CV结果CI的论文呢?
它们很可能是在总结CV过程本身的平均值和标准差。这很常见。
在您的教程中,CI是基于单个训练/测试分割执行计算的,但对于重复执行,例如30次,情况如何?
我没听懂,你具体是什么意思?
抱歉,我正在阅读 https://machinelearning.org.cn/confidence-intervals-for-machine-learning/ 并且评论错了地方。 🙂
嗨,Jason,
error * (1 -error) 这个项是什么意思?
您可以在“进一步阅读”部分找到更多关于此项的来源和推导方式。
你好 Jason,
如果我需要为现有模型的预测提供CI,并且报告的错误是测试样本的MAE,您有什么建议吗?感谢您的时间。
对于置信区间,您需要找到标准误差。我不知道如何获得它,但请参阅此讨论: https://stats.stackexchange.com/questions/421967/can-mae-be-interpreted-as-the-average-standard-deviation-around-the-true-value-o
嗨 Jason
感谢您的帖子。
您能指导我如何将CI应用于F1分数吗?
我应该使用Bootstrap,还是可以使用这个公式?
F1 +/- const * sqrt( (F1* (1 – F1)) / n)
嗨 Bahar……以下资源应该能帮助您更清楚地了解。
https://www.educba.com/confidence-interval-formula/
您好,Jason,
CI是否报告了仅在同一数据集上训练的多个分类器的性能?我有一个相反的场景。
有两个数据集(i)由GAN生成的数据和(ii)原始数据。SVM已在这两个数据集上进行了训练。
现在,我可以使用CI来比较这两个结果的性能吗?(i)在人工数据上训练的SVM和(ii)在原始数据上训练的SVM?