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

 

7.2 多数表决(L07:集成方法)


7.2 多数表决(L07:集成方法)

在本视频中,我们将探索称为多数表决的模型集成的基本案例之一。通过一个玩具示例,我们将检查与单独使用单个分类器相比,多数表决的好处。

首先,让我们考虑一个存在二元分类问题的场景。我们有一个由多个观察值组成的数据集,每个观察值都与一组特征和相应的类标签相关联。我们的目标是构建一个分类器,可以准确预测新的、未见过的实例的类标签。

为了演示多数表决的概念,我们首先在我们的数据集上训练三个单独的分类器。每个分类器都使用不同的算法或模型进行预测。为简单起见,我们假设这些分类器是决策树。

一旦我们训练了三个决策树分类器,我们现在就可以对新实例进行预测。然而,我们不依赖于单个分类器的预测,而是采用多数表决原则。在多数表决中,集成中的每个分类器都为其预测的类标签投票。获得最多选票的类标签被认为是集成的最终预测。

现在,让我们看看为什么多数表决比单独使用单个分类器更有效。考虑一个场景,其中每个单独的决策树分类器由于数据集中的固有噪声或可变性而具有一定程度的错误。这些错误会导致不正确的预测,从而降低单个分类器的整体准确性。

然而,通过多数投票结合多个分类器的预测,我们可以潜在地减轻个别错误的影响。即使一两个决策树分类器做出了错误的预测,多数表决过程也可以弥补这些错误。获得多数选票的类标签更可能是正确的,与使用单个分类器相比,准确性更高。

为了说明这一点,让我们想象一种情况,其中两个决策树分类器预测了正确的类标签,而一个分类器做出了错误的预测。在这种情况下,正确的类标签将获得两票,而错误的预测将仅获得一票。因此,集成的多数投票过程将正确地将得票最多的类标签识别为最终预测,从而覆盖单个分类器的错误预测。

此示例展示了集成方法(特别是多数表决)在提高预测准确性方面的威力。通过组合多个分类器的预测,我们可以利用每个分类器的优势,并最大限度地减少它们各自的弱点或错误的影响。

总之,该视频强调了多数投票作为模型集成的基本形式的重要性。通过一个玩具示例,我们已经看到多数投票如何优于单独使用单个分类器,特别是当单个分类器表现出错误或可变性时。集成方法(例如多数表决)提供了一种强大的方法来提高预测准确性,并广泛用于实际的机器学习应用程序。

 

7.3 装袋(L07:集成方法)



7.3 装袋(L07:集成方法)

在上一个视频中彻底讨论了多数表决的概念之后,即将发布的视频将深入探讨另一种称为装袋的基本方法,它代表引导聚合。术语“bagging”源自首字母“B”和“ag G”的组合,与 bootstrapping 的概念密切相关。该技术最初由 Leo Breiman 提出,他是决策树领域的杰出人物,特别是分类和回归树 (CART)。我们将在未来关于随机森林的讲座中更详细地探讨 Breiman 的贡献。

首先,让我们概述装袋算法。虽然乍一看似乎很复杂,但实际上它非常简单,只有六行代码,如果我们排除空行,则为五行。该算法的运行方式如下:假设我们总共有 n 个引导样本或轮次。对于每一轮 i,我们从训练集中抽取一个大小为 m 的引导样本。这里,m 代表训练集的大小。重要的是要注意,使用单个字母表示变量可能看起来很不合常规,但由于字母选择的限制,这是必要的。在之前的视频中,我们用 n 来表示 bootstrap 样本的数量,它对应于我们讨论的集成投票分类器中的分类器数量。

对于每个 bootstrap 样本,我们训练一个分类器并应用多数表决。这个过程与我们之前介绍的集成投票分类器非常相似,唯一的区别是我们不是在整个训练集上训练每个分类器,而是在从训练集中提取的引导样本上训练每个基础分类器。

在我们继续之前,让我们简要回顾一下自助抽样的概念。考虑一个大小为 m 的数据集。基于上述算法,从该数据集中抽取的每个引导样本也将具有 m 的大小。 Bootstrap 抽样涉及从数据集中随机选择有放回的数据点。例如,如果我们有 10 个标记为 1 到 10 的数据点,并且我们执行有放回采样,则一些数据点将在 bootstrap 数据集中重复。出现这种重复是因为每个位置都是从训练集中独立抽取的。因此,某些数据点可能会出现多次,而其他数据点可能根本不会出现,从而导致我们称之为包外 (OOB) 样本。这些 OOB 样本是未包含在特定轮次的引导程序样本中的数据点。

为了更好地理解与不选择引导样本中的特定项目相关的概率,让我们检查不为单个位置选择特定数据点的概率。为给定位置选择特定数据点的概率为 1/m,因为训练集中有 m 个示例。因此,不选择该特定数据点的概率为 1 - 1/m。由于我们有 m 个选择,所以在整个 bootstrap 样本中没有选择特定示例的概率是 (1 - 1/m)^n。当 m 变得足够大时,大约 36.8% 的点将不会包含在 bootstrap 样本中。因此,63.2% 的数据点在 bootstrap 样本中将是唯一的,而其余点将是重复的。

在装袋过程中可视化自举抽样有助于进一步理解这个概念。进行了多轮自举抽样,每轮都会产生一个新的自举样本。然后在每个 bootstrap 样本上独立训练分类器。这个过程促进了模型并行性,因为引导轮次之间没有依赖性。因此,每一轮都可以同时执行,从而增强了并行处理的潜力。

装袋分类器的流程图概述了所涉及的步骤。与投票分类器类似,装袋分类器从训练集开始。然而,在 bagging 中,我们重用训练集来创建多个 bootstrap 样本。每个 bootstrap 样本用于训练一个分类器,总共有 m 个分类器。每个分类器生成预测,最终预测通过多数表决确定。这种方法有助于减少过度拟合并提高模型的稳定性和泛化性。

装袋有几个优点:

  • 减少方差:通过生成多个引导样本并在每个样本上训练独立的分类器,bagging 有效地减少了预测的方差。当基础分类器容易过度拟合时,这种方差减少特别有益。
  • 提高稳定性:由于装袋涉及在不同的引导样本上训练多个分类器,因此它为模型提供了稳定性。训练集中的微小变化不太可能对最终预测产生重大影响,从而产生更稳健的模型。
  • 处理复杂的数据集:Bagging 在处理以高方差和噪声为特征的复杂数据集时非常有效。通过使用多个分类器并聚合它们的预测,装袋可以捕获不同的模式并减少异常值或噪声数据的影响。
  • 并行处理:Bagging 允许并行处理引导程序样本和训练分类器。每个 bootstrap 样本都独立于其他样本,从而可以有效利用计算资源。

尽管有其优势,但 bagging 也有一些局限性:

  • 可解释性:由于 bagging 结合了来自多个分类器的预测,因此解释每个分类器对最终预测的单独贡献可能具有挑战性。虽然集成模型可以提供准确的预测,但理解它们背后的潜在原因变得更加复杂。
  • 计算复杂度:在不同的 bootstrap 样本上训练多个分类器会增加 bagging 算法的计算复杂度。训练和汇总预测所需的时间和资源可能很重要,尤其是对于大型数据集。
  • 潜在的过度拟合:虽然与单个分类器相比,bagging 降低了过度拟合的风险,但它并非完全不受过度拟合的影响。如果基础分类器已经容易过度拟合,装袋可能不会产生显着的改进。
  • 多样性有限:Bagging 依赖于创建不同的引导样本来获得不同的分类器。但是,在某些情况下,数据集较小或可变性有限,bootstrap 样本可能不够多样化,从而降低 bagging 的有效性。

在本节中,我们将更深入地研究前面讨论的概念。当模型的预测出现显着变化时,表明方差很大。例如,让我们考虑橙色案例的复杂决策树。该模型的预测将与蓝色模型的预测有很大不同。同样,绿色案例将有其自己的一组不同预测。这些不同的预测说明了高方差的概念。

