嵌套交叉验证后如何建立最终模型并调整概率阈值?

机器算法验证 机器学习 交叉验证 模型选择 网络 超参数
2022-01-18 01:08:21

首先,很抱歉在此处此处此处此处此处发布已详细讨论过的问题,以及重新加热一个旧话题。我知道@DikranMarsupial 已经在帖子和期刊论文中详细讨论过这个主题,但我仍然感到困惑,从这里类似帖子的数量来看,这仍然是其他人难以掌握的东西。我还应该声明,我收到了关于这个话题的矛盾,这增加了我的困惑。您还应该知道,我原本是物理学家而不是统计学家,所以我在这里的领域专业知识有些有限。我正在写一篇期刊论文,我想在其中使用嵌套 CV 来估计我可以从最终模型中获得的性能。在我的领域,这是第一次。(我们几乎从不使用任何在我的领域中稳健的简历形式,但很高兴地从使用神经网络和增强决策树的研究中抽出论文!)因此,非常重要的是我有一个非常彻底和清晰的理解,这样我就不会搞砸和传播对我的社区来说是一个错误的程序,可能需要数年才能忘记!谢谢!继续问...

嵌套交叉验证后如何构建最终模型?

我正在用 L1 和 L2 正则化训练一个简单的 glmnet 模型。它快速、简单且易于解释。我执行特征中心、缩放和 Box-Cox 转换,以使特征分布以均值为中心、标准化并且有点像高斯分布。我在交叉验证中执行此步骤,以防止信息泄露。纯粹是因为我的硬件非常慢,而且我没有更多的 CPU 资源,所以我还在特征预处理后在 CV 中执行基于过滤器的快速特征选择。我正在使用随机网格搜索来选择 alpha 和 lambda 超参数。我明白我不应该CV 循环来得到这个估计。我知道内部 CV 循环用于模型选择(在本例中为最佳超参数),而外部循环用于模型评估,即内部和外部 CV 用于两个不同的目的,这些目的经常被错误地混为一谈。(到目前为止我过得怎么样?)

现在,我发布的链接表明“考虑交叉验证的方法是估计使用构建模型的方法获得的性能,而不是估计模型的性能”。鉴于此,我应该如何解释嵌套 CV 过程的结果?

我读过的建议似乎表明以下内容 --- 如果这是错误的,请纠正我:内部 CV 是允许我选择我的 glmnet 模型的最佳 alpha 和 lambda 超参数的机制的一部分。如果我完全按照内部 CV 中使用的过程(包括超参数调整使用整个数据集来构建最终模型)应用程序,外部 CV 告诉我可以从最终模型中获得的估计值。也就是说,超参数调优是“构建模型的方法”的一部分。这是正确的还是不正确的?因为这让我很困惑。在其他地方,我看到构建要部署的最终模型的过程涉及使用固定值对整个数据集进行训练使用 CV 选择的超参数。这里,“模型构建方法”不包括调优。那么,它是什么?在某些时候,选择并固定最佳超参数以构建最终模型!在哪里?如何?如果我的内部循环是 5 倍 CV,而我的外部循环是 5 倍 CV,并且我选择 100 个点作为内部 CV 中随机网格搜索的一部分进行测试,那么我实际训练 glmnet 多少次模型?(100 * 5 * 5) + 1 用于最终构建,还是有更多我不知道的步骤?

基本上,我需要非常清楚地描述如何从嵌套 CV 中解释性能估计以及如何构建最终模型。

我还想知道选择概率阈值的适当程序,以将我的最终 glmnet 模型中的概率分数转换为(二进制)类标签——需要另一个 CV 循环吗?

3个回答

嵌套交叉验证解释没有嵌套

以下是我如何看待(嵌套)交叉验证和模型构建。请注意,我是化学家,就像您从应用程序方面到模型构建过程一样(见下文)。我的主要观点是从我的角度来看,我不需要专门的嵌套各种交叉验证。我需要一个验证方法(例如交叉验证)和一个模型训练函数:

model = f (training data)

