机器学习和神经网络 - 页 72

 

10.2 超参数(L10:模型评估3)



10.2 超参数(L10:模型评估3)

在深入研究交叉验证之前,让我们花点时间讨论一下超参数。您可能已经熟悉这个概念,但如果不熟悉,这将作为有用的回顾。超参数可以被认为是模型或算法的调整参数或设置。它们是您手动调整以优化模型性能的选项。为了说明这一点,让我们考虑 K 最近邻分类器,一个非参数模型。

与参数模型不同,非参数模型没有预定义的结构。相反,他们依靠训练集来定义模型的结构。例如,在 K 最近邻中,模型的参数本质上就是训练样本本身。因此,改变训练集,例如通过添加或删除示例,可以显着影响模型的结构。非参数模型的另一个示例是决策树,其中树中的拆分数取决于训练示例,而不是预定义的结构。

现在,让我们特别关注 K 最近邻算法的超参数。这些超参数包括诸如邻居数量 (K) 和使用的距离度量(例如,曼哈顿或欧几里得距离)之类的选项。这些选项需要在运行模型之前设置,并且不是从数据中学习的。在本课程中,我们将探索网格搜索或随机搜索等技术来协助超参数调整。然而,重要的是要注意,尝试超参数的不同值并不是将它们拟合到数据的过程,而是寻找最佳设置的迭代实验。

为了提供更多示例,让我们参考 scikit-learn 中超参数的定义。在初始化决策树分类器时,超参数可以包括杂质度量(例如,基尼系数或熵)、预修剪树的深度以及每片叶子的最小样本数等。这些都被认为是超参数。

值得注意的是,并非所有选项都是超参数,但所有超参数都是选项。例如,决定模型随机性的随机状态或随机种子不是超参数。这是不应该被操纵来改进模型的东西,因为改变随机种子以获得更好的性能会被认为是不公平的。

现在,让我们将超参数与模型参数进行对比。例如,我们简单看一下逻辑回归,它可以看作是一个线性模型,作为经典机器学习和深度学习的入门。在逻辑回归中,输入是特征,包括用于解释偏差的截距项。基于特征数量确定的模型权重构成了模型的结构。最初,这些权重可以设置为零或较小的随机值,然后迭代更新它们以最小化损失函数(例如,线性回归中的均方误差)。

在逻辑回归中,将非线性函数(通常是逻辑函数或 S 型函数)应用于净输入(输入的加权和)以将其压缩到 0 到 1 之间的范围内。该输出可以解释为二元分类中的类成员概率。调整权重以最小化损失,这是通过将预测的类成员概率与真实类标签(0 或 1)进行比较来计算的。逻辑回归还采用了正则化技术,例如 L1 或 L2 正则化,这些技术根据权重的大小添加惩罚项以防止过度拟合。正则化强度(lambda)是一个需要用户设置的超参数。

总而言之,逻辑回归中的权重 (W) 等模型参数是从训练数据中学习的,而正则化强度 (lambda) 等超参数是由用户确定的,而不是从数据中学习的。模型参数是模型的内部变量,在训练过程中更新以优化性能,而超参数是控制模型行为的外部设置,需要在训练前设置。

为超参数找到最佳值的过程称为超参数调整。这是机器学习中的重要一步,因为它可以极大地影响模型的性能。然而,找到最佳超参数值并不是一项简单的任务,通常需要对不同组合进行实验和评估。

超参数调整的一种常见方法是网格搜索,其中为每个超参数指定一组预定义的值,并使用交叉验证评估所有可能的组合。交叉验证是一种用于评估模型性能的技术,方法是将数据分成多个子集(折叠),在某些折叠上训练模型,并在剩余的折叠上对其进行评估。这有助于估计模型在未见数据上的性能并降低过度拟合的风险。

另一种方法是随机搜索,其中超参数值的随机组合是从指定分布中采样的。当超参数的搜索空间很大时,这会很有用,因为它允许探索更广泛的值,而无需详尽评估所有可能的组合。

除了网格搜索和随机搜索之外,还有更先进的超参数调整技术,例如贝叶斯优化,它使用概率模型来指导搜索过程,以及遗传算法,它模仿自然选择的过程来进化出最佳的一组超参数。

值得注意的是,超参数调整的计算成本可能很高,尤其是对于复杂模型或大型数据集。因此,它通常与交叉验证等技术结合使用,以最有效地利用可用数据。

超参数是模型的设置或选项,需要在训练前设置,而模型参数是在训练过程中从数据中学习到的内部变量。超参数调整是为这些设置找到最佳值的过程,它对于优化模型性能至关重要。网格搜索、随机搜索、贝叶斯优化和遗传算法等技术通常用于超参数调整。

 

10.3 用于模型评估的 K 折 CV(L10:模型评估 3)



10.3 用于模型评估的 K 折 CV(L10:模型评估 3)

在本视频中,我们将深入探讨模型评估的交叉验证主题。交叉验证通常与超参数调整和模型选择结合使用。但是,为了便于更好地理解,在讨论 k 折交叉验证在模型选择中的应用之前,让我们首先探讨 k 折交叉验证如何在模型评估的上下文中发挥作用。

首先,用于模型评估的 k 折交叉验证涉及将数据集拆分为验证折,其余数据段用于训练。在一个典型的例子中,让我们考虑五重交叉验证。数据集分为验证折叠(以蓝色显示)和四个训练折叠(以不同颜色显示)。该模型在训练折叠上进行训练,并在验证折叠上进行评估,从而产生性能指标。与仅使用一个验证集的 holdout 方法不同,在 k 折交叉验证中,验证折通过数据的不同部分轮换。这确保所有数据点都用于评估。在五折交叉验证的情况下,有五个不同的验证折,并执行五次迭代。每次迭代都会产生一个性能度量。在报告整体性能时,典型的方法是对所有迭代的性能值进行平均。