为了更好地理解高方差的影响,让我们检查一下在这些数据集上拟合的实际决策树。尽管存在差异,但高方差情况仍然设法提供良好的平均预测。重要的是要注意,即使我没有在这里明确显示平均预测,但对安装在不同训练集上的三个模型(模型一、模型二和模型三)的预测进行平均将导致一个非常接近真实函数的预测.相比之下,如前所示,高偏差模型仅在直线与真实函数相交的特定位置准确。在所有其他情况下,它们由于偏高而表现不佳。

然而,通过采用高方差模型并对多个模型的预测进行平均,我们仍然可以实现准确的预测。这个概念构成了 bagging 的基础,它涉及使用通过 bootstrap 抽样生成的不同训练集。在 bagging 中,每个 bootstrap 样本都用于拟合决策树,从而产生多个高方差模型。然后使用集成投票对这些模型进行平均,方法是考虑分类任务中的类标签或回归任务中的回归输出。这种平均过程有助于通过减少方差获得高度准确的预测。

通过对安装在不同训练集上的三个决策树的预测进行平均,我们将获得一个非常接近真实函数的平均预测。这种平均类似于装袋的概念,其中每个训练集都充当引导数据集。其次,重要的是要注意决策树不能插入值。他们只能预测训练集中存在的目标值或其平均值。因此,图中所示的逐步函数是未修剪决策树的近似值。

总而言之,装袋是一种通过平均高方差模型的预测来减少方差的有效技术。通过采用并行化,装袋可以利用多个 CPU 加速模型拟合。但是,某些 Windows 计算机可能会面临 Python 中的多处理问题,从而限制多个作业的使用。还值得一提的是,装袋分类器可以计算袋外精度,这涉及使用不包含在引导样本中的数据点来评估模型性能。这为评估模型的泛化能力提供了一个有用的指标。在使用 scikit-learn 的代码示例中,可以从集成子模块导入装袋分类器。

基础估计器(在本例中为决策树)初始化时将最大深度设置为 None 以创建未修剪的决策树。估计器的数量决定了引导轮数,相应地设置 n_jobs 参数可以实现并行化。此外,oob_score 参数可以计算袋外分数。训练好bagging分类器后,可以评估出袋得分和测试集准确率。

总的来说,bagging 提供了一种通过组合多个高方差模型来减轻高方差和提高预测准确性的有效方法。总之,bagging 是一种强大的集成方法,它结合了在不同 bootstrap 样本上训练的多个分类器,以提高预测准确性并减少方差。它在处理复杂数据集时特别有用,可以增强模型的稳定性和泛化性。然而,它也有一些局限性,包括可解释性降低和计算复杂性增加。

 

7.4 提升和 AdaBoost(L07:集成方法)


7.4 提升和 AdaBoost(L07:集成方法)

在之前的视频中,我们讨论了高方差和低偏差模型的概念,特别关注未修剪的决策树。我们还了解了一种称为装袋的技术,它通过平均减少方差来帮助提高高方差模型的性能。

在本讲中,我们将把注意力转移到反向操作的提升上。提升涉及使用具有低方差的高偏差模型,例如简单的决策树树桩,并提升它们以增强整体模型的性能。第一个视频将概述增强概念并总体介绍增强,而下一个视频将深入探讨一种流行的增强类型,称为梯度增强。

提升可以大致分为两种主要类型:自适应提升(例如,adaboost)和梯度提升。从历史上看,梯度提升由于其计算复杂性而未被广泛使用。然而,最近的进展,例如 2016 年引入的 XGBoost,显着提高了梯度提升的性能。如今,出现了更好的变体,如 LightGBM,我们将在下一个视频中讨论。虽然梯度提升越来越受欢迎,但通过自适应提升了解一般的提升过程至关重要。

boosting 过程遵循特定的轮廓,这与 bagging 过程不同。一个显着的区别是回合之间存在依赖关系。提升过程涉及多个分类器,表示为分类器一、分类器二等,直到分类器 M。最初,我们从常规训练数据集开始并拟合分类器一。基于分类器一的预测,我们使用特定的加权方法对训练样本进行加权,稍后我们将对此进行更详细的讨论。然后,第二个分类器使用这个加权训练数据集,这个过程继续。权重取决于先前分类器的预测,因此很难并行化提升。与可以同时训练分类器的 bagging 不同,boosting 需要等到前一个分类器做出预测,然后才能为下一个分类器更新数据集。在进行最终预测时,boosting 采用分类器的加权组合,这与 bagging 中使用的集成投票或平均不同。加权组合是根据符号函数确定的,它为每个分类器的预测分配权重。对于二元分类,sign 函数对正结果返回 1,对负结果返回 -1。此加权预测的最终预测结果为 -1 或 1。可以使用指示函数扩展该过程以处理任意数量的类。

为了进一步了解一般的增强过程,让我们概述所涉及的步骤。首先,我们为每个训练示例初始化一个具有统一权重的权重向量。这些权重代表每个训练示例的重要性。然后,我们进入一个循环,迭代不同的分类器或增强过程的轮次。在每一轮中,我们对加权训练示例应用一个弱学习器,它是一个比随机猜测稍微好一点的分类器。我们可以为特定示例分配更高的权重,或者使用加权概率绘制引导样本。在训练弱学习器之后,我们增加了错误分类示例的权重,使下一个分类器能够专注于这些错误分类的示例。这个循环重复多次,最后对训练好的分类器进行加权多数表决,得到最终的预测。

现在让我们关注 adaboost 算法,它与前面讨论的一般提升过程密切相关。 Adaboost 类似于一般的提升大纲,其中分类器安装在加权训练示例上。该算法首先为每个训练数据点初始化权重。然后,包含 adaboost 轮次的主 for 循环开始。在每一轮中,权重都被归一化以确保它们总和为 1。接下来,在加权训练集上训练弱学习器,并计算加权预测误差。预测误差由训练集权重加权并指示错误分类。然后使用预测误差来计算弱学习者对最终预测的贡献。贡献由弱学习者的准确性决定,更准确的学习者有更高的贡献。然后,该贡献用于更新训练示例的权重。错误分类的例子的权重增加,而正确分类的例子的权重减少。此调整强调了后续轮次中错误分类示例的重要性。

更新权重后,过程进入下一轮,在更新的加权训练集上训练弱学习器。此迭代过程将持续指定的轮数或直到满足特定条件。一旦所有轮次都完成,最终的预测是通过结合所有弱学习者的预测来做出的。每个弱学习者预测的权重由其在训练期间对整体准确性的贡献决定。

adaboost 算法有效地结合了弱学习者的预测来创建一个强大的集成模型。分配给每个弱学习器预测的权重反映了它在训练示例分类中的性能。通过迭代调整权重并关注错误分类的示例,adaboost 能够随着时间的推移提高模型的准确性。

需要注意的是,adaboost 对数据中的异常值和噪声很敏感。异常值会对权重更新产生重大影响,可能导致过度拟合。因此,建议对数据进行预处理以处理异常值和噪声样本。此外,如果弱学习器太复杂或轮数太高,adaboost 可能容易过度拟合。限制决策树的深度或使用提前停止等正则化技术有助于减轻过度拟合。

如果我们粗略地勾勒出这个概念,它看起来像这样:我们在 x 轴上有一个箭头,代表 alpha 值。 alpha 值决定了每个分类器在最终预测中的重要性。当我们使用alpha值对估计和预测进行加权时,我们发现如果一个分类器的误差很大,那么alpha值就会相对较小。这意味着具有高误差的分类器对于最终预测并不重要。另一方面,具有小错误的分类器将具有更高的权重,因为我们在计算多数表决时更信任它们。

