mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
1518 字
4 分钟
2026-03-21学习
2026-03-21

集成学习#

理解#

集成学习是机器学习的一种思想,通过多个模型的组合形成一个精度更高的模型。

这些模型被叫做弱学习器(estimator),在集成学习里的弱学习器,并不像之前提到的预测模型一样会学习全部的样本(指训练)并直接推出最后的公式(指拟合,比如正规方程),而是交叉学习(Bagging),不会使用全部样本,每个弱学习器只学习部分样本,或者多次推导(Boosting)

这里的部分样本不仅是行(比如多少人),也包括列(有什么特征)。

举个Bagging的例子:

A特征B特征
A弱学习器10
B弱学习器01
C弱学习器00

强学习器(单个学习器预测)因为需要考虑每个特征,因此拟合出来的函数次数一般较高,容易过拟合。

弱学习器则是分别学习不同的特征,或成为单个领域的专家,最后联合投票,这样避免了过拟合的风险。

Bagging思想#

bagging思想有以下几个特征:

  • 有放回的随机抽样
  • 平权投票
  • 可以并行执行

刚刚已经说过交叉学习,这里的弱学习器便是交叉学习不同的样本,最后平权投票,最多票数的预测便是结果,这里的投票类似于KNN算法

比较有代表性的便是:

随机森林算法

这里其实没什么好讲的,说白了就是多课树一起预测,然后选一个票数最多的结果。

为什么要随机抽样训练集?

如果不进行随机抽样的话,每棵树训练集一样,那么最终分类的结果也是一样的。

为什么要有放回的抽样?

如果每棵树训练样本不同,那么没有交集,每棵树可能会被某些数据影响,是”有偏的“,训练出来有很大差异,而随机森林最好的投票结果取决于多棵数。

可能需要用到的包#

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier

需要注意的是参数里面的Max_depth不要过深,最好便是默认的1,如果到3以上基本已经属于强学习器的范畴,在样本本来就分的不是很多的情况下,2^3=8,已经将样本分为了8类,基本上对于数据影响较大的特征都会被遍历,那么学习器会开始趋同。

Boosting思想#

Boosting思想有以下几个特征:

  • 每次训练都会使用全部样本
  • 加权投票 -> 预测正确:样本权重降低 预测错误:样本权重增加
  • 只能串行执行

boosting思想里面的算法就很多了,我们依次讲解。

Adaboost

Adaboost里面的弱学习器的投票是有权重的,权重取决于错误率,错误率越高的模型,投票的权重越低。

αt=12ln(1ϵtϵt)\alpha_t = \frac{1}{2} \ln \left( \frac{1 - \epsilon_t}{\epsilon_t} \right)

这里的at便是模型的权重,我们可以拆解成如下形式:

当前模型的发言权=12×ln(1它的错误率它的错误率)\text{当前模型的发言权} = \frac{1}{2} \times \ln \left( \frac{1 - \text{它的错误率}}{\text{它的错误率}} \right)

这里的错误率是怎么来的呢?就是预测错误的/总数吗?

其实也不是,我们在Boosting思想里可以看到,样本是有权重的,这里的错误率,是:

预测错误的样本×自己的权重预测错误的样本\times自己的权重

可以比喻为做题,错误的题老师会重点讲解,这就是权重上升,对的题老师都不怎么讲,这就是权重下降。

这里样本的权重是怎么更新的呢?

Dt+1(i)=Dt(i)Ztexp(αt)D_{t+1}(i) = \frac{D_t(i)}{Z_t} \exp\Big(-\alpha_t \Big)

看着依旧复杂,我们翻译一下:

某个样本的新权重=它的旧权重所有样本权重总和×e模型发言权\text{某个样本的新权重} = \frac{\text{它的旧权重}}{\text{所有样本权重总和}} \times e^{-\text{模型发言权}}

那怎么开始预测呢?

一开始样本权重是相同的。

假设标签为01,现在有:

x (特征)0123456789
w (权重)0.10.10.10.10.10.10.10.10.10.1
y (标签)111-1-1-1111-1

那么我们便是要找出一个可以让错误率最小的横线,使其分为两半,左边为1,右边为0(需要注意的是左边也可以为0,右边为1,具体取决于错误率)

这里错误率最小分别是在2.5和8.5

根据奥卡姆剃刀原理,我们选择最简分法,也就是2.5

此时模型错误率是0.3,就可以算出模型权重和下一轮样本权重

那么更新了一轮权重,接下来是:

x (特征)0123456789
w (权重)0.071430.071430.071430.071430.071430.071430.166670.166670.166670.07143
y (标签)111-1-1-1111-1

以此类推,最后对于一个未知的标签,预测的结果就是:

H(x)=sign(t=1Tαtht(x))H(x) = \text{sign} \left( \sum_{t=1}^T \alpha_t h_t(x) \right)

继续翻译一下:

最终预测结果=看正负号[所有模型(该模型的发言权×该模型的预测结果)]\text{最终预测结果} = \text{看正负号} \Bigg[ \sum_{\text{所有模型}} \Big( \text{该模型的发言权} \times \text{该模型的预测结果} \Big) \Bigg]

<0则代表为-1,>0则代表为1

GBDT梯度提升树

相较于AdaBoost给错误的数提升权重,GBDT则是直接让下一颗树专门去预测上一颗树算错的值,也就是残差.

和梯度下降类似,导数为0的时候,便是损失最小的时候。

L(y,fi(x))=L(y,fi1(x)+hi(x))=(yfi1(x)hi(x))2L(y, f_i(x)) = L(y, f_{i-1}(x) + h_i(x)) = (y - f_{i-1}(x) - h_i(x))^2 L(y,f(xi))f(xi)=f(xi)yi\frac{\partial L(y, f(x_i))}{\partial f(x_i)} = f(x_i) - y_i

[L(y,f(xi))f(xi)]=yif(xi)-\left[ \frac{\partial L(y, f(x_i))}{\partial f(x_i)} \right] = y_i - f(x_i)

可以发现,负残差正好是导数为0的解。

具体的算法便是先用目标值的平均值当作预测值,然后计算残差,然后计算平方损失,取平方损失最小的点,作为下一轮计算的切分点,取残差作为下一轮目标值,计算切分点两侧的平均数作为预测值,计算残差,再取平方损失最小处作为下一轮切分点…以此类推。

未完待续

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

2026-03-21学习
https://suifengstudy.tech/posts/2026-03-21学习/
作者
随风
发布于
2026-03-21
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00