集成学习

引言

集成学习是一种机器学习方法,其核心思想是通过构建多个学习器来完成学习任务,来提高整体模型的性能。多个模型的综合表现往往优于单个模型的表现,所以集成学习通常能够提供更高的准确性、更强的鲁棒性和更好的泛化能力,尤其是在处理复杂数据和高维特征时。

这里集成一般分为两种,同质和异质。同质是指个体学习器全是同一类型,这种同质集成中的个体学习器又称“基学习器”。异质是指个体学习器包含不同类型得学习算法,比如同时包含决策树和神经网络。一般我们常用的都是同质的,即个体学习器都是同一类型的。要想获得较好的集成性能,基分类器也需要满足基本条件:

  1. 要具有一定的性能,至少不差与随机猜测的性能
  2. 要具有多样性,即基学习器要具有差异性

简单来说,就是这个学习器要能对最终的模型产生正面影响,如果不满足第一个条件,可能会导致负面影响;如果不满足第二个条件,带来的效果并不显著。

主要方法

根据样本选择、训练方式和目标,集成学习可以分为以下两种方法。

Boosting:这一类个体之间学习器之间存在强依赖关系,使用串行的方法去学习。利用模型相关性

Bagging:这一类方法个体学习器之间不存在强依赖关系,因此可用并行的方式去学习。利用模型独立性

接下来,对这两种方法进行展开讲解

Boosting

基本概念

Boosting由于各基学习器之间存在强依赖关系,因此只能串行处理,也就是Boosting实际上是个迭代学习的过程。

Boosting的工作机制为:先从初始训练集中训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整(比如增大被误分样本的权重,减小被正确分类样本的权重),使得先前基学习器做错的样本在后续的训练过程中受到更多关注,然后基于调整后的样本分布来训练下一个基学习器,如此重复,直到基学习器数目达到事先自定的值T,然后将这T个基学习器进行加权结合。Boosting算法的典型代表有AdaBoost和XGBoost。

AdaBoost

A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting 该论文提出了AdaBoost算法,首次系统化地展示了通过迭代加权训练弱分类器来构建强分类器的思想,奠定了Boosting方法的基础。

算法思想
  • 初始化训练样本的权值分布,每个样本具有相同的权重;

  • 训练弱分类器,如果样本分类正确,则在构造下一个训练集中,它的权值就会被降低;反之提高。用更新过的样本集去训练下一个分类器;

  • 将所有弱分类组合成强分类器,各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,降低分类误差率大的弱分类器的权重。

算法流程

使用数学语言描述整个算法流程。为了简单起见,以二分类为例,那么训练集为: 设共训练个弱分类器。

  1. 初始化:每个样本分配相等的权重

  2. 在一共轮的训练中,第轮训练的弱分类器为。首先计算分类误差率,其次计算根据误差率计算分类器的权重,最后更新样本的权重并进行归一化。观察公式也可以发现,更新样本权重时使用预测值和真实值的乘积。也就是说,正确分类的样本权重减小,而错误分类的样本权重增加。样本的权重又会影响到分类误差率的计算,对权值高的样本预测错误的代价更大。

  3. 最终模型: sign就是一个符号函数,如果加权和为正,说明整体偏向正类;反之则偏向负类。

训练过程

Adaboost实际上是最小化整体的加权损失函数:

评价

依靠对不被正确分类样本的重点关注,即使是如决策树一样的弱分类器也可得到很强的性能。但是缺点也很明显,不断被强调的难以区分的样本可能是噪声,所以对噪声和离群点异常敏感;在轮数太多时还会带来过拟合风险。

Gradient Boosting

Greedy function approximation: A gradient boosting machine 该论文系统阐述了梯度提升的理论框架,提出通过梯度下降优化损失函数来构建集成模型,为后来的XGBoost和LightGBM等算法奠定了基础。

具体地,Gradient Boosting是一种通用的Boosting框架,它将Boosting看作是在函数空间中做梯度下降,从而逐步优化一个可微的损失函数。

这里的梯度下降和神经网络中的梯度下降一样吗?

虽然都是利用梯度进行更新,但是二者更新的对象不同,也就是进行梯度下降的空间不同。

神经网络中的梯度下降是最为常见的优化方法,为了找出模型的最优参数,在参数空间中做优化。我们通常计算损失函数关于参数的梯度,并根据学习率和梯度对参数进行更新,可以表示为: 在参数空间中移动——优化目标是找出一组最优参数

而在该算法中,是对函数空间进行优化。我们并不关心模型是什么参数,只是为了学习到一个最好的预测函数。在迭代过程中,每次加上一个函数来逐步逼近最优函数,下面的就是一个方向函数: 在函数空间中优化的目标寻找一个新的函数加入组合,使得整体预测更好。

算法流程