我们以两种方式使用 alpha 值:首先,我们用它来对估计和预测进行加权,其次,我们用它来更新下一轮的权重。如果预测正确,则分配给该训练示例的权重将很小。这意味着如果我们做出了正确的预测,我们就不会在下一轮中过多关注该训练示例。它被认为是一个简单的例子。另一方面,如果我们犯了错误,分配给那个例子的权重会更大。这意味着我们在下一轮更加关注错误分类的例子。 alpha 值越小,分配给错误分类示例的权重就越大。

为了说明这个概念,让我们考虑一个二维情况。我们有一个玩具示例,其中包含两个特征 x1 和 x2。我们拟合了一个决策树树桩,这是一棵只有一个分裂的决策树。决策树树桩对某些点进行了正确分类,但对其他点进行了错误分类。在 AdaBoost 的第一轮中,我们给错误分类的例子更高的权重,给正确分类的例子更低的权重。然后我们拟合另一个决策树桩,重点关注上一轮错误分类的示例。这个过程继续进行,每个新的分类器都从前一个分类器的错误中学习,并更加关注错误分类的例子。最后,当我们使用多数投票组合所有分类器时,我们最终可能会得到一个正确分类所有示例的分类器。

AdaBoost 理解起来可能有点复杂,但有一些资源可以提供帮助。 AdaBoost 的原始论文提供了深入的解释,但为了更容易理解,推荐使用 Manwani 的教程论文。在继续讨论代码示例之前,值得一提的是用于多类分类的 AdaBoost 算法的修改版本,称为 AdaBoost.M2 或 SAMME。它对原始算法进行了小的修改以处理多个类。还有一个名为 SAMME.R 的实数版本。如果您有兴趣,可以在各自的论文中探索这些变体。

在 scikit-learn 中,AdaBoost 被实现为增强分类器。它使用决策树树桩作为弱分类器,并根据其分类结果调整训练示例的权重。通过增强这些弱分类器,AdaBoost 提高了整体性能。比较鸢尾花数据集上未修剪的决策树和决策树桩的准确性,带有决策树桩的 AdaBoost 实现了更高的准确性。训练过程涉及更新样本权重,因此没有像 bagging 中那样的并行化选项。 scikit-learn 中的 AdaBoost 提供了一种有效的方法来增强弱分类器并获得更好的分类结果。

接下来,我们将深入研究梯度提升,这是提升的另一种流行变体。梯度提升建立在 AdaBoost 的概念之上,但引入了额外的增强功能。

梯度提升是提升算法的一种流行变体,旨在通过迭代改进弱分类器的弱点来进一步提高弱分类器的性能。它基于梯度下降的概念,常用于优化问题。在梯度提升中,弱分类器按顺序训练并组合以创建强分类器。

gradient boosting 背后的基本思想是迭代训练弱分类器,然后根据分类器集合的误差调整训练示例的权重。这种调整是通过计算损失函数相对于集成预测的梯度来完成的。通过最小化损失函数,集成逐渐提高其性能。

为了说明这个概念,让我们考虑一个简单的例子。假设我们有一个二元分类问题,我们想要将数据点分类为正或负。我们首先在训练数据上训练一个初始的弱分类器,例如决策树桩。这个分类器会犯一些错误,我们通过将其预测与训练示例的真实标签进行比较来计算错误或残差。

在下一次迭代中,我们训练一个新的弱分类器来预测前一个分类器的残差。这个新的分类器专注于纠正前一个分类器所犯的错误。我们通过从真实残差中减去预测值来计算残差。同样,这个新分类器会犯一些错误,我们计算残差。

我们重复这个过程,依次训练新的弱分类器来预测集成的残差,并根据当前集成的错误更新残差。每个弱分类器都经过训练以最小化关于当前残差的损失函数。最终的集成是通过组合所有弱分类器获得的,每个分类器根据其性能进行加权投票。

弱分类器的权重由学习率决定,学习率控制每个分类器对最终预测的贡献。较小的学习率会导致较慢的收敛,但会导致更好的泛化。较大的学习率可以导致更快的收敛,但也可能导致过度拟合。

梯度提升已被证明是适用于各种机器学习任务的强大技术,包括回归、分类和排名问题。它已成功应用于计算机视觉、自然语言处理和生物信息学等各个领域。

在实践中,有几种可用的梯度提升实现,包括 XGBoost、LightGBM 和 CatBoost,它们为梯度提升提供了高效和优化的算法。这些实现提供了额外的特性,例如并行化、正则化技术和处理缺失值,以进一步提高梯度提升模型的性能和灵活性。

boosting 的介绍和 adaboost 算法的概述到此结束。在下一个视频中,我们将更详细地探讨梯度提升,包括梯度下降的概念、损失函数以及为增强梯度提升过程而开发的特定算法。

 

7.5 梯度提升(L07:集成方法)


7.5 梯度提升(L07:集成方法)

梯度提升的概念是作为利用决策树和可微损失函数的提升的现代版本引入的。虽然与 AdaBoost 类似,但梯度提升在决策树的拟合方式上有所不同。在梯度提升中,使用更深的树,并且没有为训练示例或分类器分配权重。梯度提升背后的关键思想是使用损失函数的梯度来改进模型,从而在表格数据集上获得更好的性能。该算法已广受欢迎,尤其是在机器学习竞赛中。

在回归的背景下,梯度提升从构建基础树开始。例如,在房价预测问题中,初始基树仅由根节点组成。目标是根据该节点的平均值预测的,在本例中是训练集中四间房屋的平均价格。然后,根据前一棵树的预测误差构建下一棵树。该预测误差用于拟合新树。将第一步和第二步的树组合起来,这个过程重复多次,每棵后续树都安装在前面树的错误上。通过将简单的决策树与基于残差的新决策树相结合,该模型可以做出更好、更准确的预测。

讨论了梯度提升作为加法模型的概念,其中所有树的预测通过将它们相加而连续组合。还引入了学习率或步长,它决定了每棵树对最终预测的权重或贡献。梯度提升是通过在先前预测的错误上重复拟合树的过程来执行的,以较小的步长逐渐构建模型以防止过度拟合。这个过程一直持续到基于超参数设置的预定数量的树已经完成。

演讲者解释了梯度提升算法,该算法用于回归和分类问题。该算法涉及将模型初始化为根节点,然后拟合多棵树并创建终端节点。在每个节点进行预测,并计算损失。可以重复该算法,直到达到所需的树数,总体目标是最小化损失。

为了计算当前模型,将先前的模型和新的预测步骤结合起来,通过学习率或步长加权,以确定更新的模型。重复此过程,直到达到所需的树数(表示为 T)。计算伪残差,然后根据上一轮模型的真实标签和预测计算损失的导数。然后计算残差,并确定使特定节点处的损失最小的预测值。相应地更新模型,并重复此过程,直到达到 T 个模型。虽然负对数似然损失等可微损失函数可用于分类,但本课程的重点是误差平方和或均方误差。

该视频讨论了梯度提升中涉及的步骤及其实际应用。第一步涉及通过找到最小化表达式的预测来最小化给定节点上所有训练示例的损失。在第二步中,对 T 树使用一个循环,每个叶节点的预测是通过对该节点的示例进行平均来计算的。平均预测与之前的模型相结合,并将每棵树的预测相加。学习率用于减少伪残差并防止过度拟合。该视频还简要介绍了实践中使用的梯度提升的其他有趣方面。

该视频强调了提升作为顺序算法的潜在缺点,因为它不能充分利用多个进程或计算节点。然而,有一个名为 xgBoost 的实现,它结合了几个技巧来提高梯度提升过程的效率。事实上,在 2015 年至 2017 年 Kaggle 上发布的 29 个挑战获胜解决方案中,有 17 个使用了 xgBoost。其中八个解决方案完全依赖 xgBoost 来训练模型,而其他解决方案将 xgBoost 与神经网络相结合或使用堆叠,这是一种流行的集成投票技术。该视频展示了一篇论文中的两个表格,这些表格比较了不同的增强实现,展示了有助于提高其有效性的 xgBoost 的独特功能。