需要注意的是,在本次讨论中,我们专注于模型评估的 k 折交叉验证,而不考虑超参数调整。在这种情况下,通过交叉验证获得的性能估计可以被认为是对模型泛化性能的估计。通过使用固定的超参数在整个数据集上训练新模型,我们可以获得最终的模型以供实际使用。虽然可以使用独立的测试集来进一步评估模型的性能,但在不涉及超参数调整的情况下通常没有必要,因为交叉验证性能已经提供了对泛化性能的可靠估计。

现在,让我们探讨 k 折交叉验证的一些关键属性。验证折叠是非重叠的,这意味着在不同迭代中验证折叠中的数据点之间没有重叠。所有数据点都用于测试,确保全面评估。一些研究人员可能将验证折叠称为测试折叠,因为这些术语可以互换使用。

另一方面,训练折叠是重叠的,这意味着它们不是相互独立的。在给定的迭代中,训练数据可能与来自其他迭代的训练数据有重叠样本。这种特性使得基于不同训练集估计方差具有挑战性,这对于理解模型的性能可变性很重要。

另一个值得注意的方面是,减小 k 的值(折叠数)会使性能估计更加悲观。这是因为每次折叠中可供训练的数据点较少,模型的拟合能力受到限制。由于数据被隐瞒,性能估计变得更加悲观,正如我们之前对性能悲观主义的解释中所讨论的那样。

让我们探讨 k 折交叉验证的两个特例。当 k 等于 2 时,我们有两次交叉验证,这与 holdout 方法不同。在双重交叉验证中,数据集被精确地分成两半,每一半用于不同迭代的训练。相反,holdout 方法允许任意拆分比例并且不涉及迭代之间的旋转。然而,每一轮 k 折交叉验证都可以被认为是 holdout 方法的一个特例,其中数据集被精确地分成两半。

另一种特殊情况是当 k 等于 n 时,会导致留一法交叉验证 (LOOCV)。在 LOOCV 中,每次迭代都会留下一个数据点作为验证集,而剩余的 n-1 个数据点用于训练。这种方法也称为 LOOCV,其中验证集仅包含一个数据点。

霍金斯等人进行的一项研究。 (2003) 检查了不同模型评估方法的性能,包括留一法交叉验证 (LOOCV),发现与其他交叉验证方法相比,LOOCV 往往具有高方差。这种高方差可归因于以下事实:LOOCV 中的每个验证折叠仅包含一个数据点,从而导致用于评估的样本量有限。因此,从 LOOCV 获得的性能估计可能对每次迭代中选择用于验证的特定数据点高度敏感。

尽管方差很大,LOOCV 还是有一些优势。由于每次迭代都涉及对 n-1 个数据点的训练,其中 n 是数据点的总数,LOOCV 倾向于提供模型性能的无偏估计。此外,LOOCV 利用所有可用数据进行训练,这在数据集较小或需要更精确的性能估计时非常有用。

然而,由于其计算复杂性,LOOCV 对于大型数据集可能不可行。训练过程需要重复n次,计算量很大。在这种情况下,通常首选 k 值适中的 k 折交叉验证。

现在我们已经探索了用于模型评估的 k 折交叉验证,让我们简要讨论一下它在模型选择中的应用。在模型选择的上下文中,目标是从一组候选模型中识别最佳模型,通常具有不同的超参数设置。交叉验证可用于估计每个模型的性能并促进选择过程。

典型的方法是对每个模型执行 k 折交叉验证,计算所有迭代的平均性能,然后比较结果。具有最高平均性能的模型被认为是最佳选择。这种方法有助于减轻数据可变性的影响,并提供更可靠的模型评估。

总而言之,交叉验证是一种用于模型评估和选择的有价值的技术。通过在数据的不同部分系统地旋转验证折叠,它可以进行全面评估并提供模型性能的估计。无论是单独用于模型评估还是与模型选择结合使用,交叉验证都有助于研究人员和从业者就其模型的泛化能力做出明智的决策。

 

10.4 用于模型评估的 K 折 CV——代码示例(L10:模型评估 3)



10.4 用于模型评估的 K 折 CV——代码示例(L10:模型评估 3)

在上一个视频中,我们讨论了 k 折交叉验证作为评估机器学习模型的方法。在本视频中,我们将探索如何使用 scikit-learn 库在 Python 中实现 k 折交叉验证。我已将代码笔记本上传到 GitHub,您可以在此处找到链接。

让我们从加载必要的库并检查它们的版本开始。我们将导入常用库 NumPy 和 matplotlib。接下来,我们将使用 scikit-learn 中模型选择子模块中的 k 折类来演示 k 折交叉验证的使用。

为了确保可重复性,我们使用随机数生成器对象设置随机种子。然后我们创建一个简单的数据集,其中包含零类的五个标签和一类的五个标签。此外,我们生成了一个包含 10 个输入和四个特征的随机数据集。值得注意的是,这只是一个用于说明目的的随机数据集,您可以使用您喜欢的任何数据集,例如 iris 数据集。

接下来,我们初始化一个 k-fold 对象,我们将其命名为 cv(交叉验证的缩写)。我们将拆分数 n_splits 设置为 5,表示我们将执行五折交叉验证。让我们使用 split 方法检查这个 k-fold 对象的行为。当我们执行这个方法时,我们得到五个结果,每个结果由一个包含两个数组的元组组成。第一个数组代表训练折叠,第二个数组代表验证折叠。

