目录
一、概述
1.1 分类器
二、集成方法
2.1 自助聚合法 / 自举汇聚法 (Bagging)
2.1.1 自助采样法 (Bootstrap Sampling / Bootstrapping)
2.1.2 随机森林 (Random Forest)
2.2 提升法 (Boosting)
2.2.1 自适应提升 (Adaboost)
2.2.2 梯度提升 (Gradient Boosting)
2.3 堆叠法 (Stacking) 与 融合法 (Blending)
2.3.1 Stacking
2.3.2 Stacking 与 神经网络 NN
2.2.3 Blending
三、深度学习中的集成学习
3.1 丢弃法 / 随机失活 Dropout
3.2 测试集数据扩增 TTA
3.3 Snapshot
集成学习 (ensemble learning),即分类器集成,构建多个学习器并通过某种集成方法组合它们来完成最终的学习任务,有时也被称为多分类器系统 (multi-classifier system)、基于委员会的学习 (committee-based learning) 等。一般结构是:先产生一组 “个体学习器”,再用某种策略将它们组合起来。组合策略主要有平均法、投票法和学习法等。集成学习主要用来提高模型(分类,预测,函数估计等)的性能,或用来降低模型选择不当的可能性。集成算法本身是一种监督学习算法,因为它可以被训练然后进行预测,组合的多个模型作为整体代表一个假设 (hypothesis)。
在 sklearn 官方文档 中,可以很容易找到各类集成算法 API 及其实现。
集成方法 本身并不是某种具体的方法或者是算法,只是一种训练机器学习模型的思路。它的含义只有一点,就是训练多个模型,然后将它们的结果汇聚在一起。集成方法将几种机器学习技术组合成一个预测模型的元算法,以达到减小方差 (bagging)、偏差 (boosting) 或改进预测 (stacking) 的效果。当然,也有说法 将多个分类器组合的方法 称为 集成方法 或 元算法。
理论上,学习器的集成会从三个方面带来好处:
- 首先,从 统计 的方面看,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到相同的性能,此时若使用单学习器,可能因误选而导致 泛化性能不佳,结合多个学习器则会减少这一风险;
- 其次,从 计算 的方面看,学习算法往往会陷入 局部极小,有的局部极小点所对应的泛化性能可能很糟糕,而通过多次运行之后进行结合,可降低陷入糟糕局部极小点的风险;
- 最后,从 表示 的方面看,某些学习任务的 真实假设可能不在当前学习算法所考虑的假设空间中,此时若使用单学习器则肯定无效,而通过结合多个学习器,由于相应的假设空间有所扩大,有可能学得更好的近似。
分类器 (Classifier) 是数据挖掘中对样本进行分类的方法的统称,包括:决策树、逻辑回归、朴素贝叶斯、神经网络 等算法。分类指在已有数据的基础上学会一个分类函数或构造出一个分类模型(即分类器,以便于将数据映射到给定类别,从而用于预测。
常见的分类器:
- 决策树分类器 的构造无需任何领域的知识和任何参数设置,因此特别适合于探测式的知识发现。此外,决策树分类器 不仅可采用类似树的形式处理高维数据,还特别直观和便于理解。因此,决策树是许多商业规则归纳系统的基础。
- 素贝叶斯分类器 是一类假设数据样本特征完全独立、以贝叶斯定理为基础的简单概率分类器。
- AdaBoost 算法 的自适应在于前一个分类器产生的错误分类样本会被用来训练下一个分类器,从而提升分类准确率,但对于噪声样本和异常样本较敏感。
- 支持向量机 (SVM) 分类器 构建一个或多个高维的超平面 (样本间的分类边界) 将划分样本数据。
- K 近邻 (KNN) 分类器 是基于距离计算的分类器,其选择 K 个距离度量上最佳的样本进行分析,从而简化计算提升效率
分类器构造和实施的基本过程:
- 选定样本(包含正、负样本)并分成训练样本和测试样本两部分;
- 在训练样本上训练/拟合分类器算法,生成分类模型;
- 在测试样本上对分类模型进行测试/预测/推理,生成预测结果;
- 根据预测结果,计算必要的评估指标,评估分类模型的性能。
更具体地,Bagging 通过 自助采样法 —— 有放回随机采样 的方式创建 K 个新数据集,因此每个新数据集都可能存在重复样本,也可能总有些样本不出现。但整体而言,各样本出现概率相同。之后,K 个新数据集分别同时并行训练 K 个任意可用模型。K 个模型得到的 K 个结果可采用 公平投票 (voting) 等方式聚合。例如,典型的 随机森林 (Random Forest, RF) 就采用了 少数服从多数的 投票原则。
更具体地,Boosting 与 Bagging 的样本采样逻辑一致,但其 K 个模型是串行而非并行训练的。每个模型在训练时都会基于先前模型的结果,并更加关注/重视被先前模型误判的样本。即各样本具有权值,错误判断率越高的样本拥有越大的权值。同时,每个模型依其分类能力的强弱会被赋予不同的权重,最后,对所有模型的结果进行 加权求和而非公平投票。该方法的机制使得模型存在训练效率的差异。一方面,Bagging 的各模型间完全独立,可采用分布式训练;另一方面,Boosting 中每个模型则依赖或受先前模型结果的影响,故通常采用串行训练。
更具体地,Stacking 作为在 Kaggle 中常用的方法,其选择 K 种不同的分类器,通过 交叉验证 在训练集上训练和预测。保证各分类器模型都对所有训练样本预测出一个结果。那么,对于每一个训练样本,都能得到来自 K 种分类器模型的 K 个结果。之后,再创建第二层次的模型,其训练特征就是这 K 个结果。也就是说 Stacking 方法当中会用到 多层模型的结构,最后一层模型的训练特征是上层模型预测的结果。由模型自己去训练究竟哪一个模型的结果更值得采纳,以及如何组合模型之间的特长。
简言之,Bagging 旨在 获得一个方差比其组成部分更小的集成模型,而 Boosting 和 Stacking 则致力于 生成偏差比其组成部分更低的强模型(即使方差也可以被减小)。
事实上,它们常与决策树搭配,得到了经典的集成学习算法:
- Bagging + 决策树 = 随机森林 (RF)
- AdaBoost + 决策树 = 自适应提升决策树 (ABDT)
- Gradient Boosting + 决策树 = 梯度提升决策树 (GBDT)
传送门:【机器学习】集成学习 (Ensemble Learning) (二) —— Bagging 与 Random Forest
传送门:【机器学习】集成学习 (Ensemble Learning) (三) —— Boosting 与 Adaboost + GBDT
传送门:【机器学习】集成学习 (Ensemble Learning) (四) —— Stacking 与 Blending
在深度学习中,也有一些集成学习思路的方法,值得借鉴学习:
- 丢弃法 Dropout
- 测试集数据扩增 TTA
- Snapshot
Dropout 是训练深度神经网络的一种技巧。在每个训练批次中,通过随机让一部分的节点停止工作(神经元随机失活),而在预测的过程中让所有的节点发挥作用。
Dropout 经常出现在在早期 CNN 网络中,可有效的缓解模型过拟合的情况,也可在预测时增加模型的精度。
测试集数据扩增(Test Time Augmentation,TTA)也是常用的集成学习技巧。数据扩增不但可以在训练时发挥作用,而且同样可以在预测时进行。例如,对同一个样本预测三次,然后对三次结果进行平均。
def predict(test_loader, model, tta=10):
model.eval()
test_pred_tta = None
# TTA 次数
for _ in range(tta):
test_pred = []
with torch.no_grad():
for i, (input, target) in enumerate(test_loader):
c0, c1, c2, c3, c4, c5 = model(data[0])
output = np.concatenate([c0.data.numpy(), c1.data.numpy(),
c2.data.numpy(), c3.data.numpy(),
c4.data.numpy(), c5.data.numpy()], axis=1)
test_pred.append(output)
test_pred = np.vstack(test_pred)
if test_pred_tta is None:
test_pred_tta = test_pred
else:
test_pred_tta += test_pred
return test_pred_tta
假设训练了 10 个 CNN,则可将多个模型的预测结果进行平均。但假如只训练了一个 CNN 模型,如何进行模型集成呢?
在论文 Snapshot Ensembles 中,作者提出使用 Cyclical Learning Rate (PyTorch 接口 torch.optim.lr_scheduler.CyclicLR) 训练模型,并保存精度比较好的一些 checkopint,最后将多个 checkpoint 进行模型集成。
由于在 Cyclical Learning Rate 中,学习率的变化有周期性变大和减少的行为,因此 CNN 模型很有可能在跳出局部最优进入另一个局部最优。在 Snapshot 论文表明,此种方法可以在一定程度上提高模型精度,但需要更长的训练时间。
参考文献
通俗讲解集成学习算法!
三种集成学习算法原理及核心公式推导
自助(抽样)法
自助采样包含训练集里63.2%的样本?
集成学习(一)模型融合与 Bagging
随机森林算法及其实现(Random Forest)
随机森林原理介绍与适用情况(综述篇)
Adaboost算法及其代码实现
机器学习——打开集成方法的大门,手把手带你实现AdaBoost模型
GBDT 的原理、公式推导、Python实现、可视化和应用
并肩 XGBoost、LightGBM,一文理解CatBoost!
Stacking 方法详解
「Stacking」与「神经网络」
为什么做stacking之后,准确率反而降低了?