集成学习

集成学习通过建立几个模型来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成组合预测,因此优于任何一个单分类的做出预测。

集成学习中boosting和Bagging

面对一个机器学习问题, 通常有两种策略。

  • 一种是研发人员尝试各种模型, 选择其中表现最好的模型做重点调参优化。 这种策略类似于奥运会比赛, 通过强强竞争来选拔最优的运动员, 并逐步提高成绩。
  • 另一种重要的策略是集各家之长, 如同贤明的君主广泛地听取众多谋臣的建议, 然后综合考虑, 得到最终决策。

后一种策略的核心, 是将多个分类器的结果统一成一个最终的决策。 使用这类策略的机器学习方法统称为集成学习。 其中的每个单独的分类器称为基分类器

  • Boosting 方法是通过逐步聚焦于基分类器分错的样本, 减小集成分类器的偏差

  • Bagging 方法则是采取分而治之的策略, 通过对训练样本多次采样, 并分别训练出多个不同模型, 然后做综合, 来减小集成分类器的方差

Boosting(串行)

Boosting 方法训练基分类器时采用串行的方式, 各个基分类器之间有依赖。
它的基本思路是将基分类器层层叠加, 每一层在训练的时候, 对前一层基分类器分错的样本, 给予更高的权重。 测试时, 根据各层分类器的结果的加权得到最终结果。

代表算法:Adaboost,GBDT,XGBoost

Adaboost

实现过程:

1.训练第一个学习器
2.调整数据分布
3.训练第二个学习器
4.再次调整数据分布
5.依次训练学习器,调整数据分布
6.整体过程实现

关键点:

如何确认投票权重?

如何调整数据分布?

ababoost 的α是否可以为负值?

在 AdaBoost 算法中, 每个弱分类器的系数α需要满足一定条件才能保证模型的正确性。 具体而言, α应该是大于等于 0 且小于等于正无穷大的实数。

因为在 AdaBoost 算法中, 每个弱分类器的权重是根据上一轮分类器的错误率计算得到的。如果某个弱分类器的错误率大于 1/2, 则其权重会是负数, 但是这并不意味着α可以为负值,因为这违反了α的定义。

在实际应用中, 如果出现了α为负值的情况, 通常表示算法存在问题, 例如数据集过小或者弱分类器的表现太差等。 此时可以尝试增加数据量、 改变弱分类器的参数或者换用其他算法来解决问题。

AdaBoost的构造过程小结

GBDT

梯度提升决策树(GBDT Gradient Boosting Decision Tree) 是一种迭代的决策树算法该算法由多棵决策树组成,所有树的结论累加起来做最终答案。它在被提出之初就被认为是泛化能力(generalization)较强的算法。近些年更因为被用于搜索排序的机器学习模型而引起大家关注。

GBDT = 梯度下降 + Boosting + 决策树

其核心思想是, 每一棵树学的是之前所有树结论和的残差, 这个残差就是一个加预测值后能得真实值的累加量。

例如:用户 A 的真实年龄是 25 岁, 但第一棵决策树的预测年龄是 22 岁, 差了 3岁, 即残差为 3。 那么在第二棵树里我们把 A 的年龄设为 3 岁去学习, 如果第二棵树能把 A 分到 3 岁的叶子节点, 那两棵树的结果相加就可以得到 A 的真实年龄; 如果第二棵树的结论是 5 岁, 则 A 仍然存在−2 岁的残差, 第三棵树里 A 的年龄就变成−2 岁,继续学。 这里使用残差继续学习, 就是 GBDT 中 Gradient Boosted 所表达的意思。

训练一个模型 m1, 产生错误 e1
针对 e1 训练第二个模型 m2, 产生错误 e2
针对 e2 训练第三个模型 m3, 产生错误 e3…
最终预测结果是:m1 + m2 + m3 + …

GBDT 的优点和局限性有哪些?