这些数组中的数字对应于数据集中样本的索引。例如,如果我们想获得第一个fold的训练集对应的实际标签,我们可以将这些索引作为索引数组来选择标签。同样,我们可以选择相应的特征。重要的是要注意训练和验证折叠中的标签可能不平衡,正如我们在本例中观察到的那样。

为了解决这个问题,建议在执行 k 折交叉验证之前对数据集进行洗牌。我们可以通过在初始化期间直接在 k-fold 对象中混洗数据集来实现这一点。通过设置随机状态和混洗,我们在训练和验证折叠中获得了更好的标签组合。

此外,通常建议对拆分进行分层,确保类标签的比例在每个折叠中保持一致。我们可以通过使用分层 k-fold 类而不是常规 k-fold 类来实现这一点。当我们使用分层 k-fold 时,每个折叠中标签的比例与原始数据集的标签比例相匹配。

讨论了 k-fold 和分层 k-fold 对象的一般行为后,让我们看看如何在实践中应用它们。我们将使用决策树分类器和鸢尾花数据集作为示例。首先,我们使用 train_test_split 方法将 iris 数据集拆分为 85% 的训练数据和 15% 的测试数据,以确保分层拆分。

接下来,我们按照 Ron Kohavi 关于交叉验证实用指南的论文的建议,初始化 k=10 的分层 k 折对象。然后,我们采用手动方法通过使用拆分方法迭代训练和验证索引来执行 k 折交叉验证。在每次迭代中,我们使用训练折叠来拟合一个新的决策树分类器并预测验证折叠的标签。我们计算每次迭代的准确性并将结果存储在占位符变量中。

迭代所有折叠后,我们通过将精度总和除以迭代次数来计算平均 k 折交叉验证精度。最后,为了在未见数据上评估模型,我们使用所有训练数据拟合一个新的决策树分类器,并计算测试集上的准确度。

在这种情况下,我们获得了 95.3% 的 k 折交叉验证精度和 95% 的测试集精度。这些结果表明我们的模型在交叉验证折叠和看不见的测试数据上都表现良好。

然而,手动迭代折叠和拟合模型可能有点麻烦。幸运的是,scikit-learn 提供了一种使用 cross_val_score 函数执行 k 折交叉验证的更方便的方法。该函数以模型、数据集和折叠数为输入,自动进行k折交叉验证,返回每折的分数。

让我们看看这在实践中是如何完成的。我们首先导入必要的库并加载 iris 数据集。接下来,我们创建一个决策树分类器的实例,并初始化一个 k=10 的分层 k-fold 对象。

然后我们使用 cross_val_score 函数,传入分类器、数据集和 k-fold 对象。此函数自动执行 k 折交叉验证、拟合模型并计算每个折的分数。默认情况下,cross_val_score 函数使用准确度指标,但您可以根据需要指定其他指标。

最后,我们打印每个折叠的交叉验证分数并计算平均分数。在这种情况下,我们获得了 95.3% 的平均交叉验证精度,这与我们手动获得的精度相匹配。

使用 cross_val_score 是执行 k 折交叉验证的一种更简洁有效的方法,因为它会自动处理整个过程。它还允许我们轻松更改折叠数或切换到不同的模型,而无需显着修改代码。

 

用于模型选择的 10.5 K 折 CV(L10:模型评估 3)


用于模型选择的 10.5 K 折 CV(L10:模型评估 3)

在前两个视频中,我们讨论了用于模型评估的 k 折交叉验证并检查了一些代码示例。现在,我们将重点关注用于模型选择的 k 折交叉验证。模型选择通常是 k 折交叉验证的常见用例,因为它允许我们调整超参数并选择性能最佳的超参数设置。

整个过程可以概括为五个步骤。但是,由于幻灯片上的空间有限,我将放大以下幻灯片中的每个步骤以提供更多详细信息。这五个步骤类似于我们之前讨论的用于模型选择的三重保留方法。

第 1 步:将数据拆分为训练集和测试集。这一步和之前一样,我们将数据集分为两部分,一部分用于训练,另一部分用于测试。我们现在将专注于训练集。

第 2 步:使用 k 折交叉验证应用具有不同超参数设置的学习算法。使用 k 折交叉验证评估每个超参数设置,例如决策树算法的最大深度。例如,我们可以按照 Ron Kohavi 的建议,使用 k=10 的 k 折交叉验证。此步骤为我们提供了每个超参数设置的不同性能估计。

第 3 步:选择性能最好的模型。基于从 k 折交叉验证获得的性能估计,我们可以确定性能最佳的超参数设置。例如,我们可能会发现最大深度为 5 在测试值中表现最好。我们选择此超参数设置为最佳。

第 4 步:将具有最佳超参数值的模型拟合到训练数据中。在确定最佳超参数设置后,我们使用整个训练数据集和选定的超参数重新训练模型。这确保了我们拥有一个具有最佳超参数值的模型。

第 5 步:在独立测试集上评估模型。为了估计模型的泛化性能,我们在训练或超参数选择过程中未使用的单独测试集上对其进行评估。这提供了对模型性能的公正评估。

或者,我们可以执行一个额外的步骤,在这个步骤中,我们用整个数据集上的最佳超参数值来拟合模型。此步骤基于这样的假设,即在对更多数据进行训练时,模型可能会表现得更好。

拥有独立的测试集对于避免选择偏差很重要。有时,超参数设置可能偶然在 k 折交叉验证上表现良好,从而导致过于乐观的估计。通过使用独立的测试集,我们可以获得对模型性能更可靠的评估。

