【译】LightGBM 模型的贝叶斯优化

731 阅读13分钟

看清数字。LightGBM模型的贝叶斯优化

使用贝叶斯优化调整LightGBM模型的超参数,并与一个简单的特征工程练习的改进进行比较。

照片:David TravisonUnsplash

背景

在一个典型的 "小心搜索 "的案例中,阅读了几篇关于模型超参数优化的在线文章后,我的新闻联播被大量的操作指南轰炸,保证 "在几个简单的步骤中 "获得 "最强大的模型。"

当然,我是在夸大其词。

然而,我注意到的是,很少有文章真正提到超参数调整只是这个过程的一部分,并不是预测能力的银弹解决方案。更少的文章提到,从超参数优化中获得的预测能力是适度的,很可能比体面的特征工程的收益要少。

提升树

LightGBM是一个梯度提升框架,使用基于树的学习算法。它是一个集合技术的例子,它将薄弱的个体模型结合起来,形成一个单一的精确模型。

有各种形式的基于树的梯度提升模型--LightGBM和XGBoost只是流行程序的两个例子。

LightGBM在速度和内存需求方面具有优势,是我首选的梯度提升模型框架。

参数和超参数

当我们谈论调整机器学习模型时,需要做一个微妙但重要的区分--参数_和_超_参数之间的区别。_

  • 参数是指由模型本身计算出来的一个值。
  • 超参数是指由用户提供给模型的一个输入值。

例如,如果我们使用LASSO回归框架,用户将提供正则化惩罚𝜆(超参数),模型将计算--除其他外--回归协系数𝛽(参数)。

LightGBM通过各种超参数提供大量的定制服务。虽然一些超参数有一个建议的 "默认 "值,一般来说会产生良好的结果,但为手头的任务选择定制的参数可以提高预测的准确性。

没有硬性规定来决定每个任务的最佳模型参数。在大多数情况下,建模者通过使用专家的判断和经验或者使用某种形式的搜索技术来设置参数。

有许多搜索技术旨在确定 "最佳 "超参数集,即提供最具预测性的模型集(由用户或用例定义),最好是结合交叉验证来提高严格性。

网格搜索技术是基本的粗暴搜索,即为每个超参数设定可能的值,搜索算法全面评估每个超参数的组合。这是一种在时间和计算能力方面都很密集的方法,因为搜索空间很快就会变得非常大。

作为基本网格搜索的延伸,随机网格搜索技术已经被证明可以提供可靠的结果。其设置与基本搜索相似,即建模者为每个参数设置一个搜索空间,然而在每个评估步骤和每个参数,算法从搜索空间的范围内(随机)抽取一个值。

使用**"智能 "搜索技术,**建模者为每个超参数设置一个搜索空间。该算法评估了从搜索空间中抽取的一组参数的性能,并使用该结果以迭代的方式告知参数的选择。通过这种方式,该算法以一种更有效的方式 "磨合 "出最佳解决方案。下面展示的贝叶斯优化就是智能搜索技术的一个例子。

超参数调整与特征工程

早些时候,我提出了一个未经证实的说法,即从超参数调整中获得的预测能力可能会被适当的特征工程的收益所取代。

尽管许多人认为(和写道),参数优化在生成高度精确的模型中起着相对较小的作用。参数调整带来的精度提升通常比预期的要小*--我认为2%-3%的精度提升是一个相当大的成就--因此应该真正被看作是一个最后的修饰。

为了获得更大的精度提升,建模者应该真正检查他们的模型规格和特征工程过程;更丰富和更有信息量的数据通常会产生更强大的模型。

我们将对这一假设进行测试,因为我们将超参数调整和特征工程带来的模型精度的提高与基准精度指标进行比较。

当然,这并不是在所有情况下都是正确的--例如,一个使用完全不合适的超参数的模型在选择了 "最佳 "超参数后会有明显的改善。

数据

我们将使用MNIST数据的一个子集:一个经常用于计算机视觉基准练习的大型手写数字数据库。

  • 42,000个手写数字中的每一个都被捕获在一个28 x 28像素的图像中。
  • 每幅图像都被分解成具有784列的单行,每列代表图像的一个像素。像素值在[0,255]范围内变化,表示像素的强度(即像素的 "亮 "的程度)。
  • 除此之外,我们还有可用于预测的真实标签。