该视频讨论了 Extra Boost,它是梯度提升的一种变体,具有多种优势,例如近似全局、核外学习、稀疏意识和并行性。 Extra Boost 结合了近似方法,通过利用分布式数据子集的汇总统计来找到最佳分割。该视频使用精确贪心法将 Extra Boost 的性能与其他梯度提升实现进行了比较,并展示了 Extra Boost 实现了与一种实现相同的性能,但每棵树的时间显着减少,使其对超参数调整更具吸引力。

此外,该视频还解释了 Extra Boost 提供的各种改进,例如正则化技术、通过插补处理缺失的特征以及缓存。这些改进有助于减少过度拟合并提高 Extra Boost 的整体性能。此外,Extra Boost 利用基于列和行的子采样,随机选择特征子集和训练示例,从而提高计算效率并减少过度拟合。该视频建议参考有关 Extra Boost 的论文,以更详细地解释其技术。

该视频概述了 Extra Boost,一种更新的梯度提升机实现。 Extra Boost旨在减少过度拟合并提高预测准确性。该视频讨论了用于查找拆分的不同技术,包括精确贪婪算法和基于直方图的拆分查找。后一种方法涉及将连续特征合并为离散直方图,这可以提高训练速度并减少内存使用。该视频还比较了 Extra Boost 和 Light GBM,这是另一种更快、更准确的实现。与 Extra Boost 相比,Light GBM 利用基于直方图的分割查找并提供更低的内存使用和更高的预测精度。

该视频讨论了梯度提升分类器在 scikit-learn 中的实现,并介绍了在最新版本的库中添加的新梯度提升分类器。新的分类器利用受 LightGBM 启发的基于直方图的分割,使其比以前的分类器更快。该视频建议同时使用梯度提升分类器并将它们与 XGBoost 进行比较以确定哪一个表现最好。提供的代码示例可用作课程项目或一般用途的模板,包括在 scikit-learn 中实现梯度提升分类器并利用新的直方图梯度提升分类器。

演示者讨论了使用 XGBoost 和 LightGBM 库的梯度提升。 XGBoost 库类似,但比 scikit-learn 更复杂一些。它需要将 NumPy 数组转换为 DMatrix 格式,而不是使用 fit 方法,而是使用 train 方法来训练模型。可以通过调用 predict 方法来获得类成员概率来进行预测。另一方面,Microsoft LightGBM 库有一个类似于 scikit-learn 的 API。在拟合梯度提升机之前需要设置超参数,可以使用score方法计算准确率。在当前案例中,该模型在不调整超参数的情况下表现出 100% 的训练准确率。

该视频最后强调了梯度提升技术的有效性,特别是通过使用 XGBoost 和 LightGBM 等库。这些库为实现梯度提升模型提供了强大的工具,并提供了各种优化以提高性能和准确性。

此外,演示者承认超参数调整在梯度提升中的重要性。不同的超参数,例如学习率、树的数量和树的深度,可以显着影响模型的性能。因此,建议尝试不同的超参数配置,以找到针对特定问题的最佳设置。

为了进一步探索梯度提升,该视频建议参考有关 XGBoost、LightGBM 和其他相关实现的研究论文和文档。这些资源深入解释了梯度提升的算法、技术和高级功能。

总之,该视频全面概述了梯度提升、其概念以及使用 XGBoost 和 LightGBM 等库的实际实现。它突出了梯度提升的优势,例如它处理复杂表格数据集的能力、它在比赛中的有效性,以及它提高预测准确性的潜力。通过了解梯度提升背后的原理和技术,从业者可以利用这种强大的算法来解决各种回归和分类问题。

  • 00:00:00 引入了梯度提升的概念,作为使用决策树和可微损失函数的提升的现代版本。与 AdaBoost 类似,梯度提升是一个顺序过程,可以将弱学习器提升为强大的模型。然而,两者之间的主要区别在于决策树的拟合方式,梯度提升使用更深的树而不是对训练示例或分类器使用权重。梯度提升的关键思想是使用损失函数的梯度来改进模型,从而在表格数据集上获得更好的性能,并使其成为一种流行的竞赛算法。本节从构建基础树开始,通过三个基本步骤提供了梯度提升的概念性概述。

  • 00:05:00 我们在回归的背景下学习梯度提升。首先,我们从仅由根节点组成的基础树开始,在本例中为房价预测问题。我们根据该节点的平均值预测目标,在本例中是训练集中四个房屋价格的平均值。然后我们根据前一棵树的预测误差构建下一棵树,并使用这个预测误差来拟合一棵新树。我们将第一步和第二步中的树组合起来,并多次重复该过程,在后续轮次中根据错误拟合树。预测始终是前面树的预测的组合,同样的概念适用于通过使用不同的损失函数进行分类。

  • 00:10:00 讲师解释了如何使用梯度提升来做出更好的预测。该过程涉及构建决策树以进行初始预测、计算伪残差以对前一棵树的错误做出更好的预测,以及将第一步中的树与第二步中的树相结合。讲师解释了如何将此过程应用于涉及房价的简单示例,并展示了决策树的外观。通过将简单的决策树与基于残差的新决策树相结合,该模型可以做出更好、更准确的预测。

  • 00:15:00 讨论了梯度提升作为加法模型的概念,我们通过将所有树的预测相加来连续组合它们。该方法还包括一个 alpha 值,用作学习率或步长。梯度提升是通过多次重复第二步并以较小的步长缓慢构建来执行的,以防止过度拟合。因此,一棵新树不断地适应先前预测的错误,从而产生另一列用于预测。该过程一直持续到根据超参数设置完成一定数量的树。

  • 00:20:00 演讲者解释梯度提升算法,该算法用于回归和分类。该算法遵循一般程序,其中使用训练数据集的输入数据集以及可微损失函数。在第一步中,模型被初始化为根节点,然后在第二步中,算法拟合多棵树并创建终端节点。然后演讲者进一步详细介绍了每个节点的预测和损失计算。可以重复该算法,直到达到所需的树数,总体目标是最小化损失。

  • 00:25:00 演讲者解释了如何通过结合之前的模型和新的预测步骤来计算当前模型,以学习率或步长加权,以确定更新的模型,直到达到 T 次。首先计算伪残差,然后根据真实标签和上一轮模型预测计算损失的导数。之后,计算残差并根据特定节点确定最小化损失的预测值,然后再次更新模型。重复此过程,直到达到 T 个模型。尽管演讲者提到可微损失函数,如负对数似然损失,可用于分类,但在本课程中,他们关注的是平方和误差或均方误差。

  • 00:30:00 演讲者讨论了梯度提升所涉及的步骤以及如何在实践中使用它。第一步涉及通过找到最小化表达式的预测来最小化给定节点上所有训练示例的损失。第二步对 T 树使用循环,并通过对每个节点的示例进行平均来计算每个叶节点的预测。一个新项被添加到平均预测中,其中包括以前的模型。每棵树的学习率通常是相同的,每棵树的预测相加。学习率的目标是减少伪残差以避免过度拟合。最后,演讲者简要介绍了实践中使用的梯度提升的几个更有趣的方面。

  • 00:35:00 演讲者讨论了将提升作为顺序算法的潜在缺点,这可能会限制其效率,因为它无法利用多个进程或计算节点。然而,有一种名为 xgBoost 的提升实现,它使用多种技巧使梯度提升过程更加高效。事实上,在 2015 年至 2017 年 Kaggle 上发布的 29 个挑战获胜解决方案中,有 17 个使用了 xgBoost。八个单独使用 xgBoost 来训练模型,而其他大多数将 xgBoost 与神经网络相结合或使用堆叠,这是一种流行的集成投票技术。然后,演讲者提供了一篇论文中的两个表格,这些表格比较了不同的增强实现,其中显示 xgBoost 具有有助于提高其有效性的独特功能。

  • 00:40:00 演讲者讨论了 Extra Boost 的特性,Extra Boost 是梯度提升的一种变体,具有近似全局、核外学习、稀疏意识和并行性等多项优势。 Extra Boost 实施近似方法以根据分布式数据子集的汇总统计信息找到最佳分割。演讲者比较了 Extra Boost 和其他梯度提升实现在精确贪婪方法上的性能,并表明 Extra Boost 与一种实现具有相同的性能,但每棵树的时间显着减少,使其对超参数调整更具吸引力。

  • 00:45:00 该视频讨论了 Extra Boost,它本质上是梯度提升的可扩展实现,适用于大型数据集。该视频解释了 Extra Boost 相对于普通梯度提升技术的各种改进,包括正则化、缺失特征的插补技术和缓存。这些改进有助于减少过度拟合,并可以提高 Extra Boost 的整体性能。此外,Extra Boost 使用基于列和行的子采样来随机选择特征子集和训练示例,这有助于减少过度拟合和提高计算效率。该视频建议阅读有关 Extra Boost 的论文,以更详细地解释其技术。

  • 00:50:00 演讲者概述了 Extra Boost,这是一种更新的梯度提升机实现,可以减少过度拟合并提高预测准确性。演讲者讨论了寻找分裂的不同技术,包括精确贪婪算法和基于直方图的分裂寻找。后一种方法涉及将连续特征合并为离散直方图,这可以提高训练速度并减少内存使用。演讲者还将 Extra Boost 与 Light GBM 进行了比较,Light GBM 是另一种更快、更准确的实现。与 Extra Boost 相比,Light GBM 使用基于直方图的分割查找并提供更低的内存使用和更高的预测精度。

  • 00:55:00 演讲者讨论了梯度提升分类器在 scikit-learn 中的实现,并介绍了在最新版本的 scikit-learn 中添加的新梯度提升分类器。新的分类器使用受 LightGBM 启发的基于直方图的分割,使其比以前的分类器更快。演讲者建议同时使用梯度提升分类器并将它们与 XGBoost 进行比较以确定哪一个表现最好。演讲者还为观众提供了代码示例,可用作课堂项目或一般用途的模板。这些示例包括在 scikit-learn 中实现梯度提升分类器以及使用新的直方图梯度提升分类器。

  • 01:00:00 演示者讨论了使用 XGBoost 和 LightGBM 库的梯度提升。 XGBoost 库与 scikit-learn 类似,但比 scikit-learn 复杂一点,并且需要将 NumPy 数组转换为其 D 矩阵格式。演示者设置任意参数并使用 dot train 而不是 fit 来训练模型。之后,模型可以调用 predict 来预测类成员概率。 Microsoft LightGBM 库有一个类似于 scikit-learn 的 API,需要在拟合梯度提升机之前设置超参数,并使用 score 方法计算精度。在这种情况下,该模型在不调整超参数的情况下表现出 100% 的训练准确率。
 