此过程总结了模型选择的 k 折交叉验证。现在,让我们探讨一些在模型选择或超参数调整步骤中选择超参数的技术。

一种常见的方法是网格搜索,它仍然被广泛使用。网格搜索是一种详尽的搜索方法,您可以在其中定义要考虑的超参数值列表。例如,在 k-最近邻的情况下,您可以通过指定一个值列表(例如 3、5、6、7、8 和 9)来调整 k 的值。网格搜索评估每个模型的性能使用 k 折交叉验证的超参数组合。

网格搜索可以并行执行,允许同时评估多个超参数组合。但是,如果不是所有相关的超参数值都包含在预定义的网格中,它可能会遇到覆盖率低的问题。这对于连续超参数或跳过某些值时尤其成问题。

为了解决覆盖问题,随机搜索是一种从分布中对超参数值进行采样的替代方法。您可以定义分布(例如均匀分布、正态分布、指数分布、β 分布或二项分布)来对超参数值进行采样,而不是指定固定网格。随机搜索在探索超参数空间方面提供了更大的灵活性,并且可能覆盖更广泛的值。通过从分布中抽样,随机搜索允许更有效地探索超参数空间。

与网格搜索相比,随机搜索通常计算效率更高,因为它不会评估所有可能的组合。相反,它随机抽取超参数值的子集并使用 k 折交叉验证对其进行评估。可以预先指定迭代次数或样本次数。

随机搜索的优势在于它可以有效地搜索大型超参数空间,尤其是当某些超参数不如其他超参数重要时。它还可以处理连续和离散的超参数,而无需定义特定的网格。

网格搜索和随机搜索各有利弊。网格搜索保证覆盖定义网格内的所有组合,但它可能计算量大且可能不适合大型超参数空间。另一方面,随机搜索效率更高,但不能保证完全覆盖。

在实践中,网格搜索和随机搜索之间的选择取决于超参数空间的大小、可用的计算资源和手头的具体问题。

另一种超参数调整技术是贝叶斯优化。贝叶斯优化使用概率模型来模拟超参数和目标函数(例如,模型性能)之间的关系。它采用代理模型(例如高斯过程)来逼近目标函数,并使用获取函数来确定下一个要评估的超参数值。

贝叶斯优化基于代理模型对超参数值进行迭代采样,并根据评估的性能更新模型。它将搜索集中在超参数空间的有希望的区域,从而导致更有效的探索。

贝叶斯优化的优势在于它能够处理连续和离散超参数,以及非凸和非线性目标函数。它适应观察到的性能并智能地选择下一个超参数值进行评估,与网格搜索或随机搜索相比,它可能会以更少的评估收敛到最佳解决方案。

但是,贝叶斯优化的计算成本更高,尤其是对于大型数据集或复杂模型。它需要多次评估目标函数以更新代理模型并确定下一个要评估的超参数值。

总的来说,贝叶斯优化是一种强大的超参数调整技术,尤其是当超参数空间复杂且目标函数的评估成本很高时。

总之,k 折交叉验证是模型评估和模型选择的宝贵工具。它允许我们评估不同模型的性能并选择最佳的超参数设置。网格搜索、随机搜索和贝叶斯优化等技术可用于调整超参数并提高模型性能。方法的选择取决于超参数空间的大小、计算资源和手头的具体问题等因素。

 

10.6 用于模型评估的 K 折 CV——代码示例(L10:模型评估 3)



10.6 用于模型评估的 K 折 CV——代码示例(L10:模型评估 3)

是的,就像上次我们谈到模型评估的 k 折交叉验证一样。现在让我们仔细看看 k 折交叉验证的一些代码示例,但这次是用于模型选择。我将为您提供一些可以在 GitHub 上找到的代码示例。我还将包含 Piazza 和 Canvas 上的链接,以便您可以下载代码笔记本并稍后进行试验。

好吧,让我们进入代码笔记本。像往常一样,我们从水印开始检查我们正在使用的包的版本号。在本笔记本中,我们将重点关注网格搜索,这对于超参数调整和模型选择非常有用。对于此演示,我们将在 iris 数据集上使用决策树分类器。尽管 iris 数据集可能不是最令人兴奋的,但它使我们能够让事情变得简单。此外,在开始你的课堂项目之前,它将作为一个很好的实践,你将在课堂项目中处理更复杂的数据集。

我们首先将数据集拆分为训练集和测试集。按照惯例,我们使用 85% 的数据进行训练,15% 的数据进行测试。继续进行网格搜索,我们定义了两个超参数选项:最大深度和标准。 Max depth 表示决策树的最大深度,我们将其设置为 1、2、3、4、5 或 None(不限制最大深度)。标准表示衡量分裂质量的函数,我们评估“基尼”和“熵”。实际上,基尼系数和熵之间的选择几乎没有区别,但出于演示目的我们将其包括在内。

接下来,我们创建一个参数网格,指定超参数及其各自的值。除了使用列表,我们还可以使用字典来指定不同的场景。例如,我们可以对一个超参数的特定值进行硬编码,同时探索另一个超参数的所有值。在处理冲突的参数选择时,这种方法会很有帮助。然而,在这种情况下,没有冲突,所以一个列表就足够了。

我们将交叉验证折叠数 (CV) 设置为 10,表示我们要进行 10 折交叉验证。分层k折交叉验证用于分类器,确保标签的比例在每一折中保持不变。用于选择最佳超参数设置的评分指标是分类器的准确性和回归器的 R 平方分数。我们还将要运行的并行作业数设置为-1,允许多个操作并行执行。

