前言

在机器学习中,训练一个表现很好的模型是很困难的,尤其是随着问题规模的增大。而就像CPU的多核心一样,科学家们想到了通过结合多个模型来提升模型的表现,这就是集成学习。需要注意的是,集成学习并不是一种算法,而是一种结合模型的策略,本文将简单介绍三种集成学习的方法。

接下来,让我们通过一个简单的例子来感受一下集成学习的效果。假设有一个分类问题,现在分别使用三个学习器对其进行分类,分类结果如下

待分类样本 学习器1 学习器2 学习器3
样本1 正确 错误 正确
样本2 正确 正确 错误
样本3 错误 正确 正确

可以看到,三个学习器的正确率均为66%,这并不是一个很好的表现,但是如果同时看三个学习器的结果,采用投票法结合三个学习器的结果,也就是少数服从多数,可以看到三个样本均有两个学习器判断正确,则这三个学习器组成的强学习器在这三个样本上的正确率为100%。这就是集成学习的效果,通过结合多个弱学习器,达到强学习器的效果。

这也就引出了集成学习需要解决的两个问题,第一,如何产生多个弱学习器,第二,如何结合这些弱学习器。

Bagging

首先,我们来介绍Bagging。Bagging集成的模型只采用一种弱学习器,就比如所有的弱学习器均为决策树。接着我们来看如何生成弱学习器,从前言的例子我们可以看出,各弱学习器之间是需要存在一定的差异的,这样对结合出的最终学习器才会有比较好的表现(可以考虑极端情况,所有弱学习器均相同,则模型的表现不会有任何增加),所以,我们需要一些策略,可以使得各弱学习器具有一定的差异性。在Bagging中,采用的是对训练集进行随机采样,产生多个大小相同,但是彼此间有差异的数据集,再使用这些数据集分别训练弱学习器,最后结合为强学习器,Bagging的示意图如下

image-20240123210629650

这里再做一些细节上的补充,Bagging的随机采样采用的是有放回的随机采样,也就是说同一个样本可能在随机采样出的数据集中多次出现。并且,我们可以注意到Bagging的弱学习器之间没有关联,也就是说Bagging是一种可以并行计算的算法。典型的Bagging算法有随机森林

Boosting

接着,我们来介绍Boosting。Boosting与Bagging一样都是采用单一弱学习器。区别于Bagging的是Boosting生成弱学习器的方法,Boosting使用完整的训练集进行训练,先训练出一个弱学习器,再根据这个弱学习器的表现,调整训练集样本的权重,也就是对表现不好的样本提高权重,之后再训练下一个弱学习器,这样上一个弱学习器表现不好的样本就会在这个弱学习器中得到更多的关注,如此往复,直到弱学习器数量达到设定。好比说,先让老大做一遍题,老大做的不行的,让老二多加注意,弥补漏洞,老二再不行的让老三补,以此类推。这种策略通过改变训练集的权重来训练出具有差异性的弱学习器,Boosting的示意图如下

image-20240127202754925

Boosting相比Bagging更具有针对性,但是Boosting的弱学习器之间彼此关联,故只能串行计算,计算效率不如Bagging。常见的Boosting算法有AdaBoostGBDT

Stacking

最后是Stacking,Stacking是直接使用多种不同的弱学习器,直接达到多个具有差异性的弱学习器的目的。而且由于采用多种不同的学习器,各学习器之间差异较大,所以最终的结合策略一般会采用学习法(下文会细讲)

image-20240127213428404

结合策略

现在我们来看看结合策略,这里会用到一些数学表达。在集成学习中,我们训练了nn个弱学习器,并且产生了nn个预测结果,结合策略无非就是将nn个预测结果结合为1个结果。记弱学习器输出的nn个预测结果为(y1,y2,yn)(y_1, y_2, \cdots y_n),最终的预测结果为YY

投票法

对于分类问题,一般采用投票法,也就是少数服从多数,假设问题共有mm个分类,用数学表达出来就是

Y=max(i=1nI(yi=aj))j=1,2,,mY = max(\sum_{i=1}^{n}{I(y_i=a_j)}) \quad j=1,2,\cdots,m

其中

I(yi=aj)={1,yi=aj0,yiajI(y_i=a_j)=\begin{cases} 1, \quad y_i=a_j \\0, \quad y_i \neq a_j \end{cases}

当然,这是最简单的投票法,也可以对每个学习器加入权重ωi\omega_i,则最终预测结果为

Y=max(i=1nωiI(yi=aj))j=1,2,,mY = max(\sum_{i=1}^{n}{\omega_iI(y_i=a_j)}) \quad j=1,2,\cdots,m

一般来说,权重默认均相同,也可以通过各弱学习器的正确率来确定,或者同学习法,使用学习的方法确定权重。

平均法

对于回归问题,由于输出值是一个连续值,故一般采用平均法,也就是将所有弱学习器的预测结果进行平均,用数学表达出来就是

Y=1ni=1nyiY = \frac{1}{n}\sum_{i=1}^{n}{y_i}

同理,平均法也可以加入权重,也就是

Y=1ni=1nωiyiY = \frac{1}{n}\sum_{i=1}^{n}{\omega_iy_i}

学习法

学习法其实是基于上述两种方法的改进,就是使用学习的方法,确定上述两种方法的权重ωi\omega_i。也就相当于在模型的最后加入一个神经网络的全连接层,输入为一个1×n1 \times n的向量,输出为1×11 \times 1的向量。

学习法常用于Stacking,因为Stacking使用多种不同的学习器,学习器之间相差较大,需要一个更好的结合策略来结合这些学习器的结果。