7.6 随机森林(L07:集成方法)



7.6 随机森林(L07:集成方法)

伟大的!我们终于到了第 5 讲的最后一部分,这恰好是最有趣的部分:神圣的学习管道。神圣的学习管道是结合了各种数据处理和预测步骤的对象或类,使它们在现实世界的应用程序中非常有用。为了帮助您了解管道的工作原理,让我们看一下大纲流程图。我现在不会深入研究所有错综复杂的问题,但我们会在提供管道示例后不久重新讨论它。

本质上,管道可以被认为是一个估计器和转换器 API。与估计器类似,流水线具有可用于训练集的拟合方法。在内部,执行多个拟合和转换步骤,然后是最终的拟合步骤。根据管道中包含的组件,您可以定义一系列操作,例如数据缩放(例如,标准化或最小-最大缩放)或降维,然后训练学习算法。然后管道返回一个可用于测试集的预测模型。

在预测阶段,当您在测试集上调用 predict 方法时,管道会在内部使用 transform 来应用在训练集上执行的相同缩放。它还应用最终的预测步骤,例如在分类器的情况下返回类标签。让我们检查一个简单的管道代码示例来说明这个概念。

在这里,我使用 sacred learn 的 scikit-learn.dot.pipeline 子模块中的 make_pipeline 函数创建了一个管道。虽然创建管道的方法多种多样,但这种方法还是很方便的。在此示例中,我构建了一个简单的管道,其中包含一个分类器和一个标准缩放器。正如上一个视频中所讨论的,标准缩放器将数据标准化为零均值和单位方差。创建管道后,我们可以使用 fit 方法在训练数据上训练管道。然后我们可以使用 predict 方法对测试集进行预测。

现在,让我们深入了解 fit 方法在管道中的工作原理。调用 fit 时,首先应用标准缩放器。它从训练数据中学习均值和标准差,并使用它们来缩放数据。此过程涉及拟合和转换步骤,其中标准缩放器计算缩放后的数据并将其传递给下一步。在这种情况下,下一步是 K 最近邻分类器。 K 最近邻分类器接收标准化数据,有效地将这四个步骤合二为一。通过调用 pipe.fit,所有这些步骤都自动执行,省去了我们单独执行它们的麻烦。

在预测阶段,发生相同的过程,只是没有拟合步骤。相反,管道会重复使用训练集参数来扩展测试数据,从而确保一致性。然后它将缩放后的测试数据传递给分类器进行预测。

为了更好地形象化此过程,让我们重新审视流程图。作为用户,你只需要使用 fit 和 predict 方法。通过调用 fit,管道自动调用转换步骤。重要的是要注意管道中的约定是将最后一步作为分类器。只有最后一步调用 fit,而前面的所有步骤都调用 fit 和 transform。因此,管道可以有多个转换器,例如标准缩放器,甚至是主成分分析 (PCA) 等降维技术。但是,它只能有一个分类器作为最后一步。这种设计确保了管道的兼容性和功能。

为了说明管道的运行情况,让我们使用 holdout 方法探索一个简单的模型选择场景。请注意,这只是一个基本演示,我们将在后面的课程中介绍更高级的模型选择方法,如 K 折交叉验证。

holdout 方法涉及将数据分成两个子集:训练集和验证集。训练集用于训练管道,而验证集用于评估其性能并选择最佳模型。

以下是如何使用管道实施 holdout 方法的示例:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import make_pipeline
from sklearn.metrics import accuracy_score

# Load the iris dataset
data = load_iris()
X = data.data
y = data.target

# Split the data into training and validation sets
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a pipeline
pipeline = make_pipeline(
    StandardScaler(),
    KNeighborsClassifier(n_neighbors= 3 )
)

# Train the pipeline
pipeline.fit(X_train, y_train)

# Make predictions on the validation set
y_pred = pipeline.predict(X_val)

# Evaluate the pipeline's accuracy
accuracy = accuracy_score(y_val, y_pred)
print(f "Validation accuracy: {accuracy}" )
在这个例子中,我们首先加载鸢尾花数据集。然后,我们使用 train_test_split 函数将数据分成训练集(X_train 和 y_train)和验证集(X_val 和 y_val)。

接下来,我们使用 make_pipeline 创建管道并传入所需的步骤。在这种情况下,我们包括一个 StandardScaler 来标准化数据和一个 n_neighbors=3 的 KNeighborsClassifier 作为分类器。

我们通过在训练数据(X_train 和 y_train)上调用 fit 方法来训练管道。

训练结束后,我们使用管道通过调用 predict 方法对验证集 (X_val) 进行预测。

最后,我们通过使用 accuracy_score 函数比较预测标签 (y_pred) 和真实标签 (y_val) 来评估管道的准确性。

这是一个使用流水线和 holdout 方法进行模型选择的基本示例。请记住,还有更高级的技术,例如交叉验证,可以提供更稳健的管道性能评估。

 

7.7 堆叠(L07:集成方法)



7.7 堆叠(L07:集成方法)

是的,这是一个很长很长的第七课。最后,我们来到最后一个视频,讨论堆叠。