在指定所有必要的细节之后,我们将网格搜索对象与我们的数据相匹配。它对参数网格执行详尽搜索,使用交叉验证评估每个超参数组合的性能。网格搜索完成后,我们可以分别使用 best_score_ 和 best_params_ 属性访问最佳分数和相应的参数。在这种情况下,最佳模型的最大深度为 3,标准为“gini”,在验证折叠中平均准确度达到 96%。

如果我们有兴趣,我们可以手动检查存储在字典中的结果,其中包含所有信息。在这里,我们关注平均测试分数,它代表每个超参数设置的验证折叠的平均性能。我们将分数与参数设置一起打印出来,以提高可读性。

或者,我们可以使用 ML 范围库中的函数在热图中总结结果。热图提供了不同超参数设置的性能的可视化表示。在这种情况下,“gini”和“entropy”之间的选择对性能几乎没有影响,如相似的分数所示。最佳性能是在最大深度为 3 和标准“gini”时实现的。

在获得最佳超参数设置后,我们可以使用它们在整个训练数据集上训练最终模型。这确保我们利用所有可用数据进行模型训练。我们创建一个新的决策树分类器对象,将超参数设置为网格搜索期间找到的最佳值,并将模型拟合到训练数据。

一旦模型被训练好,我们就可以对测试数据集进行预测并评估其性能。在这个例子中,我们计算准确度分数,它衡量正确分类实例的比例。我们打印准确率分数,在这种情况下,我们在测试集上达到了 93% 的准确率。

总体而言,网格搜索使我们能够系统地探索不同的超参数组合并为我们的模型选择最佳配置。它使超参数调整过程自动化,并有助于找到最佳设置以提高性能。

这就是使用网格搜索进行模型选择和超参数调整的基本思想。当然,这只是一种方法,还有其他可用的技术,例如随机搜索、贝叶斯优化等。方法的选择取决于具体问题和可用资源。

 

10.7 K-fold CV 1-标准误差法(L10:模型评估3)


10.7 K-fold CV 1-标准误差法(L10:模型评估3)

在前面的讨论中,我们介绍了 k 折交叉验证和使用网格搜索进行模型选择的概念。但是,还有另一个重要主题需要考虑:单一标准误差方法。当我们遇到多个超参数设置表现同样出色的情况时,这种方法是相关的,我们需要选择最合适的一个。

当我们有多个具有相似或相同性能的超参数设置时,决定选择哪一个就变得至关重要。默认情况下,如果有平局,scikit-learn 会从列表中选择第一个设置。然而,一个标准误差方法提供了一种基于简约原则或奥卡姆剃刀原则的替代方法。根据奥卡姆剃刀原则,当相互竞争的假设表现同样出色时,应首选假设最少的那个。

为了应用单标准误差法,我们考虑了数值最优估计及其标准误差。通过 k 折交叉验证执行模型选择后,我们获得了不同超参数设置的性能估计。在这些设置中,我们选择性能在上一步中获得的最佳模型的一个标准误差范围内的模型。

为了说明这种方法,让我们考虑一个用 scikit-learn 生成的二元分类数据集,它由正方形和三角形组成。为简单起见,我们将重点关注 RBF 核支持向量机 (SVM)。 SVM 有一个称为 gamma 的超参数,它控制每个训练示例的影响。我们发现各种伽马值导致的精度范围从 60% 到 90%,某些设置显示出相似的性能。

在 SVM 的情况下,决策边界的复杂性取决于伽玛值。较高的 gamma 会导致更复杂的决策边界,而较低的 gamma 会导致更简单的决策边界。我们可以通过绘制不同伽马值的决策边界来观察这一点。较简单的模型具有更接近线性的决策边界,而较复杂的模型则呈现出更复杂的形状。

然而,当多个超参数设置产生相似的精度时,我们希望在性能最佳模型的一个标准误差范围内选择最简单的模型。例如,如果性能最好的模型的伽马值为 0.1,我们会考虑伽马值在 0.1 标准误差范围内的模型,并选择复杂度最低的模型。

值得注意的是,一种标准错误方法可能并不总是有相应的论文或出版物。这是一种基于简单原则的实用方法,已被从业者广泛采用。如果有关于这种方法的任何已发表的研究或论文,它们将是进一步探索其有效性和影响的有价值的补充。

在下一个视频中,我们将深入研究一个代码示例,演示如何在实践中实施单一标准错误方法。

 

10.8 K-fold CV 1-标准误差法——代码示例(L10:模型评估3)


10.8 K-fold CV 1-标准误差法——代码示例(L10:模型评估3)

在本视频中,我将详细说明我是如何实现上一个视频中讨论的单一标准错误方法的。要跟随代码示例,您可以在此链接下找到它们,我也会将其发布到 Canvas 上以便于访问。

让我们一起浏览笔记本。首先,我们有常用的常规进口。然后,我使用 scikit-learn 库中的 make_circles 函数生成我自己的玩具数据集。此函数允许您指定数据集中的示例数量和噪声量。然后将生成的数据集分成训练集和测试集。这种方法非常适合对任意大型数据集进行模拟研究,以观察不同的学习曲线和模型行为如何随不同的参数(例如噪声和训练示例数量)而变化。它是一个有用的试验台。

接下来,我以支持向量机(SVM)为例。您不需要完全理解支持向量机是如何在这个演示中工作的;我只是选择它作为一个明显的例子。以下步骤涉及手动方法,我在其中定义超参数设置列表并迭代这些值。但是,如果您有更复杂的设置,则可以使用上一个视频中讨论的 ParamSampler。