过程

让我们开始吧--我们会的。

  1. 导入和处理数据。
  2. 为LightGBM模型建立交叉验证过程,获得交叉验证模型准确性的基线估计。
  3. 建立贝叶斯优化过程,设置参数搜索空间并运行优化器。
  4. 设计一个简单的特征,评估新特征对模型精度的影响。

数据导入和处理

数据导入

在我们使用pandas导入数据后,我们可以很容易地创建我们的交叉验证折线。

medium.com/media/a106b…

这导致了相当均匀的褶皱。

图片由作者提供

让我们做一些可视化的工作--首先检查一些我们试图通过从数据中重建图像来预测的例子。

作者提供的图片

...然后检查目标值(即数字)的总体分布。

作者的图像

...最后检查目标值在交叉验证褶皱中的分布。

图片由作者提供

上面的分布图和统计数据看起来很有希望:褶皱被均匀地创建,褶皱内目标值的分布看起来与整体目标分布一致。我没有发现任何不平衡的问题--呼--因此将继续下去。

数据处理。缩放和降维

我们现在有一个长42000行、宽784列的数据集。在这么大的数据集上进行交叉验证和超参数优化,对我可怜的小笔记本电脑来说是相当沉重的工作。

因此,我很想把这个数据集压缩到更容易处理的程度。我将通过首先缩放像素数据,然后执行主成分分析(PCA)来减少列的数量来做到这一点。

sklearn有一个很好的PCA算法的实现,我用它将784个特征集减少到87个特征,同时保留了数据中90%的 "变化"。

LightGBM的交叉验证功能

在交叉验证方面!

幸运的是,LightGBM带有自己的交叉验证功能,这将有助于简化代码。

medium.com/media/9598f…

敏锐的读者会注意到,该功能只接受了LightGBM超参数的一个子集。这是有目的的,因为这些是我们以后要调整的超参数。

使用上述 "默认 "参数集运行交叉验证,可以得到95.8%的基准准确率--还不错!这就是我们的目标。

贝叶斯优化

我们提到贝叶斯优化是超参数调整的一种 "聪明 "方法。

我们将使用Python实现的BayesianOptimization,它是一个建立在贝叶斯推理原则基础上的受限全局优化包。

该软件包试图在尽可能少的迭代中找到一个 "黑箱 "函数的最大值,特别适合于需要高计算和/或时间资源的优化问题。

贝叶斯的分析方法非常简单。

  1. 收集先验假设--在不收集或分析任何真实世界数据的情况下,对过程进行初始假设。在我们的案例中,我所指定的超参数搜索空间就是_先验_假设。
  2. 通过调查被分析的过程来收集证据,通常是通过抽样或研究现实生活中的事件。"证据 "来自于使用从搜索空间中抽取的超参数值进行交叉验证的模型精度。
  3. 利用收集到的证据,更新初始假设,形成_后验_信念;理论上,后验信念应该比先验信念更明智、更准确。我们的后验信念将是一个缩小的超参数搜索空间。

在实践中,第2和第3步将被重复多次--有时第3步为第2步提供信息--每一次迭代都会对 "最佳 "超参数集产生一个更明智的看法。

例如,一次运行可能是这样的:1→2→3→2→3→2→3→_最终参数_。

BayesianOptimization是用户友好的,对用户的要求相对较少。

  • 指定要最大化的函数。在这个例子中,这就是我们的交叉验证准确度函数cross_val
  • 指定超参数搜索空间。
  • 指定初始探索和后续优化的数量(即重复上述步骤2和3的次数)。

medium.com/media/8adb6…

图片由作者提供

上表显示了优化过程的结果。前10次迭代被用作最初的证据收集,随后又进行了10次更新和优化的迭代步骤。新的准确度最大值以紫色突出显示。

我们可以看到,在第4、16和20步中,准确性有所提高。

  • 第4步的改进是来自纯粹的随机选择--类似于我们从随机网格搜索中获得的成功。
  • 第16步和第20步的改进是来自于收集证据和更新假设的贝叶斯过程。