我们要学习一个预测函数,它是多个弱模型的加权和: 和上面的公式一样,是第轮学习到的基模型,是学习率。按照以下的步骤进行:

  1. 初始化模型,选择一个在所有训练样本上总损失最小的参数模型,也就是说: 即为损失函数,在回归任务的中通常是平方损失,在分类任务中为对数损失。这是模型的起点,决定从哪里开始做梯度下降。

  2. 迭代训练过程,计算损失函数关于当前模型预测值的负梯度,即伪残差即为函数空间中进行梯度下降的方向,说明当前的模型还不够好,希望加一个修正项来拟合这个残差,从在这一轮最大的程度的降低损失。

与AdaBoost的区别

在AdaBoost中,并没有直接使用损失函数的梯度。而是通过不断调整样本权重的方式改变下一轮训练的关注点。实质上是在优化一个指数损失,并通过重新加权的启发式方法来实现最小化。

在Gradient Boosting与传统Boosting方法最大的区别就是——直接沿着最陡下降方向优化损失函数。

GBDT

前面提到,Gradient Boosting是一种通用的Boosting框架。GBDT实际上就是,使用CART回归树作为基学习器的Gradient Boosting算法。核心在于累加所有树的结果作为最终结果,所以GBDT中的树都是回归树,不是分类树。

在本章节重点介绍梯度下降思想,不对GBDT展开过多讲解。在下面的章节中直接介绍两种改进算法。

XGBoost

XGBoost: A scalable tree boosting system 该论文提出了XGBoost算法,是对 GBDT 的高效实现和系统级优化。包括正则化、二阶导、稀疏优化、剪枝和缓存加速等。

算法流程
  1. 假设需要最小化以下目标函数,其中​为复杂度正则,为树的叶子,为第个叶子的输出值

  2. 对损失函数做二阶泰勒展开,分别是梯度和二阶导

  3. 构造CART树,设叶子节点的样本集合为,对应的叶子权重为,则对第棵树的最优目标函数变为: 用这个公式可以计算出每次分裂的gain(信息增益),可以用来判断要不要继续分裂

    每个节点的叶子输出值为:

评价

与GBDT相比,最大的优势在于添加了正则化项来防止过拟合。观察的公式,前半部分为叶子数量的惩罚,避免树太复杂;后半部分为叶子输出惩罚,控制每个叶子的影响。

Bagging

概述

Bagging predictors 首次提出了Bagging方法,通过Bootstrap采样生成多个训练子集,训练多个弱学习器并聚合结果。对分类任务,用多数投票来决定最终结果;对回归任务,用平均值作为最终预测。从而显著提高模型稳定性和泛化能力。

实际上,Bagging方法相较于Boosting方法更简单,基于从总体中采样的不同数据集训练出多个基分类器再进行组合预测即可。正是这种简单的特性,使得其非常适合并行处理,特别适合数据规模较大的情况。此外,通过平均多个模型的预测结果,可以天然地平滑掉单个模型的极端预测,降低整体方差,减少过拟合的风险;在一定程度上抵消噪声数据对单个模型的影响。

随机森林

算法思想

随机森林是在Bagging基础进行改进,引入更多的随机性,进一步提高了模型性能和鲁棒性。

  1. 数据随机性:对训练样本进行有放回采样(Bootstrap),获得多个不同的数据子集。
  2. 特征随机性:在节点划分时,随机选择部分特征进行最佳分裂决策。

为什么要

算法流程

先给定原始数据集为

Bootstrap采样

从原始训练集中有放回地采样,得到个训练子集。每个子集的大小等于原始训练集的大小,可能包含重复样本。

从大小为的训练集抽取个样本,每次抽取后样本放回以便下次可能再次抽取到。生成的新数据集很大概率包含重复样本,那么也会有相当一部分原始样本根本没有被抽取到。每个样本被选中的概率为,那么某个样本未被选中的概率为: 所以,整体来说,越有36.8%的样本未被选中,这些样本称为袋外数据(OOB),可用于估计模型的泛化误差。

构建决策树

对每个构建一个决策树。在每个分裂节点,不使用所有特征,而是从个特征中随机选择个特征,再从中选择最优划分特征。 通常也不会进行剪枝,允许生成完全生长的树,进一步增加多样性。

为什么要随机选择特征?

如果所有树都在所有特征上做选择,那么模型之间就会非常相似,这样集成之后带来更多效果的提升。

使用随机的子特征集进行采集后,每颗树的每个节点使用的特征都不一样,增加了结构的多样性,

集成预测

对于分类问题,采用多数投票策略;对于回归问题,采用平均策略。

特征重要性的计算

随机森林还有一大特点是可评估特征重要性,输出每个特征对模型预测的贡献程度。基尼重要性是一种常见的方法。 是节点中第类样本占比,是左右节点样本数,颗树使用特征进行划分的节点集合。