对于此演示,我使用单个超参数,因此使用列表和 for 循环的手动方法就足够了。我初始化一个参数列表,然后遍历每个值。在每次迭代中,我使用选定的超参数设置初始化 SVM 模型。然后,我执行 k 折交叉验证来评估模型的准确性。收集精度值,然后计算平均值、标准偏差和标准误差。请注意,我用标准差除以样本量的平方根来计算标准误差的朴素方法可能不是最好的方法,因为 k 折交叉验证中的轮次并不完全独立。然而,为了获得某种相似性度量或误差线来比较不同的方法,这种方法就足够了。

收集精度值后,我将它们绘制在对数刻度上,因为采样是按指数方式进行的。生成的图显示 SVM 模型在不同超参数设置下的性能。这与我们在讲座幻灯片中看到的一致。

为了演示此方法对其他分类器的适用性,我还提供了在鸢尾花数据集上进行决策树分类的代码。在这种情况下,我将决策树的最大深度参数从 1 更改为 10。遵循类似的步骤:使用超参数设置初始化模型、拟合模型、进行预测、收集 k 折交叉验证分数、计算标准错误,等等。通过分析不同最大深度的决策边界,我们可以观察到模型复杂性和性能之间的权衡。在这个具体的例子中,使用一个标准误差方法选择了最大深度为三的决策树。

最后,我简单提一下我们下一讲的主题,包括算法选择的交叉验证、统计测试和评估指标。这些主题与前面几节课中讨论的概念密切相关。

我希望你觉得这个解释有帮助。周末愉快!

 

11.1 讲座概述(L11 模型评估。第 4 部分)


11.1 讲座概述(L11 模型评估。第 4 部分)

大家好,欢迎光临!在我们之前的会议中,我们深入探讨了超参数调整和模型选择的主题。我们的重点是 k 折交叉验证,这是一种用于对具有各种超参数设置的不同模型进行排名以便选择最佳模型的技术。我们探索了网格搜索和随机搜索等实用方法,这些方法有助于模型比较过程。

今天,我们将深入探讨模型对比方面。假设您遇到一篇研究论文,该论文分享了一个模型对测试集的预测。您可能希望将这些预测与您自己的模型的预测进行比较,并确定它们的性能是否存在统计上的显着差异。虽然这种做法不是很常见,但它很有用。在这种情况下可以使用的一种统计检验是 McNemar 检验。此外,我们将讨论算法比较,使我们能够更公平地比较不同的模型和算法。

但是,请注意,由于是感恩节周,今天的讲座会比平时短。对于那些感兴趣的人,讲义提供了更详细的解释。它们还涵盖了其他统计检验,例如五次二次 F 检验和各种 t 检验程序。虽然这些主题不可考,但它们可以满足您的求知欲。

为了优化我们的时间,我们不会深入研究这些方法,因为下周将有关于性能指标的讲座等着我们。如果时间允许,我们可能还会涉及到特征选择和特征提取。为了您的方便,我通过 Canvas 分享了关于这些主题的补充材料。

现在,让我们开始关于模型评估的主要讲座,从模型比较的统计测试开始。然后,我们将解决与多重成对比较相关的挑战,并探索解决这些问题的方法。随后,我们将深入研究算法选择并检查与嵌套交叉验证技术相关的具体代码示例。本讲座概述为我们今天的讨论奠定了基础。

在我们继续之前,让我们回顾一下我们在之前关于模型评估的讲座中涵盖的主题。我们从基础知识开始,包括偏差-方差权衡、欠拟合和过度拟合,以及简单的 holdout 方法。然后,我们深入研究了置信区间,并介绍了构建经验置信区间的引导方法。我们探索了重复保持法,它提供了对模型稳定性的见解,尽管它在实践中并不常用。它很好地介绍了重采样方法。

上周,我们冒险进入了交叉验证领域,这增加了我们探索的深度。我们讨论了使用网格搜索和随机搜索进行超参数调整,并将这些技术用于模型选择。我们主要关注三向保持方法,该方法涉及将数据集拆分为训练集、验证集和测试集。我们使用验证集对不同的模型进行排名,使用测试集来评估它们的最终性能。对于较小的数据集,我们转向 k 折交叉验证和留一法交叉验证。

今天的讲座将介绍模型和算法的比较。虽然这些概念与模型选择有关,但我们的目的是比较不同的算法,以确定哪种算法在一系列相关任务中表现更好。理想情况下,我们将为每种算法收集一组不相交的训练和测试集。例如,在比较图像分类方法时,我们会使用各种图像数据集使用不同的算法训练不同的模型。然后我们将比较他们在多个数据集上的表现。然而,实际限制常常限制我们遵循这种理想方法的能力。我们在数据集中遇到了违反独立性和其他滋扰的问题。这个问题让人想起 CIFAR-10 论文中讨论的挑战。

此外,我们如何将我们训练过的模型的性能与研究论文中发表的模型或在互联网上找到的模型的性能进行比较?为了解决这个问题,我们可以使用统计测试来检查两个模型之间的实际性能差异。一种这样的测试是 McNemar 测试,它通常用于比较两个模型对二元结果的预测性能。

当我们有配对数据时,McNemar 测试是合适的,这意味着数据集中的每个实例都被两个模型分类,结果记录为列联表。列联表有四个单元格,代表四种可能的结果:

              Model 2
           |  Positive | Negative |
---------------------------------
Model 1    |           |          |
---------------------------------
  Positive |           |          |
---------------------------------
  Negative |           |          |
