目录
Paper Reading 是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能有理解不到位的地方。具体的细节还需要以原文的内容为准,博客中的图表若未另外说明则均来自原文。
论文概况 | 详细 |
---|---|
标题 | 《BoostTree and BoostForest for Ensemble Learning》 |
作者 | Changming Zhao, Dongrui Wu, Jian Huang, Ye Yuan, Hai-Tao Zhang, Ruimin Peng, Zhenhua Shi |
发表期刊 | IEEE Transactions on Pattern Analysis and Machine Intelligence (TPAMI) |
发表年份 | 2023 |
期刊等级 | 中科院 SCI 期刊分区(2023年12月最新升级版)1 区,CCF-A |
论文代码 | https://github.com/zhaochangming/BoostForest |
作者单位:
- Key Laboratory of the Ministry of Education for Image Processing and Intelligent Control, School of Artificial Intelligence and Automation, Huazhong University of Science and Technology, Wuhan, Hubei 430074, China
- Shenzhen Huazhong University of Science and Technology Research Institute, Shenzhen, Guangdong 518029, China.
- Key Laboratory of the Ministry of Education for Image Processing and Intelligent Control, School of Artificial Intelligence and Automation, Huazhong University of Science and Technology, Wuhan, Hubei 430074, China
- Autonomous Intelligence Unmanned Systems Engineering Research Center of Ministry of Education of China, Beijing 100089, China
- State Key Lab of Digital Manufacturing Equipment and Technology, Wuhan, Hubei 430074, China.
- Second Ship Design and Research Institute, Wuhan, Hubei 430205, China.
研究动机
集成学习是通过训练多个基学习器,然后组合在一起生成具有更好泛化性能的强学习器的方法,目前已成功应用于多个领域。构建基学习器最流行的算法之一是决策树,两种常用的集成方法是 Bagging 和 Boosting。
有许多方法可以提高集成学习器的准确性,例如在不同的样本子集或特征子集上训练每个基学习器,如果基学习器对其参数敏感,也可以设置不同的参数来提高多样性。其中模型树方法结合了树模型和线性模型的优点,大大提高了模型的学习能力。但是一些更复杂的回归算法,如 Ridge regression(RR)、Extreme Learning Machine(ELM)、Support Vector regression(SVR) 和 Neural Network 很少在模型树中使用。一个可能的原因是它们往往需要调参,因此需要开发一种策略,使模型树与这些更复杂的回归模型更加兼容。基于模型树的集成学习需要解决三个问题:
- 如何设计一个与 Bagging 更兼容的模型树,如何结合 GBM 和 Bagging 来提高模型树的性能?
- 如何使用单一模型树结构同时处理分类和回归问题?
- 如何生成一个易于参数调优的模型树,使任何回归算法都可以作为其节点函数?
文章贡献
本文结合 Boosting 和 Bagging 的思想,提出了一种新的分类和回归算法 BoostForest。首先提出了一种新的决策树模型 BoostTree,它先在每个节点上训练一个回归模型进行回归或分类,对于给定的输入 BoostTree 将其分类到一个叶节点,然后通过将所有节点模型沿着从根到该叶节点的路径的输出相加来计算最终的预测。接着提出了一种称为随机参数池采样的参数设置策略,BoostTree 的参数从参数池中随机采样,使 BoostTree 比传统方法更容易调整其超参数。然后提出了一种新的集成学习方法 BoostForest,它使用 bootstrap 获得原始训练集的多个副本,然后在每个副本上训练一个 BoostTree。本文在 35 个分类和回归数据集上进行了实验,结果表明 BoostForest 总体上优于多种经典的集成学习方法。
预备知识
下表总结了启发 BoostForest 设计的方法,BoostForest 整合了 5 种现有的策略,并开发了两种新的经验性的策略。本文对于理论的推导较多,因此需要先学习 AdaBoost 和 GBDT 基于加法模型的理论推导才能顺畅地看懂文中的公式。以及为了更深入地理解本文的模型结构和原理,了解 LogitBoost 的原理和 Logistic model trees(LMT)模型的结构会更佳。
由于涉及的预备知识较多,因此在本博客中不进行赘述。
本文方法
BoostTree 的总体思路
本文提出的 BoostTree 的灵感来自 LMT 和 GBM,假设 BoostTree 有 M 个节点(不包括 root),其结构如下图所示。
然后 BoostTree 为第 m 个节点训练一个函数 fm(m∈[1,M]),使用公式(5)来对一个样本进行预测。也就是叶子上的最终模型由从根到该叶子的路径上的所有节点模型组成,首先识别一个输入 xn 所属的叶节点 q(xn),然后对从根到该叶节点的路径上的所有 fm 求和。
BoostTree 最小化公式(6)所示的正则化损失函数 L(F),其中第一项的函数 l 为损失函数,通过设置不同的凸可微的损失函数可以用来处理回归和分类问题。第二项为正则化项,λ 为正则化系数,它惩罚了 BoostTree 的复杂性,以减少过拟合。
一般来说,公式(6)中的目标函数不能直接优化,因此 BoostTree 同样以加法模型的方式进行最小化(6)。假设在 T-1 次迭代之后生成了一棵叶子为 T(T≥2) 的树,不包括 root 有 M=2T-2 个节点。则可以将公式(6)改写为公式(7),其中第二项为 2T-2 个节点的正则化项。
第一项为对所有的叶节点的 LeafLoss 求和,Im 是属于叶子 m 的所有训练样本的集合。LeafLoss 为对于一个叶节点而言,属于该叶节点的样本使用到达的路径构成的模型的预测损失之和。
在每次迭代中,BoostTree 使用贪心策略向损失最大的叶子添加分支,假设节点 m 是损失最大的叶节点,分割后 Im 将分成 IL(左节点)和 IR(右节点)。设 fL 和 fR 分别为使用 IL 和 IR 分别训练的左右节点的节点模型。则(7)中损失值的减小情况可用公式(10)、(11)表示,其中 Fm 是从根到节点 m 的路径上的模型集合。
根据加法模型的定义,由于先前生成的叶节点及模型已经时确定的,因此 C 表示的 Fm 对应的损失值是一个常数。L(fL) 和 L(fR) 分别是左、右子节点的损失函数,也就是在 Fm 的基础上再加上新训练的 fL/fR 后的训练损失和惩罚项。所以公式(10)、(11)表示的就是产生划分之前的叶节点的损失减去产生划分后左子树和右子树的训练损失,及左子树和右子树的惩罚项。
此时的公式(11)就可以通过最小化 L(fL) 和 L(fR) 进行优化,BoostTree 使用划分节点和训练节点模型两个步骤来优化。在划分节点阶段,BoostTree 可以受用如下表所示的四个标准来选择分割点,其中 XGB-SC 在实验中取得了最佳性能,因此将其作为 BoostTree 中的默认选项。
节点划分策略 | 说明 |
---|---|
XGBoost | 使用 XGBoost 产生划分的方式来减少损失 |
Gini | 使用基尼系数来提高每片叶子的纯度 |
MSE | 降低每个叶子的均方误差 |
C4.5 | 选择信息增益比最大的划分点 |
根据 XGBoost 中的节点分割的损失计算公式,可以计算出分裂增益如公式(12)所示。其中 gn 和 hn 分别为损失函数的一阶导数和二阶导数。与 Extra-trees 增加随机性的方法类似,BoostTree 首先为每个特征均匀地产生随机截断点,然后根据最大增益确定当前节点的最佳截断点。
在训练节点模型阶段,BoostTree 使用梯度提升将原始问题分解为多个子回归问题,并在每个节点上使用节点函数求解一个子回归问题。首先计算伪标签和样本权值生成临时训练集,然后训练一个回归或二元分类的回归模型或者多分类的 J 个回归模型。
为了便于实现,可以简单地将每个超参数的所有可能值存储在参数池中,BoostTree 从中随机选择参数的组合。可得到以 Ridge 回归为节点函数的 BoostTree 伪代码如下图所示,其中函数 FitModel 将根据不同的学习任务呈现不同的形式。
回归的 BoostTree
对于回归问题,训练损失可以使用如公式(15)所示的平方误差。
设节点 c 为节点 m 的左或右子节点,则节点 c 的损失函数可表示为公式(16)。
其中 fc(xn) 和伪标签的定义如下两个公式所示,所有样本在回归中具有相同的权重。公式中的伪标签为真实值与预测值之间的残差,Ic 为属于节点 c 的所有训练样本的集合,ac∈RD×1 为回归系数的向量,bc 为截距。
由于 MSE 对噪声和异常值敏感,为了提高 BoostTree 的鲁棒性,将在训练阶段保存每个节点伪标签的下(上)界 lb(ub),在预测阶段利用公式(17)修剪相应节点模型的输出。随着树的生长,后期迭代产生的节点的残差趋于零,因此 lb 和 ub 越来越接近。
下图展示了用于回归的 BoostTree 伪代码。
二分类的 BoostTree
在分类任务中,BoostTree 使用类似向逻辑线性模型 F 中添加新的回归模型 F 来迭代更新 F 的集合的方法,其中二分类问题使用公式(18)交叉熵作为训练损失。
假设节点 c 是节点 m 的左或右子节点,使用二阶泰勒展开来近似节点 c 的损失函数,如公式(19)所示。同理根据加法模型可知 Fm(xn) 已经确定,因此 C 为常数。其中 gn 和 hn 分别由式(13)和式(14)计算,注意 gn 和 hn 与 fc 无关,因此 fc 可以是任何回归模型。
然后可以使用 LogitBoost 的思想构造伪标签 y~n 和样本权值 wn,如公式(20)、(21)所示。
其中 p(xn) 为公式(2)中的估计概率,也就是 LogitBoost 将GBM输出转换为概率的公式。
为了提高 BoostTree 对异常值的鲁棒性,将伪标签 y~ 的值按照公式(24)进行修剪,其中 ymax∈[2,4](参考 LogitBoost),实验使用的是 ymax=4。
最后由于损失函数中的常数项对优化过程没有帮助,因此去掉公式(19)中的 C,得到简化的子节点 c 的损失函数为公式(25)。
下图展示了 BoostTree 用于二分类的伪代码。
多分类的 BoostTree
多分类问题使用公式(26)所示的多分类交叉熵作为训练损失,其中 yn 为独热编码的标签向量,y^n 为输出的预测向量。在每次迭代中,LogitBoost 通过将 J 类分类问题分解为 J 个回归问题来处理 J 类分类问题,因此 fc 成为一组线性模型 {f1c, f2c,…,fjc},其中 fjc 计算第 j 类的输出。
类似地使用二阶泰勒展开来近似节点 c 的损失函数,如公式(27)所示,同理 C 为一个如公式(28)所示的常数。其中 a 是 fjc 的系数向量,gjn 是 gn 的第 j 个元素,hjn 是 hn 的第 j 个对角线元素,gn 和 hn 分别由式(13)和式(14)计算。
然后对于第 j 类,可以根据公式(29)、(30) 计算伪标签 y~jn 和样本权值 wjn,其中 pj(xn) 为公式(4)中 j 类的估计概率。
为了防止伪标签的数值太大,此处同样使用公式(24)来修剪 y~jn。最后去掉公式(27)中的C,得到简化的节点c的损失函数为公式(33)。
下图展示了用于多分类的 BoostTree 伪代码。
Boostforest
BoostForest 将多个 BoostTree 集成到一个森林中,其模型结构如下图所示。首先使用 bootstrap 生成 K 个原始训练集的副本,然后在每个副本上训练一个 BoostTree。
对于回归问题,将所有的 K 个 BoostTrees 预测的输出取平均值作为最终输出,如公式(34)所示。
对于分类问题,将所有的 K 个 BoostTrees 的预测概率取平均值作为最终概率,如公式(35)所示。
下图展示了 Boostforest 的伪代码。
实现细节
受 XGBoost 和 lightGBM 中的行采样技巧的启发,BoostTree 使用两个技巧来提高速度:
- 如果属于分裂节点的样本数量大于批大小 BatchSize,则随机选择 BatchSize 样本来识别划分点;
- 当属于节点 m 的样本数量大于 BatchSize 时,随机选择 BatchSize 的样本来训练节点模型,并将 LeafLossm 近似为公式(36),其中 Ibatch 是 Im 的批处理索引集。
在实验中 BatchSize=1000,为了确保 BoostTree 的左节点数大于或等于 2,BoostTree 会尝试拆分根节点,直到成功拆分为止。
实验结果
数据集和实验设置
实验使用了 37 个数据集进行了,数据集的信息如下表所示,这些数据集涵盖了广泛的特征维度(4 ~ 1024)和样本大小(103 ~ 11000000)。对于每个数据集,通过独热编码将分类特征转换为数字特征,除非另有说明,每个特征的分布被缩放为标准正态分布,回归数据集中的标签都被归一化。
实验使用的 11 个 baseline,分别是:RandomForest、Extra-Trees、XGBoost、LightGBM、GBDT-PL、MultiBoosting、DeepBoosting、FilterBoost、BaggedTAO-l、LMT、M5P。这些对比算法的实验设置见本文的附录,此处不再赘述,BoostTree 如无特殊说明则使用默认参数。
除了 MNIST 和 HIGGS 数据集,所有算法在每个数据集上重复 10 次,对于每个实验将数据按照 3:1:1 随机分为训练集、验证集和测试集。对于 MNIST 和 HIGGS 数据集则是将数据按照 4:1 随机分为训练集和验证集,并使用原始测试数据进行测试。使用验证集来为模型选择最佳参数,然后将训练集和验证集结合起来用最佳参数训练模型,对于 RandomForest 和 Extra-Trees 使用 out-of-bag 误差来选择参数。
分别使用 accuracy 和 RMSE 作为分类和回归的评价指标,同时还计算了每个算法在每个数据集上的平均排名和训练时间(包括调参),使用秒作为时间单位,使用字节作为模型大小的单位。为了验证 BoostForest 是否显著优于基线(a=0.05),对实验结果进行了假设检验。
BoostForest 对比实验
首先比较了 BoostForest 与 8 个 baseline 的泛化性能从下表可以看出,BoostForest 在 17 个数据集上的泛化性能最好,在回归中平均时间最快,在分类中平均时间第二快,在分类和回归中平均性能、标准差和排名都最好。
下表显示在 11 个二分类数据集中,BoostForest 在 9 个数据集上的泛化性能最佳,平均性能、标准差和排名最佳,平均时间第二快。
平均而言,BoostForest 达到了最好的 accuracy 或 RMSE,而且 BoostForest 在所有数据集上使用默认参数设置。每个 BoostTree 都使用不同的训练集进行训练,因此 BoostForest 可以很容易地并行化以进一步加快速度。BoostForest 的一个限制是它的平均模型规模是最大的,所以它可能不容易部署到低存储设备上,缩小其模型尺寸是未来的研究方向之一。
基学习器数量的泛化性
BoostForest 需要指定其中的 BoostTrees 的数量,该实验在每个数据集上将基学习器的数量从 3 个增加到 250 个,并通过将用于对比的 4 个 baseline 进行调参。下图显示了 5 种算法在 4 个分类数据集上的 accuracy(完整的实验结果在附录),随着基础学习器数量的增加,各种集成学习方法的性能会迅速收敛。BoostForest 在 15 个数据集中的 11 个数据集上实现了最高的分类精度,在 MV1、BD 和 PID 数据集上实现了第二高的分类精度。
下图显示了 5 种算法在 4 个回归数据集上的平均 RMSE(完整的实验结果在附录),随着基础学习器数量的增加,通常所有算法的性能都会迅速收敛,BoostForest 在 15 个数据集中的 7 个上实现了最小的 RMSE。可见 BoostForest 具有非常好的泛化性能,并且通常比 4 个基线 baseline 收敛得更快。
基学习器复杂度的泛化性
基学习器模型的复杂度由每棵树的最大叶子数 MaxNumLeaf 控制,分类时从 2 个逐渐增加到32个,回归时从 2 个逐渐增加到 256 个。实验将基学习器的数量固定为 250,同样将用于对比的 4 个 baseline 进行调参。下图显示了 5 种算法在 4 个分类数据集上的 accuracy(完整的实验结果在附录),BoostForest 在 15 个数据集中的 12 个上实现了最高的 accuracy。
下图显示了 5 种算法在 4 个回归数据集上的平均 RMSE(完整的实验结果在附录),在大多数数据集上,所有算法的性能都随着每棵树的最大叶子数的增加而增加,BoostForest 在 15 个数据集中的 7 个上实现了最小的 RMSE。
这些结果表明,BoostForest 可以很好地泛化基学习器模型的复杂度。
大型数据集实验
下表比较了 BoostForest 与四种集成方法在 3 个分类数据集和 2 个回归数据集上的性能,BoostForest 仍然表现出优秀的性能。在分类数据集上的平均 accuracy 最高,平均时间第 2 短;在回归数据集上的平均 RMSE 最低,平均时间第 3 短。
考虑到 BoostForest 的平均模型尺寸最大,基学习器比基线更复杂,实验还将 BoostForest 与 BaginglightGBM 和 BaggedTAO 进行了比较。下表为 BoostForest 和 Bagging-LightGBM 的对比实验结果,BoostForest 在 15 个数据集上的表现明显优于 Bagging-LightGBM。结果表明当其平均模型尺寸小于 Bagging-LightGBM 时,BoostForest 仍然可以取得很好的性能。
下表为 BoostForest 和 BaggedTAO 的对比实验结果,BoostForest 在 4 个数据集上的表现明显优于 BaggedTAO。因为 TAO 可以使用稀疏性惩罚来删除不必要的参数,因此 BaggedTao 的平均模型大小较小,这个想法也可以用来减少 BoostForest 的模型尺寸。
替换基学习器
该实验研究了 BoostForest 用于组合多个 BoostTree 的策略(通过 bootstrapping 复制数据,并从参数池中随机选择参数)是否也可以扩展到其他树模型,将 Extra-tree、LMT 和 M5P 作为树模型,得到的森林分别称为 ETForest、LMForest 和 ModelForest。
实验结果如下表所示,其中 ETForest 在 32 个数据集中的 30 个优于 Extra-tree,ModelForest 在所有 16 个回归数据集上的表现都优于 M5P,BoostForest 在所有 32 个数据集上都优于BoostTree。结果表明本文提出的将 BoostTrees 集成到 BoostForest 的策略也可以用于将 Extra-tree 和 M5P 集成到复合学习器中,从而提高性能。然而 LMForest 仅在 16 个分类数据集中的 6 个上优于 LMT,可见该策略在组合多个 LMT 以进一步提高其性能方面不是很有效。
同时 BoostTree 的平均分类性能优于 LMForest 和 ETForest,平均回归性能优于 ModelForest 和 ETForest,表明对于本文的集成策略使用 BoostTree 作为基学习器更加有效。
替换节点的回归器
此处研究了是否可以使用其他更复杂的非线性回归算法,如 ELM 和 SVR 来代替 RR 作为 BoostTree 中的节点函数,其中 ELM 是一种单隐层神经网络。得到的树分别称为 BoostTree-ELM 和 BoostTree-SVR,对应的森林记为 BoostForestELM 和 BoostForest-SVR。
下表为这些模型在 15 个回归数据集上的性能,在 13(15) 个数据集上 BoostForest-ELM 在统计上显著优于 ELM(BoostTree-ELM),BoostForest-SVR 在 14(15) 个数据集上显著优于 SVR(BoostTree-SVR)。ELM 和 SVC 的模型复杂度更高,BoostTree-ELM 和 BoostTree-SVR 更容易过拟合,因此有必要将多个 BoostTrees 合并到 BoostForest 中以减少过拟合。结果表明当使用更复杂的非线性回归算法代替 RR 作为中的节点函数时,可能会由于过拟合而导致性能下降,但将相应的 BoostTrees 集成到 BoostForest 中总是可以提高性能。
接着还探讨了 CNN 和 DNN 是否可以作为 BoostForest 中的节点函数,得到的森林分别记为 BoostForest-CNN 和 BoostForest-DNN。下表分别比较了 BoostForest-CNN 和 BoostForest-DNN 与六种方法在 MNIST 和 HIGGS 上的性能。在训练时间更短的情况下,BoostForest-CNN 和 BoostForest-DNN 分别比 Baging-CNN150 和 Bagging-DNN150 获得了更高的准确率。在较小的模型尺寸下,BoostForest-CNN(BoostForest-DNN)比 RandomForest、Extra-Trees、BagingXGBoost、Bagging-lightGBM 和 Bagging-CNN3(Baging-DNN3)获得了更高的精度。结果表明,CNN 和 DNN 也可以作为 BoostForest 中的节点函数。
BoostForest 的鲁棒性
此处通过实验研究 BoostForest 的性能在不同超参数下的变化,以及修剪操作和划分准则的影响。对于参数 min_samples_leaf 和 λ,min_samples_leaf 从 5 增加到 15,λ 从 0.0001 增加到 1。从参数池中随机选取每个 BoostTree 的参数组成一个 BoostForest,实验结果如下表所示。在回归和分类中均获得了与使用最佳参数相当的平均性能,这表明可以使用随机参数池采样来简化 BoostForest 的参数选择过程。
修剪操作使 BoostForest 对回归中的噪声和异常值更健壮,实验结果如下表所示。当数据噪声较小时 BoostForest 可以获得较小的 RMSE,修剪操作使 BoostForest 过于保守而无法获得更好的性能。
对于划分标准还比较了 Gini-SC、C4.5-SC、MSE-SC,使用不同分割标准的 BoostForest 的性能如下表所示。可见使用 Gini-SC、C4.5-SC 和 XGB-SC 在分类上取得了相当的平均 accuracy,在回归中使用 XGB-SC 比使用 MSE-SC 获得更好的平均 RMSE。
优点和创新点
个人认为,本文有如下一些优点和创新点可供参考学习:
- 本文的算法基于树结构中节点的层次关系,基于回归器以 Boosting 的方法构建了整棵树,且支持回归和多分类问题,是一种有效的提升树实现方案;
- 可以通过 Bagging 方法将多棵树集成为森林进一步提高算法性能,且通过参数池的应用不仅可以提高多样性,还能避免繁琐的调参过程;
- 文中通过共 36 个公式对算法的原理和步骤进行了推导,理论说明很详细;
- 实验数据丰富有力,在多个数据集上进行了实验,并通过实验讨论了算法在不同设置和不同场景下的性能,论证具体且说服力强。