在整个讲座中,我们涵盖了很多基础知识。我们讨论了多数投票和套袋,我们在其中将决策树拟合到引导样本上。我们还介绍了提升,我们根据先前学习者的错误或错误来拟合深度学习者,以及残差和梯度提升。此外,我们探索了随机森林,它通过在每个节点使用随机特征子集来提高常规装袋的性能。现在,我们终于要谈谈堆叠了。

堆叠类似于多数表决,但使用元分类器结合其他分类器的预测,而不是仅仅进行多数表决。让我们深入了解堆叠的细节。

在我们继续之前,让我提醒您本视频的主题:堆叠。对于不必要的幻灯片,我深表歉意,但让我们关注 David H. Wolpert 在 1992 年发表的题为“Stacked Generalization”的论文中提出的堆叠算法的基础知识。虽然这是一篇旧论文,但我最近一本书中使用的符号'm 引用使它更容易理解。那么,让我们从这个基本版本的堆叠开始吧。

在这个算法中,我们定义了输入和输出,从而设置了问题。我们正在使用大小为“n”的训练数据集。每个特征向量,表示为“x_i”,是一个“m”维向量。类似地,与训练示例对应的类标签表示为“y_i”。该算法的输出是一个集成分类器,我们将其称为第二个分类器。

现在,让我们关注堆叠中涉及的步骤。第一步是学习一级分类器。我们使用从 one 到 't' 的循环来拟合这些分类器。因此,我们有一组分类器,表示为“h_1”到“h_t”,它们在输入数据“X”和类标签“Y”上进行训练。

继续第二步,我们从训练集中构建新的数据集。对于每个训练示例“x_i”,我们创建一个包含修改后的特征向量“x_i 素数”的新数据集。修改后的特征向量“x_i 素数”包含第一级分类器的预测。这些预测可以是类别标签,甚至可以是类别成员概率。通过使用这些预测,我们可以执行多数表决,类似于我们之前讨论的内容。然而,我们并不止于此;我们进行第三步。

在第三步中,我们不执行多数表决,而是根据一级分类器的预测学习二级分类器。 “x_i prime”表示修改后的设计矩阵,其中每一列都包含分类器“h_1”到“h_t”的预测。我们可以对这些预测进行分类,同时考虑类别标签或类别成员概率。这个二级分类器将根据这些预测进行训练。

基本堆叠过程的一个弱点是它对过度拟合的敏感性。如果任何一级分类器过度拟合训练集,它可能会对元分类器的性能产生负面影响并导致系统的整体过度拟合。为了解决这个问题,我们可以通过结合交叉验证来改进堆叠过程。

交叉验证是一种技术,我们将数据集分成多个子集,并在这些子集的不同组合上训练模型。这有助于减少过度拟合并获得更可靠的性能估计。一种常用的变体是 k 折交叉验证,其中数据集被分成“k”个子集或折叠。我们在“k-1”次折叠上训练模型并评估其在剩余折叠上的性能。这个过程重复“k”次,每次使用不同的折叠作为验证集。然后可以对每次折叠的性能结果进行平均,以获得对模型性能的更稳健的估计。

在堆叠的背景下,我们可以使用交叉验证来改进第一级分类器的训练。我们不是在整个训练集上训练它们,而是将数据分成“k”份。对于每个折叠,我们在剩余的“k-1”折叠上训练第一级分类器,并使用它们对遗漏的折叠进行预测。对每个折叠重复此过程,从而产生对整个训练集的预测。

一旦我们得到了整个训练集的一级分类器的预测,我们就可以继续进行堆叠算法的第三步,我们在这些预测上训练二级分类器。通过结合交叉验证,我们确保二级分类器根据一级分类器的多样化和可靠预测进行训练,从而降低过度拟合的风险。

训练完二级分类器后,我们可以用它对新的、未见过的数据进行预测。预测通常是通过将输入馈送到第一级分类器以获得它们的预测,然后将这些预测用作第二级分类器的输入来获得的。二级分类器的输出代表堆叠集成的最终预测。

Stacking 是一种强大的集成学习技术,它利用多个分类器的优势来提高整体性能。通过组合多个分类器的预测,stacking 可以捕获数据的不同方面并做出更准确的预测。它是一种灵活且通用的技术,可以适应不同的问题域和分类器类型。

总之,堆叠是一种超越简单多数表决的集成学习方法。它通过二级元分类器结合多个分类器的预测,允许更复杂的决策。通过结合交叉验证,我们可以增强堆叠算法的鲁棒性和泛化能力。堆叠是机器学习中的一个有价值的工具,并已广泛用于各种应用程序以提高预测性能。

 

8.1 过拟合和欠拟合简介(L08:模型评估第 1 部分)



8.1 过拟合和欠拟合简介(L08:模型评估第 1 部分)

今天是个好日子!我希望你们一切都好。今天我有一些令人振奋的消息要与您分享,所以让我们开始吧。

首先,我已经对您的项目提案进行了评分,我必须说,我对所看到的想法和计划感到由衷的高兴。很明显,在 12 月中旬项目介绍和报告到期之前,你们每个人都对自己的项目进行了大量思考,并对接下来的几周有着清晰的愿景。您提案中的详细程度和深思熟虑给我留下了深刻的印象。

然而,如果你们中的任何人觉得需要额外的反馈或澄清,或者如果你想要一些关于探索额外技术的指导,请不要犹豫与我联系。我非常乐意尽我所能为您提供进一步的帮助和支持。只需给我发一封电子邮件,或安排一次会议,我会在那里提供帮助。

接下来是更多好消息,我们已经成功结束了集成方法讲座,这意味着是时候开始一个令人兴奋的新话题了。在接下来的系列讲座中,我们将重点关注模型评估。与之前介绍各种机器学习分类器和算法的讲座不同,这一次我们将探索如何公平地评估这些算法的性能。

在这个新系列中,我们将涵盖一系列主题。我们将从了解欠拟合和过拟合的概念以及它们与损失函数的偏差和方差分解的关系开始。然后,我们将深入研究允许我们有效比较模型的交叉验证方法。此外,我们将讨论比较不同机器学习算法以确定它们在特定数据集上的性能的技术。区分模型选择和算法选择非常重要,我们将更详细地探讨这种区别。

事不宜迟,让我们开始介绍模型评估,并深入了解过拟合和欠拟合的世界。本讲(第八讲),我们将讨论偏差和方差分解及其与过拟合和欠拟合的关系。我们将分析平方误差损失(与回归相关)和 01 损失(与分类相关)的偏差和方差分解,以全面了解这些概念。此外,我们将触及机器学习中不同类型的偏差,超出分解中涵盖的统计偏差。

在我们深入研究讲座材料之前,让我们退后一步,简要回顾一下我们在课程中的位置。我们已经介绍了介绍、计算方面,例如 Python、NumPy 和 scikit-learn,以及基于树的方法。我们还讨论了基于树的方法的相关性以及集成方法(特别是增强森林和随机森林)在业界的流行程度。现在,以模型评估为重点,我们将探讨各种子主题,包括置信区间、交叉验证、模型选择、算法选择和性能指标。最后,我们将涉及降维和无监督学习。

我想向你保证,这节课比上一节关于集成方法的课要短,因为它相对简洁。尽管如此,它涵盖了有助于我们更好地理解模型评估的关键概念。那么,让我们深入探讨构成第八讲的六个子主题:过度拟合、欠拟合、偏差和方差分解、过度拟合和欠拟合的关系、01 损失的偏差和方差分解,以及机器学习中不同类型偏差的概述。

在整个讲座中,我鼓励你停下来思考我提出的问题,而不是测验。在考虑我对此事的看法之前,停下来形成自己的想法总是有帮助的。以这种方式接触材料将增强您的学习体验。

  1. 过度拟合和欠拟合:在机器学习中,当模型在训练数据上表现非常好但无法推广到新的、看不见的数据时,就会发生过度拟合。另一方面,当模型过于简单并且无法捕获数据中的潜在模式时,就会发生欠拟合。