---------------------------------
为了应用 McNemar 检验,我们计算列联表每个单元格中的实例数。让我们将这些计数表示如下:

  • a:模型 1 和 2 都预测为正的实例数。
  • b:模型 1 预测为正而模型 2 预测为负的实例数。
  • c:模型 1 预测为负而模型 2 预测为正的实例数。
  • d:模型 1 和 2 都预测为负的实例数。

有了这些计数,我们可以执行 McNemar 测试以确定模型的性能是否存在显着差异。零假设 (H0) 是两个模型具有相同的性能,而备择假设 (H1) 是存在差异。

McNemar 检验统计量服从自由度为 1 的卡方分布。我们使用以下公式计算测试统计量:

chi2 = ((|b - c| - 1)^2) / (b + c)

如果检验统计量 chi2 在选定的显着性水平(例如 0.05)超过卡方分布(具有 1 个自由度)的临界值,我们拒绝零假设并得出结论,两者之间的性能存在显着差异两个模型。

请务必注意,McNemar 检验假定配对实例是独立且同分布的。如果配对实例不是真正独立的,或者它们之间存在某种形式的依赖关系,则此假设可能不成立。此外,McNemar 检验主要适用于二元结果。如果结果是多类的,则 Cochran 的 Q 检验或 Stuart-Maxwell 检验等替代检验可能更合适。

现在,让我们继续讨论多重成对比较的挑战。在比较多个模型或算法时,越来越有可能仅凭偶然发现显着差异。这种现象被称为多重比较问题或多重检验问题。

当进行多个成对比较时,至少一个显着结果的概率随着比较次数的增加而增加。 I 类错误率的这种膨胀会导致假阳性结果,我们会错误地拒绝零假设。

为了解决多重比较问题,我们需要调整统计检验的显着性水平。一种常见的方法是 Bonferroni 校正,它涉及将所需的显着性水平(例如 0.05)除以进行比较的次数。例如,如果我们比较三个模型,我们会将每个单独测试的显着性水平调整为 0.05/3 = 0.0167。

Bonferroni 校正是一种控制全族错误率的保守方法,可确保所有比较的总体 I 类错误率保持在指定阈值以下。但是,它可能过于严格,导致无法检测到真正的差异。

调整显着性水平的其他方法包括 Holm-Bonferroni 方法、Benjamini-Hochberg 程序和错误发现率 (FDR) 控制。这些方法为 Bonferroni 校正提供了不太保守的替代方法,并且在某些情况下可能更合适。

总之,McNemar 检验是一种统计检验,可用于比较两个模型在二元结果上的性能。但是,在进行多重成对比较时,通过调整显着性水平来解决多重比较问题很重要。

 

11.2 成对分类器比较的 McNemar 检验(L11 模型评估。第 4 部分)


11.2 成对分类器比较的 McNemar 检验(L11 模型评估。第 4 部分)

现在让我们讨论 McNemar 检验,这是一种我们可以用来比较两个模型的检验。该测试不同于我们上周讨论的用于模型选择的交叉验证方法。与交叉验证不同,McNemar 测试不涉及使用训练集调整模型。相反,它假设我们已经有了一个现有模型,例如已发表文献中提到的机器学习分类器,我们可以通过 Web 应用程序或 GitHub 访问它。目标是根据它们在测试集上的表现,将我们自己的模型与现有分类器进行比较。

McNemar 测试允许我们根据两个分类器在测试集上的表现来比较它们。它由 Quinn McNemar 于 1947 年引入,是一种用于配对比较的非参数统计检验。在这种情况下,我们有一个分类因变量,它有两个类别代表预测的正确性(例如,正确或不正确),还有一个分类自变量,它有两个相关组代表被比较的两个模型。配对是通过对两个模型使用相同的测试集来实现的。为了执行测试,我们使用二乘二混淆矩阵,这是专门为 McNemar 测试设计的混淆矩阵的特殊版本。

McNemar 检验的二乘二混淆矩阵包括两个模型所做预测的计数。例如,让我们考虑一下我们有真实类标签 0 和 1 的情况。模型 1 预测 1 和 2,而模型 2 预测 1 和 1。在这种情况下,计数“a”表示模型 1 和模型 1 的预测模型 2 正确(例如,当真实标签为 1 时预测为 1)。计数“b”表示模型 1 正确而模型 2 错误的预测,计数“c”表示模型 1 错误而模型 2 正确的预测。通过将给定测试数据集的这些计数制表,我们可以构建二乘二的混淆矩阵。

使用二乘二混淆矩阵,我们可以计算各种指标。例如,我们可以通过将计数“a”和“b”除以测试集中的示例总数来计算每个模型的预测准确性。此外,我们对模型 1 和模型 2 不同的情况感兴趣,由混淆矩阵中的计数“b”和“c”表示。这些案例表明一个模型做出正确预测而另一个模型做出错误预测的地方。为了比较两个模型的性能,我们可以运行 McNemar 测试。

McNemar 检验遵循典型的假设检验程序。我们定义了一个零假设和一个替代假设。零假设假设两个模型的性能相同,而备择假设表明它们的性能不同。我们计算卡方检验统计量,它近似于卡方分布。检验统计量计算为 (b - c)^2 / (b + c)。基于这个检验统计量,我们计算一个 p 值,假设原假设为真。 p 值表示在原假设下观察到给定检验统计量或更极端值的概率。

为确定是否拒绝原假设,我们将 p 值与选定的显着性水平(例如 0.05)进行比较。如果 p 值小于显着性水平,我们将拒绝零假设并得出两个模型的性能不相等的结论。相反,如果 p 值大于显着性水平,我们将无法拒绝零假设并假设两个模型的性能相等。