“我的”模型训练函数f 不需要任何超参数,因为它在内部进行所有超参数调整(例如,您的alphalambdathreshold

换句话说,我的训练函数可能包含任意数量的内部交叉验证(或袋外或任何我认为有用的性能估计)。但是,请注意,参数超参数之间的区别通常是超参数需要根据手头的数据集/应用程序进行调整,而无论数据是什么,都可以拟合参数。g (training data, hyperparameters)因此,从新分类算法的开发者的角度来看,如果给定数据和超参数, 只提供拟合参数的“裸”拟合函数 ( ) 确实有意义。

拥有“外部”训练功能的关键f在于,在您进行交叉验证运行后,它为您提供了“在整个数据集上”进行训练的直接方法:只需使用f (whole data set)而不是调用f (cv split training data)交叉验证代理模型。

因此,在您的示例中,您将有 5+1 次对 的调用f,并且每个对 的调用f都会有例如 100 * 5 次对 的调用g


概率阈值

虽然您可以通过另一个交叉验证来做到这一点,但这不是必需的:它只是您的现成模型具有并且可以在内部估计的另一个超参数f

您需要修复它的是一种启发式方法,它允许您计算这样的阈值。有各种各样的启发式方法(来自 ROC,并指定了避免误报与在最小可接受的敏感性或特异性或 PPV 或 NPV 上允许两个阈值以及因此“不确定”(NA)水平等方面的误报相比的重要性) 适用于不同情况 - 好的启发式方法通常是非常特定于应用程序的。

但是对于这里的问题,您可以在内部执行此操作f,例如使用内部交叉验证期间获得的预测来计算 ROC,然后相应地找到您的工作点/阈值。


对部分问题的具体评论

我知道我不应该报告用于选择最佳超参数的 CV 的性能作为对我的最终模型的预期性能的估计(这会过于乐观),而是应该包括一个外部 CV 循环来获得这个估计.

是的。(尽管内部估计确实携带了与外部估计相关的信息:如果它比外部估计更乐观,则通常是过度拟合。)

我了解内部 CV 循环用于模型选择

任何类型的数据驱动模型调整,真的 -> 包括调整你的截止阈值。

(在这种情况下,最优超参数)和外循环用于模型评估,即内部和外部 CV 服务于两个不同的目的,这些目的经常被错误地混为一谈。

是的。

也就是说,超参数调优是“构建模型的方法”的一部分。

我也更喜欢这样看:我是化学家,就像您从应用程序方面看一样:对我来说,没有超参数,训练/拟合的模型是不完整的,或者更准确地说,模型是我可以直接使用的东西获得预测。尽管您注意到其他人有不同的看法(没有超参数调整)。以我的经验,开发新模型的人经常出现这种情况:超参数调整是一个“已解决的问题”,没有被考虑。(旁注:他们对交叉验证在验证方面可以做什么的看法也与交叉验证在应用程序方面可以做什么略有不同)。

所以,首先,这是一个基于上面@cbeleites 的答案、这个here以及问题本身的答案(所有这些贡献都帮助我理解了)。它没有任何原创内容,虽然对我来说很有意义,但我仍然是这个主题的学生,所以我不是 100% 确定它。因此,感谢任何反馈。但是,它给出了一个具体的例子,所以我认为理解上面表达的概念可能会很有用。

作为模型构建者,我们需要提供模型和对其性能的估计。类似地,如果我们购买电流计,我们会连同物品一起出售包含其规格的手册。

我假设 C 参数在 [0.1,10] 范围内的 SVM 是一个很好的模型,并且准确度是手头案例的一个很好的性能度量。

我们要在 0.1、1、10 之间选择最佳 C 参数。

这些是步骤及其解释:

1- 我们首先对所有数据实施嵌套交叉验证(参见此处了解使用 sklearn 的示例)。这一步的目的是估计我的最终模型(我还没有拟合)的性能/准确性,或者更确切地说是我的拟合过程。称它为.将是来自不同但等效模型(即具有不同参数和 {0.1, 1, 10} 中的超参数 C 的模型)的精度的平均外层折叠aa

1b- 在继续之前,我应该检查模型稳定性并且我没有过度拟合,如此所述。

2-我现在对所有数据实施交叉验证以确定最佳 C。我假设我得到 C=c

3-我最终使用所有数据来拟合我的 SVM 与 C=这是我能做到的最好的模型,所以我交付了它。我还会告诉我的客户,它的准确度为,这是我在步骤 1 中估计的。c a

我认为您的以下理解是合理的:

现在,我发布的链接表明“考虑交叉验证的方法是估计使用构建模型的方法获得的性能,而不是估计模型的性能”。鉴于此,我应该如何解释嵌套 CV 过程的结果?

嵌套 CV 对模型构建过程进行验证。(它不验证最终模型。)不仅嵌套 CV,而且没有嵌套循环的普通 CV 也做同样的事情。普通 cv 验证模型构建过程,但不给出最终模型进行预测。我们需要使用普通 cv 之后的全部数据来构建最终模型。

如果我们将嵌套的 cv 视为与普通 CV 平等的基础,我们需要在嵌套交叉验证过程之后用整个数据重新拟合最终模型。但是超参数部分使问题复杂化。我们最好不要对同一数据同时进行超参数调整和模型参数优化,以避免选择偏差。我的建议是,我们将整个训练数据分成两部分以进行最终模型拟合:最终训练样本和最终验证样本。我们将模型拟合到最终的训练样本中,并选择具有最终验证样本的超参数。我们将选定的模型视为我们的最终模型。我们在测试集上测试我们的最终模型并得到我们想要的预测。