过度拟合可能是由过于复杂的模型以及相对于可用训练数据量而言具有过多参数的模型引起的。这导致模型拟合训练数据中的噪声而不是真实的潜在模式。另一方面,欠拟合发生在模型不够复杂以捕获数据中的模式时。

  1. 偏差和方差分解:偏差和方差是机器学习模型中的两个错误来源。偏差衡量的是当模型在不同的训练集上训练时,预测值与真实值的平均偏离程度。另一方面,方差衡量当模型在不同的训练集上训练时,给定输入的预测变化有多大。

偏差和方差可以用数学方法分解。模型的期望平方误差可以分解为平方偏差、方差和不可约误差。平方偏差衡量模型预测值与真实值之间的平均差异。方差衡量模型对给定输入的预测的可变性。不可约误差表示数据中的固有噪声,任何模型都无法减少。

  1. 与过度拟合和欠拟合的关系:偏差方差权衡与过度拟合和欠拟合密切相关。过度拟合通常与低偏差和高方差相关。该模型非常适合训练数据,但无法泛化到新数据,因为它对训练集中的小波动过于敏感。

另一方面,欠拟合与高偏差和低方差相关。该模型过于简单,无法捕获数据中的潜在模式,导致训练和测试数据的性能都很差。

  1. 01损失的偏差和方差分解:到目前为止,我们已经讨论了回归问题中常用的平方误差损失的偏差和方差分解。然而,在分类问题中,我们通常使用 01 损失,它衡量错误分类实例的比例。

01 loss的bias-variance decomposition和squared error loss类似,但是涉及的数学更复杂。平方偏差衡量模型预测与真实标签之间误分类率的预期差异。方差衡量给定输入的误分类率的可变性。

  1. 机器学习中不同类型偏差的概述:除了偏差-方差分解中讨论的统计偏差之外,机器学习中还有其他类型的偏差:
  • 抽样偏差:当训练数据不能代表真实人口或具有偏态分布时,就会发生这种情况。这可能会导致模型在训练数据上表现良好,但无法推广到更广泛的人群。
  • 算法偏差:它指的是算法本身可能产生的偏差。例如,某些算法可能更容易基于它们所接触的训练数据或它们考虑的特征而产生偏差。
  • 认知偏差:是指人类决策过程中可能产生的偏差,例如数据标注或特征选择中的主观判断或无意识偏差。

了解这些不同类型的偏见对于构建公平可靠的机器学习模型至关重要。

第八讲的主要主题到此结束。如您所见,过度拟合、欠拟合、偏差和方差是相互关联的概念,在模型评估中起着至关重要的作用。重要的是要在复杂性和通用性之间取得平衡,以避免模型过度拟合或欠拟合。此外,了解不同类型的偏见有助于解决机器学习中的公平和道德问题。

 

8.2 偏差和方差背后的直觉(L08:模型评估第 1 部分)



8.2 偏差和方差背后的直觉(L08:模型评估第 1 部分)

大家好!我希望你过得很好。我有一些令人振奋的消息要与大家分享。首先,我已经完成了对您的项目建议书进行评分的任务。让我表达我很高兴阅读您在本学期剩余时间的所有绝妙想法和计划。看到你们每个人都为接下来的几周导致项目演示和报告制定了明确的路线图,真是令人印象深刻。

如果你们中的任何人觉得需要额外的反馈或需要对任何方面进行澄清,请不要犹豫,通过电子邮件或任何其他方式与我联系。我非常乐意为您提供进一步的指导,并指出可能与您的项目相关的其他技术。

现在,让我们继续看下一个好消息。我们已经成功结束了集成方法讲座,是时候进入一个令人兴奋的新话题了。在接下来的系列讲座中,我们将探讨模型评估的主题。与之前的讲座不同,我们介绍了各种机器学习分类器和算法,这一次我们将重点关注如何公平地评估这些算法。

模型评估的讲座将涵盖几个方面。我们将从了解欠拟合和过拟合的概念以及它们与损失函数中偏差和方差分解的关系开始。然后,我们将探索允许我们有效比较模型的交叉验证方法。稍后,我们将讨论比较不同机器学习算法及其在特定数据集上的性能的技术。

需要注意的是,模型选择涉及选择合适的算法,这一点也将得到更详细的讨论。我们将研究它与模型评估有何不同。因此,让我们从介绍模型评估开始我们的旅程,并从那里继续构建我们的知识。

在我们深入研究新主题之前,让我们花点时间回顾一下我们在本课程中的进展。我们从介绍开始,涵盖了重要的计算方面,例如 Python、NumPy 和 scikit-learn。我们还探索了基于树的方法,这引发了一些关于它们在行业中的相关性的有趣讨论。

现在,当我们进入模型评估阶段时,我们将探讨几个与欠拟合和过拟合相关的子主题。在这个特别的讲座(第八讲)中,我们将重点关注偏差和方差分解及其与过拟合和欠拟合的联系。我们将检查偏差和方差分量如何影响模型的泛化性能。

此外,我们将探索 0-1 损失的偏差和方差分解,这与分类问题更相关。该分析将使我们对分类任务背景下的过拟合和欠拟合有更深入的理解。

为了结束本次讲座,除了前面讨论的统计偏差之外,我们将简要介绍机器学习中不同类型的偏差。

现在,让我们将注意力转移到过拟合和欠拟合的主要概念上。在机器学习中,我们的最终目标是开发具有良好泛化性能的模型(回归或分类)。这意味着模型应该在看不见的数据上表现良好,这些数据通常来自测试集。虽然我们还考虑了测试集的性能,但它可以作为对未见数据的泛化性能的估计。

在没有拟合或训练模型的情况下,我们期望训练误差与测试误差相似。然而,当我们将模型拟合到训练集时,我们经常观察到训练误差低于测试误差。这是过度拟合的结果,模型变得过于贴近训练数据(包括噪声),导致对性能的乐观估计。

相反,当模型未能捕获数据中的潜在模式时,就会发生欠拟合,从而导致训练和测试错误率都很高。在这种情况下,模型缺乏。

足够的复杂性来表示特征和目标变量之间的真实关系。

为了更好地理解过度拟合和欠拟合,让我们考虑偏差方差权衡。偏差是指通过用简化模型逼近现实世界的问题而引入的误差。高偏差模型往往会过度简化数据中的基本模式,并可能导致欠拟合。另一方面,方差是指模型对训练数据波动的敏感性引入的误差。高方差模型会捕获训练数据中的噪声和随机变化,从而导致过度拟合。

偏差-方差权衡可以通过将预期测试误差分解为三个部分来说明:不可约误差、偏差项和方差项。不可约误差表示数据中的固有噪声,任何模型都无法减少。偏差项衡量通过使用简化模型逼近现实世界问题而引入的误差,方差项衡量因模型对训练数据波动的敏感性而导致的误差。

在数学上,我们可以将预期的测试误差表示如下:

预期测试误差 = 不可约误差 + 偏差^2 + 方差

理想情况下,我们希望找到偏差和方差之间的平衡点,以最小化预期的测试误差。然而,减少一种成分通常会导致另一种成分的增加。这种权衡在模型选择和评估中至关重要。

在分类问题的背景下,我们还可以检查 0-1 损失的偏差方差分解,这是分类任务中常用的损失函数。 0-1 损失将错误衡量为错误分类实例的比例。 0-1 损失的偏差方差分解提供了对分类模型中错误来源的洞察。

除了统计偏差之外,还有其他类型的偏差会影响机器学习模型。这些偏差可能来自各种来源,包括采样偏差、测量偏差和算法偏差。了解这些偏差对于构建公平可靠的机器学习系统至关重要。

在下一课中,我们将深入研究交叉验证,这是一种用于估计模型泛化性能的强大技术。交叉验证允许我们通过模拟对不同数据子集的训练和测试过程来评估模型对未见数据的执行情况。我们将探索不同类型的交叉验证方法,例如 k 折交叉验证和分层交叉验证,并讨论它们的优点和局限性。