■ 优点
(1) 预测阶段的计算速度快, 树与树之间可并行化计算。 (是前一个有结果可以给下一个)
(2) 在分布稠密的数据集上, 泛化能力和表达能力都很好, 这使得 GBDT 在Kaggle 的众多竞赛中, 经常名列榜首。
(3) 采用决策树作为弱分类器使得 GBDT 模型具有较好的解释性和鲁棒性,能够自动发现特征间的高阶关系, 并且也不需要对数据进行特殊的预处理如归一化等。
■ 局限性
(1) GBDT 在高维稀疏的数据集上, 表现不如支持向量机(https://www.bilibili.com/video/BV1Hs411w7ci 向量机可以看这个B站博主的分享)或者神经网络。
(2) GBDT 在处理文本分类特征问题上, 相对其他模型的优势不如它在处理数值特征时明显。
(3) 训练过程需要串行训练, 只能在决策树内部采用一些局部并行的手段提高训练速度。

Bagging(并行)

Bagging 与 Boosting 的串行训练方式不同, Bagging 方法在训练过程中, 各基分类器之间无强依赖, 可以进行并行训练。 其中很著名的算法之一是基于决策树基分类器的随机森林(Random Forest)

为了让基分类器之间互相独立, 将训练集分为若干子集( 当训练样本数量较少时, 子集之间可能有交叠) 。

Bagging 方法更像是一个集体决策的过程, 每个个体都进行单独学习, 学习的内容可以相同, 也可以不同, 也可以部分重叠。 但由于个体之间存在差异性, 最终做出的判断不会完全一致。 在最终做决策时, 每个个体单独作出判断, 再通过投票的方式做出最后的集体决策

Model 1、 Model 2、 Model 3 都是用训练集的一个子集训练出来的, 单独来看, 它们的决策边界都很曲折, 有过拟合的倾向。 集成之后的模型(红线所示) 的决策边界就比各个独立的模型平滑了, 这是由于集成的加权投票方法, 减小了方差。

如何选择基分类器

最常用的基分类器是决策树, 主要有以下 3 个方面的原因。
(1) 决策树可以较为方便地将样本的权重整合到训练过程中, 而不需要使用过采样的方法来调整样本权重。
(2) 决策树的表达能力和泛化能力, 可以通过调节树的层数来做折中。
(3) 数据样本的扰动对于决策树的影响较大, 因此不同子样本集合生成的决策树基分类器随机性较大(弱分类器)**, 这样的“不稳定学习器”更适合作为基分类器。 此外,在决策树节点分裂的时候, 随机地选择一个特征子集, 从中找出最优分裂属性,很好地引入了随机性。

除了决策树外, 神经网络模型也适合作为基分类器, 主要由于神经网络模型也比较“不稳定”, 而且还可以通过调整神经元数量、 连接方式、 网络层数、 初始权值等方式引入随机性。

可否将随机森林中的基分类器, 由决策树替换为线性分类器或 K-近邻? 请解释为什么?

随机森林属于 Bagging 类的集成学习。 Bagging 的主要好处是集成后的分类器的方差, 比基分类器的方差小。 Bagging 所采用的基分类器, 最好是本身对样本分布较为敏感的(即所谓不稳定的分类器) , 这样 Bagging 才能有用武之地。 线性分类器或者 K-近邻都是较为稳定的分类器, 本身方差就不大, 所以以它们为基分类器使用 Bagging 并不能在原有基分类器的基础上获得更好的表现, 甚至可能因为Bagging 的采样, 而导致他们在训练中更难收敛, 从而增大了集成分类器的偏差。

偏差与方差

在有监督学习中, 模型的泛化误差来源于两个方面——偏差和方差, 具体来讲偏差和方差的定义如下:

偏差:指的是由所有采样得到的大小为 m 的训练数据集训练出的所有模型的输出的平均值和真实模型输出之间的偏差。 偏差通常是由于我们对学习算法做了错误的假设所导致的, 比如真实模型是某个二次函数, 但我们假设模型是一次函数。由偏差带来的误差通常在训练误差上就能体现出来。

方差:指的是由所有采样得到的大小为 m 的训练数据集训练出的所有模型的输出的方差。 方差通常是由于模型的复杂度相对于训练样本数 m 过高导致的, 比如一共有 100 个训练样本, 而我们假设模型是阶数不大于 200 的多项式函数。 由方差带来的误差通常体现在测试误差相对于训练误差的增量上。

Bagging(并行)能够提高弱分类器性能的原因是降低了方差, Boosting(串行)能够提升弱分类器性能的原因是降低了偏差。