优化大约花了14.5分钟,将模型的准确性从95.8%提高到96.5%。

那换成一个强大的新特征呢?

是时候测试我们的假设了,即特征工程可以比超参数优化更强大。

在这里,我们将创建一个相当简单的K-means聚类。由于这是一个相当知名的技术,我不会在理论上花太多时间,除了说。

  • 该算法将每一行数据分配给一个聚类。
  • 聚类特征应该帮助模型区分数字,因此应该将类似的观察结果归为一组。可能有一些情况会出错(比如把一些7和1归为一组,或者反过来)。因此,我将指定创建10个群组--每个数字0-9(含)都有一个群组。
  • 我们将更严格地进行折内建模和折外预测。

medium.com/media/50f06…

从这段代码中看不出来,但进行聚类大概需要30秒。

交叉验证的准确性,使用默认的参数和通过聚类增强的数据现在是96.2%。

因此,看起来我错了--超参数调整比特征工程更胜一筹!"。

好吧,也许不完全是,一旦我们把时间和计算元素考虑在内......

  • 超参数调整在14.5分钟的计算时间内增加了0.7个百分点。这大约是每分钟增加0.05个百分点的准确性。
  • 特征工程在30秒的计算时间内实现了0.4个百分点的增长。这大约是每分钟增加0.8个百分点的准确率。

最后的想法

......和一些闲言碎语。

在这篇笔记中,我们做了很多事情!

首先,我们介绍了MNIST数据,并看到了图像如何以表格的形式表示。这方面还有很多细微的差别,尤其是在处理彩色图像时,但这是一个开始。

我们讨论了一些理论,包括提升树、参数和超参数、超参数优化和特征工程, 以及 贝叶斯推理方法和它是如何应用于超参数优化的。

我们以一种整齐和可重复的方式手动创建了我们的交叉验证折页。我们可以用其他方法取得类似的结果,但这种方法很容易定制, ,并可以扩展,以确保某些观察结果总是在同一褶皱中结束。有用的!

一些整洁的可视化显示了我们试图建立的模型,并允许我们检查数据的不平衡性交叉验证折线的创建是否合适

我们简单地讨论了缩放问题**,** 主成分分析使我们能够大幅度地减少建模集的大小。我做PCA的方式有几个问题。

  1. 我对数据进行了缩放,使其位于[0, 1]的范围内;在运行PCA之前,它确实应该被归一化(即零平均值和单位标准偏差)。
  2. 为了提高交叉验证的严谨性,PCA组件应该只在折中数据上进行训练。我已经使用了完整的数据集,但是应该把转换建立在一个管道上,可以在交叉验证过程中使用。
  3. 根据所使用的模型和超参数,在PCA之后可能需要进行一些额外的缩放。例如,神经网络倾向于在某些范围内(通常是[0,1])对数据进行缩放,从而表现更好。如果我们要使用带有正则化惩罚的LightGBM模型,我们就需要再次对数据进行标准化。

交叉验证贝叶斯优化功能已经建立起来了--而且出乎意料地简单,K-均值聚类也是如此。

我们看到,在这种情况下,虽然两种方法都提高了模型的准确性,但从绝对意义上来说,超参数调整比特征工程要好。然而,一旦考虑到计算时间,我们看到特征工程 提供了更多的成本效益。

我认为还可以进一步改进,以提高模型的准确性。

  • 图像旋转可以提高模型的概括能力。作为特征工程的一种形式,这将涉及到通过略微旋转像素数据,从现有的集合中创建 "新 "的观察结果。该模型将在原始数据和旋转数据的混合体上进行训练,并希望能对混乱的写作者更加强大。
  • 图像的像素之间很可能存在非线性关系--考虑相邻像素之间 "关闭 "和 "开启 "的步骤(或非常快速)的变化。非线性降维技术--t-SNE或类似的技术--在这里可能是有用的。
  • **不同的模型规格可以提高性能:**有人指出,神经网络在计算机视觉任务中工作良好。


看到数字。LightGBM模型的贝叶斯优化最初发表在Medium上的Towards Data Science,在那里人们通过强调和回应这个故事继续对话。