今天的讲座就到这里。我鼓励您查看所涵盖的材料,并准备好您可能对我们的下次会议提出的任何问题。谢谢你,祝你有美好的一天!

 

8.3 平方误差的偏差-方差分解(L08:模型评估第 1 部分)



8.3 平方误差的偏差-方差分解(L08:模型评估第 1 部分)

在上一课中,我们对偏差和方差有了一些直觉,并简要介绍了损失函数的偏差-方差分解。现在,在本讲中,我们将通过关注平方误差损失来更深入地研究偏差方差分解。在我们探索它与过拟合和欠拟合的关系之前,从平方误差损失开始可以使它更简单、更直观。此外,我们将简要讨论 0-1 损失的偏差-方差分解,这是一个更具争议的话题,最近的工作专门针对它。但是,我们将首先检查平方误差的情况,因为它提供了更直接的理解。

简要回顾一下,偏差和方差在之前的视频中有更详细的介绍,但花点时间回顾一下设置是有益的。我们正在查看点估计减去预测,它表示给定模型和特定训练集的预测目标。期望接管从相同分布或人群中提取的不同训练集。该期望表示测试集中给定数据点的平均预测。

偏差测量平均预测与真实目标值的距离,而方差量化每个单独预测偏离平均预测的量。方差项被平方以忽略符号并关注预测围绕平均值的整体分布。

平方误差损失可以表示为 (theta - theta hat)^2,其中 theta 是真实值,theta hat 是特定数据点的预测值。在本讲中,我们将重点关注平方误差损失的偏差-方差分解,只考虑偏差和方差项,忽略噪声项。

为了继续进行偏差方差分解,我们为场景引入了一些符号和设置。我们考虑一个生成标签 (y) 的真实函数,并且我们有一个假设 (h) 作为我们的模型,它近似于真实的数据生成函数。我们使用 y hat 来表示预测。使用这些项,我们可以将平方误差损失表示为 (y - y hat)^2。为了避免与期望符号 (E) 混淆,我们将平方误差表示为 (s)。

现在,让我们将平方误差分解为偏差和方差分量。为实现这一点,我们采用了插入和减去预测期望的数学技巧。通过这样做,我们扩展了二次表达式并将其分成三项:(y^2, -2yy hat, y hat^2)。

接下来,我们将期望应用于等式的两边。将期望应用于第一项会产生 y^2,它保持不变,因为 y 是常数。第二项的期望值 -2yy hat 为零,因为我们反复从其自身减去相同的值(y 帽的期望值)。至于第三项,y hat^2 的期望代表预测的平均值。

应用期望后,我们剩下两项:平方偏差和方差。偏差平方为 (y - E[y hat])^2,衡量真实标签与平均预测之间的差异。方差为 E[(y hat - E[y hat])^2],量化单个预测与平均预测的平均平方偏差。

为了演示在应用期望时消除术语 -2yy 帽子,我们分解了这些步骤。将期望值应用于 -2yy hat 结果为 2E[yy hat]。进一步扩展表达式,我们发现 yy hat 的期望等于 E[y]E[y hat],因为 y 是一个常数。因此,-2yy hat 的期望简化为 -2E[y]E[y hat]。

从平方误差 (s) 中减去此项得到:

s = y^2 - 2yy hat + y hat^2 = y^2 - 2yy hat + y hat^2 - 2E[y]E[y hat] + 2E[y]E[y hat]

现在,让我们重新排列术语:

s = (y - E[y 帽子])^2 + 2(E[y]E[y 帽子] - yy 帽子)

我们可以通过认识到 E[y]E[y hat] 是一个常量值来进一步简化表达式,表示为 c。因此,我们有:

s = (y - E[y 帽子])^2 + 2(c - yy 帽子)

最后,让我们关注第二项,2(c - yy hat)。该术语可以分解如下:

2(c - yy 帽子) = 2c - 2yy 帽子

第一项 2c 是常数,不依赖于预测 y 帽。第二项,-2yy hat,表示真实标签 y 和预测 y hat 之间的交互。

现在,我们可以总结平方误差损失的偏差方差分解如下:

s = (y - E[y 帽子])^2 + 2c - 2yy 帽子

第一项 (y - E[y hat])^2 对应于平方偏差。它测量真实标签 y 和平均预测 E[y hat] 之间的差异。

第二项 2c 是常数,表示平方偏差。它不受预测 y 帽子的选择的影响。

第三项,-2yy hat,代表方差。它捕获了个人预测 y hat 围绕其平均 E[y hat] 的可变性。它直接受预测 y 帽的选择影响。

因此,我们可以得出结论,平方误差损失可以分解为平方偏差项、常数平方偏差项和方差项。

了解偏差方差分解有助于我们深入了解模型的行为。高偏差表示拟合不足,其中模型无法捕获数据中的潜在模式。高方差表示过度拟合,其中模型对训练数据过于敏感并且无法很好地泛化到看不见的数据。

通过分析偏差和方差分量,我们可以就模型复杂性、正则化技术和数据收集策略做出明智的决策,以优化模型的性能。

在下一讲中,我们会将偏差方差分解扩展到 0-1 损失并讨论其含义。

 

8.4 偏差和方差与过拟合和欠拟合(L08:模型评估第 1 部分)



8.4 偏差和方差与过拟合和欠拟合(L08:模型评估第 1 部分)

在这个视频中,我的目标是创造本课程最短视频的记录。我想保持简洁,不要拖延太久。我只有两张幻灯片,所以不会花太多时间。在本视频中,我们将探讨偏差方差分解与欠拟合和过拟合概念之间的关系。

让我们从查看本讲座前面显示的图表开始。请注意,这是一个简单的草图,并非基于实数。实际上,在处理真实世界的数据集时,这些术语之间的关系可能很嘈杂。该图说明了根据模型容量绘制的平方误差损失,这与其复杂性或拟合训练数据的能力有关。

容量是指模型适合训练集的程度。更高的容量意味着模型更能够拟合数据。例如,在回归等参数模型中,容量通常由参数或项的数量决定。随着容量的增加,训练误差会减少,因为更复杂的模型可以更好地拟合训练数据。

然而,低训练错误并不能保证在新数据上有好的表现。过于紧密地拟合训练数据可能会导致过度拟合,这会导致新数据上的误差增加,称为泛化误差。可以使用独立的测试集来估计泛化误差。最初,随着容量的增加,泛化误差在一定程度上有所改善。但是达到某个点后,误差又开始增加,说明过拟合了。

训练误差和泛化误差之间的差距代表了过拟合的程度。随着模型容量的增加,差距也会增加,因为模型与数据的拟合过于紧密,包括数据中的噪声。过度拟合的程度表示模型过度拟合训练数据并且未能很好地泛化到新数据的程度。

现在,让我们将这些概念与偏差和方差联系起来。在图中,我添加了红色的术语偏差和方差。随着模型容量的增加,它的方差也会增加。与短决策树相比,在深度决策树的情况下可以观察到这一点。具有较高方差的模型更容易过度拟合。方差越大,过拟合程度越大,表现为训练误差和泛化误差的差距。

相反,随着方差增加,偏差减小。更复杂的模型通常具有更低的偏差。该图可能看起来显示偏差下降然后又上升,但这只是错误绘图的结果。实际上,随着模型容量的增加,偏差会随着方差的增加而逐渐减小。

另一方面,当模型容量较低(例如简单模型)时,它会欠拟合数据,导致训练集和测试集的性能都很差。这与高偏差有关。当模型过于简单而无法捕捉数据中的潜在模式时,就会发生欠拟合。

总而言之,高偏差与欠拟合相关,而高方差与过拟合相关。在下一个视频中,我们将简要探讨 0-1 损失的偏差-方差分解,这与分类任务更相关。虽然它不如分解平方误差损失直观,但它提供了对分类上下文中偏差和方差分量的洞察。