引入连续性校正是为了解决卡方分布是连续分布而 2x2 列联表中的数据是离散的问题。通过从分子的绝对差中减去 1,连续性校正有助于提供更好的 p 值近似值。然而,重要的是要注意连续性校正的使用并不总是必要的,它取决于具体的背景和数据。

McNemar 检验中的另一个考虑因素是使用精确二项式检验。当样本量较小或不满足卡方检验的假设时,精确二项式检验提供了另一种方法来确定 McNemar 检验的统计显着性。精确二项式检验直接计算在原假设下获得观测数据的概率,而不依赖于卡方近似。

此外,McNemar 的测试可以扩展到处理两个以上的模型或处理。在这种情况下,可以使用广义 McNemar 测试或称为 Cochran-Mantel-Haenszel 测试的扩展来执行测试。这些扩展允许同时比较多个模型或治疗,同时考虑到不同组之间的依赖性。

总之,McNemar 检验是一种非参数统计检验,用于根据配对的分类数据比较两个模型或治疗的性能。它提供了一种方法来评估模型之间的性能差异是否具有统计显着性。该测试涉及构建 2x2 列联表和计算测试统计量,可以将其与卡方分布进行比较或使用精确二项式测试进行评估。通过进行 McNemar 测试,研究人员可以深入了解不同模型或治疗在各个领域(包括机器学习、医学和社会科学)中的相对表现。

 

11.3 多对比较(L11 模型评估。第 4 部分)


11.3 多对比较(L11 模型评估。第 4 部分)

如果您有一个模型想要与文献中或 GitHub 等平台上的多个其他模型进行比较,则进行成对比较可能会出现问题。如果您有 k 个不同的模型,对每一对执行成对测试将导致 k 次 (k - 1) / 2 组合,这可能是一个很大的数字。这引起了人们对进行多项假设检验时的错误率的担忧。

通常,假设检验在 0.05 或更小的显着性水平下进行。这意味着如果原假设为真,则有 5% 的机会错误地拒绝它,从而导致 5% 的错误率。当执行多项测试时,错误拒绝零假设的错误率可能会增加到 r 乘以 alpha,其中 r 是进行的测试次数。在最坏的情况下,如果所有成对零假设都为真,则错误率可能高达 r 倍 alpha。

为了解决这个问题,一种常见的方法是使用一个受保护的过程,它涉及一个两步过程。第一步是综合测试,您可以在其中评估所有模型组合的性能是否存在显着差异。零假设假设所有模型的分类准确度都相等,而备择假设表明它们不相等。

如果综合检验拒绝原假设,表明模型性能存在差异,则可以进行第二步,即成对事后检验。但是,对多重比较进行调整以控制错误率至关重要。一种常用的调整方法是 Bonferroni 方法,其中显着性水平除以比较次数。

对于成对检验,可以采用 McNemar 检验。重要的是要注意,虽然这些统计程序是正式的并提供有价值的见解,但在机器学习实践中,进行如此广泛的比较并不常见。通常,研究人员报告预测的准确性或错误,并根据模型的性能对模型进行排名。

虽然 Cochran-Q 测试可以在“mlxtend”库中实现以比较多个模型,但值得一提的是,使用此类程序进行多个模型比较在机器学习领域仍然相对不常见。但是,如果您发现要比较多个模型并执行统计检验的情况,则可以探索这些选项并参考讲义和相关文献以获取更详细的信息。

重要的是要注意,本讲座没有广泛涵盖这些主题,以便有足够的时间涵盖其他基本概念,如特征选择。

多重比较的一个问题是 I 类错误的风险增加,也称为误报。在进行多项检验时,错误拒绝零假设的可能性更高,从而导致错误的结论。为了缓解这种情况,研究人员经常应用 Bonferroni 校正或错误发现率 (FDR) 控制等调整方法。

Bonferroni 校正是一种保守调整,它将显着性水平 (alpha) 除以比较次数 (k)。这个调整后的显着性水平,表示为 alpha prime (α'),确保总体家庭错误率保持在控制之下。通过使用 Bonferroni 校正,每个单独的成对测试都在 alpha/k 水平上进行。

另一种流行的方法是 FDR 控制,它侧重于控制错误发现在所有拒绝中的比例。 FDR 控制不是降低每次比较的显着性水平,而是调整单个测试的 p 值以控制总体错误发现率。与 Bonferroni 校正相比,此方法允许进行不太严格的调整,这在涉及大量比较的情况下可能是有利的。

虽然 Bonferroni 校正和 FDR 控制被广泛使用,但请务必注意它们有其局限性。 Bonferroni 校正可能过于保守,可能会导致 II 类错误或假阴性的可能性增加。另一方面,FDR 控制可能具有更强的检测真实差异的能力,但也会增加误报的风险。

在机器学习的背景下,值得考虑的是目标是全面评估成对差异还是确定表现最佳的模型。对所有可能的组合进行成对测试可能在计算上昂贵且耗时。在实践中,研究人员通常专注于根据模型的性能指标对模型进行排名并确定性能最佳的模型,而不是进行正式的统计测试。

认识到统计测试只是模型比较的一个方面也很重要。在评估和选择模型时,还应考虑其他因素,例如可解释性、计算效率、领域相关性和实际考虑因素。

总之,虽然多重比较和统计测试可以为模型性能比较提供有价值的见解,但它们在机器学习中的实际应用并不常见。研究人员通常依赖于报告预测准确性或错误、视觉比较以及基于性能指标的模型排名。了解多重比较的基本统计概念和潜在问题对于进行严格的研究和准确解释结果仍然至关重要。