原创:晏茜
资料来源:Mozak
竞赛无论对于在校生亦或是在职的同学,都是一种非常好的学习方式。为什么数据人才要参加竞赛呢?首先,Kaggle,天池,百度的飞桨等竞赛平台为数据人才提供了优质的竞赛环境;其次,竞赛是符合国家政策导向的,2021年《十四个五年规划和 2035 年远景目标纲要》中明确提出,强化国家战略科技力量,加快数字化发展的发展目标;除此之外,面对社会对数据人才的广泛需求,数据人才更应紧跟技术发展与产业升级的脚步,了解竞赛对于个人成长与发展的价值,积极参与竞赛。
本文主要围绕树模型与集成学习的相关内容展开讲解,旨在为想要参加竞赛或希望提高竞赛分数的同学提供一定的技术指导。
1. 集成学习介绍
1.1 集成学习是什么?
集成学习(Ensemble Learning)是集合多个学习算法以提高模型的效果,是机器学习中重要的一类方法。很多高阶机器学习模型(随机森林、XGBoost)和深度学习都包含了集成学习思想。
那么集成学习到底是什么呢?集成学习其实是一类机器学习的算法,你可以把它理解为一种训练思路,而并不是某一个单独的算法。集成学习的一个关键点就在于它集合了多个学习算法。如果我们有了多个模型,每个模型有它各自的多样性,通过集成学习,我们能够得到一个更好的精度。
1.2 集成学习有哪些分支?
集成学习在我们的日常生活是十分常见的,比如投票选班长或者通过多次摇骰子来进行投票,其实都体现了集成学习的思想。常见的集成学习类型有 Bagging、Boosting、Stacking 三种。这里会逐一为大家介绍这三种集成学习的类型。
Bagging
我们在学习机器学习基础的时候,在教材中,比如周志华的西瓜书,都会讲到 Bagging 这种集成学习的类型。Bagging 基于“民主”的集成思路,并行训练多个模型。这里的“民主”是什么意思呢?是每个机学习器都是相互平等的。而正是由于我们的机器学习的平等独立的特性,才使得 Bagging 能够进行并行的训练,不需要做串行的训练。Bagging 的用法是在训练过程中训练多个模型,然后对预测结果进行集成。Bagging 的优点是可以减少误差中的方差项(variance),它能够降低模型预测结果的误差。它的缺点是增加了时间的开销,且需要模型具备多样性,由于是并行训练,它需要有较大的计算资源,而如果我们的模型不具备多样性的话,最终得到的结果也会不尽如人意。
关键点:多个模型如何保证多样性?
方法1:每次采样得到参与训练的样本(行采样)
方法2:每次采样得到参与训练的字段(列采样)
方法3:每次对模型的超参数进行修改
Boosting
Boosting 基于“精英”筛选的思路,串行训练多个模型。“精英”指它不是一个“民主”的,而是一个筛选的过程,类似于进化的过程。Boosting 在其训练过程中,它的模型是基于上一轮的模型进行继续拟合的,模型与模型之间是串行的过程,它们之间是相互依赖的。Boosting 的优点是可以减少偏差(bias),它主要是减少误差中的偏差项。而由于在它在进行训练的过程中,是不断的学习上一轮模型的残差的,所以 Boosting 其实是容易过拟合的。
关键点:如何基于上一轮模型进行继续学习?
方法1:对错误样本调整权重
方法2:拟合上一轮模型预测值的误差
Stacking
Stacking 是基于“标签”学习的思路,堆叠多个模型。Stacking 通过交叉验证的方法对训练集进行训练和预测,并以此进行二次学习。它的优点是能够结合不同类型的模型来完成学习,它的缺点是它的时间开销是非常大的,并且非常容易过拟合。
关键点:模型如何利用交叉验证训练?
什么是交叉验证呢?交叉验证(Cross Validation)是在竞赛的过程中经常会用到的一种操作。在竞赛的过程中,具体的数据集有 train set 和 test set,在 train set 上构建一个模型,在 test set 上做一个预测,然后去提交打分。原始的数据集可能只有这两部分。但是在进行训练的过程中,我们可能还会划分一部分出来,我们会把 train set 再拆分成一个 training set 和一个 validation set,也就是说我们会划分出一个验证集出来,因为有了验证集我们就可以做一个 Stacking。无论是竞赛的过程中,还是在机器学习的学习过程中,一个关键点是验证集应该如何划分。验证集主要有两种划分方法。第一种是 hold out 流出法,或者称为按照比例进行划分的流出法,比如说 75% 的比例进行训练,25% 的比例进行验证。第二种是 KFold,KFold 是指我们在进行具体的数据划分的时候,可以把数据集划分成 k 份。比如我们将数据集划分成 5 份,我们首先将第 1 份看作验证集,其他 4 份看作训练集,记作 fold 1,然后将第 2 份看作验证集,其他 4 份看作训练集,记作 fold 2,以此类推,我们可以循环 5 次,最终得到 5 个模型。
那么我们来看一看如图所示的 Stacking 的思路,它与我们的交叉验证有什么样的共同点和区别呢?
在此模型进行训练的过程中,仍是将我们的数据集划分成 5 份,蓝色部分是训练集,橙色部分是验证集。训练了一个模型之后,我们可以对它的验证集进行预测。当训练完全部的五个模型之后,我们可以将模型预测的结果进行拼接。也就是说,一个模型的具体的预测结果是可以拆分成两部分的,一部分是对验证集的预测结果,另一部分是对测试集的预测结果,我们可以将验证集的预测结果拼接到一起,这个拼接到一起的预测结果与我们的原始训练集的维度是一样大的,这个特征叫做 out-of-fold 特征,它是可以当做一个新的特征的。在具体的操作过程中,我们可以得到模型对训练集的预测结果,以及对测试集的预测结果,这样就相当于是新增加了一类的特征,这一类的特征我们是可以用来做新的建模的。一个模型通过 5 折交叉验证可以增加一个特征,如果是 n 个模型,就可以增加 n 个特征。那么我们在进行二次学习的时候,就可以用我们的新的模型去将我们的 n 个特征和我们的真实标签再去进行一个二次学习。这就是一个基础的 Stacking 的思路。
总结
Bagging 是从数据的角度得到多样性。
Boosting 是一个串行的过程,也就是串行的迭代。
Stacking 就是做一个二次学习,我们将 K-NN,Decision Tree 以及 SVM 的预测结果进行一个二次学习,再用一个模型对它的预测结果进行具体的学习。
2. 树模型与集成学习
树模型是非常好的基学习器(弱学习器)。
如何结合多颗树完成模型构建呢?
Random Forest: Bagging + Decision Tree
GBDT: Gradient Boost + Decision Tree
将树模型和集成学习进行结合的想法是可行的。比如,如果我们将 Bagging 和 Decision Tree 思路进行结合,在进行训练的时候,我们训练多棵树,每棵树使用具体的不同的数据,那么这样就是随机森林的思路。如果我们将 Gradient Boost 和 Decision Tree 思路进行结合,那么就是 GBDT 的思路。
随机森林是基于 Bagging 的思路,对数据集进行有放回的采样,构建不同的数据集,然后从数据集里面训练得到不同的模型,最终完成投票,或者是加权求和。
在竞赛的过程中,我们一般情况下是不会去使用随机森林,我们现在会直接使用比较高阶的一些树模型,比如 XGBoost,LightGBM 或 CatBoost。
LightGBM 的贡献
LightGBM 的特点或贡献主要有如下几点。
单边梯度抽样算法;
直方图算法;
互斥特征捆绑算法;
深度限制的 Leaf-wise 算法;
类别特征最优分割;
特征并行和数据并行;
缓存优化。
LightGBM 的贡献:单边梯度抽样算法
对样本进行采样,选择部分梯度小的样本;
让模型关注梯度高的样本,减少计算量。
首先来看单边梯度抽样算法,我们在进行训练的过程中,可能会计算具体的逻辑 function,然后可以得到具体的梯度信息。我们在进行选择的过程中,会剔除梯度比较小的样本,也就是说,我们会让模型关注梯度比较高的一些样本,这样可以减少模型的计算量,加速训练。
如图是来自于原始论文中的 LightGBM 的伪代码,它的具体的特征是由梯度比较强的一部分样本和梯度比较弱的一部分样本这两部分组成的。
LightGBM 的贡献:直方图算法
将连续特征离散化,用直方图统计信息;
对内存、速度都友好。
第二个是直方图算法,它是 LightGBM 提出伊始的一种非常惊艳的算法。在使用树模型的时候,我们的类别特征需不需要做 onehot 呢?其实在 LightGBM 被提出来之前,一般情况还是建议做 onehot 的,也就是说,在使用 XGBoost 的时候,是建议做 onehot 然后再做训练的。但是现在 LightGBM 的原始论文中使用了直方图的算法来将连续特征做离散化。在 2017 年第一版本的 LightGBM 提出的时候,它的直方图的算法已经比 XGBoost 快很多了。
LightGBM 直方图算法的连续特征离散化特征,是将具体的连续特征用直方图去做一个相当于分箱的过程。分箱是把具体的连续分布划分成不同的单元格,然后从单元格的角度去进行节点的划分。如图是它的具体的伪代码。
它的伪代码对于每个特征去构建一个直方图,然后再去从直方图里面找到最优的分裂节点。
LightGBM 的贡献:互斥特征捆绑算法
使用互斥捆绑算法将特征绑定,降低复杂度;
将特征绑定视为图着色问题,计算特征之间的冲突值;
将特征增加增加偏移量,然后一起相加分桶。
LightGBM 也支持互斥捆绑的过程。我们在进行迭代的过程中,其实是可以将特征进行绑定,以此来降低模型的复杂度的。但是在绑定的过程中,其实是有一个搜索过程的,LightGBM 把搜索过程视为图着色问题,然后去计算特征之间的冲突值。LightGBM 将两个特征的直方图进行相加,组成为一个新的直方图,然后在新的直方图中找到分裂节点,它的核心的仍然是基于直方图的操作。
LightGBM 的贡献:深度限制的 Leaf-wise 算法
每次分裂增益最大的叶子节点,直到达到停止条件;
限制树模型深度,每次都需要计算增益最大的节点;
LightGBM 还有一个贡献就在于它是基于 Leaf-wise 的节点分裂。我们在进行节点分裂的过程中,会设置树模型的最大深度,这是我们在一些机器学习模型里面需要设置的超参数。LightGBM 在分裂的过程中,不是逐层进行具体的划分的,它是在进行节点分裂的过程中,选择分裂增益最大的叶子节点,然后再进行分裂,而且它限制了具体的树模型的深度,这样能够避免模型的过拟合。
以上是关于树模型与集成学习的介绍,欢迎批评指正。