文章目录
- 一、集成学习
-
- 1、基本概念
- [2、回顾: 误差的偏差-方差分解](#2、回顾: 误差的偏差-方差分解)
- 3、为什么集成学习有效?
- 4、基学习器:"好而不同"
- 5、集成学习的两个基本问题
- 二、自助法(Bagging)
-
- 1、Bagging
- 2、Bootstrap
- [3、Bagging: 集成学习的两个基本问题](#3、Bagging: 集成学习的两个基本问题)
- [4、Bagging: 降低模型方差](#4、Bagging: 降低模型方差)
- 5、Bagging可降低模型方差
- 6、Bagging的应用场景
- 7、Scikit-Learn中的Bagging
- 8、BaggingClassifier的参数
- [9、Out-of-bag error (OOBE)](#9、Out-of-bag error (OOBE))
- 10、基学习器数目
- [11、随机森林(Random Forest)](#11、随机森林(Random Forest))
一、集成学习
1、基本概念
我们已经开发了许多机器学习算法/代码。然而,单个模型的性能已经调到最优,很难再有改进。
集成学习:用很少量的工作,组合多个基模型,使得系统性能提高。
这句话的意思是,通过集成学习,我们可以将多个模型的优势结合起来,从而提升整体的性能。这就像俗话所说的"三个臭皮匠,顶个诸葛亮",通过团队合作,可以产生比单个个体更强大的效果。
2、回顾: 误差的偏差-方差分解
E [ ( y ^ D − y ) 2 ] = Var [ y ^ D ] + ( y ˉ − y ∗ ) 2 + Var [ ε ] \mathbb{E}[(\hat{y}_D - y)^2] = \text{Var}[\hat{y}_D] + (\bar{y} - y^*)^2 + \text{Var}[\varepsilon] E[(y^D−y)2]=Var[y^D]+(yˉ−y∗)2+Var[ε]
误差可以分解为三个部分:方差、偏差的平方和噪声。
-
偏差:当训练误差稳定时,训练误差的大小可以视为模型偏差(训练充分时,模型与训练数据的拟合程度)。
-
方差:当训练误差稳定时,训练误差与验证误差之间的差异可以视为模型的方差(由于数据不同模型性能的差异)。
简单来说,偏差反映了模型预测值与真实值之间的平均误差,而方差则反映了模型预测值在不同数据集上的波动程度。噪声则是数据中不可避免的随机误差。
3、为什么集成学习有效?
如果学习算法能减少模型的偏差(提高算法在训练集上的性能)或者降低模型的方差(从训练集到验证集上更好地泛化),模型的性能都会有所提高。
集成学习通过将多个模型以合适的方式组合,使得组合后的模型的偏差和/或方差变小,从而得到性能更优的机器学习器。
- 如果基础模型太弱(高偏差),通过弱弱组合可以变强 ;
- 如果基础模型太复杂(高方差),通过互相遏制可以变稳定。
简单来说,集成学习就像团队合作,每个成员都有自己的长处和短处。通过合理地组合这些成员,我们可以创建一个性能更优的团队,无论是在训练数据上还是在未知数据上都能表现出色。
4、基学习器:"好而不同"
以下是三个基学习器 f 1 f_1 f1, f 2 f_2 f2, f 3 f_3 f3 在三个测试例子上的表现:
测试例子 | 例 1 | 例 2 | 例 3 |
---|---|---|---|
f 1 f_1 f1 | ✔️ | ✔️ | ❌ |
f 2 f_2 f2 | ❌ | ✔️ | ✔️ |
f 3 f_3 f3 | ✔️ | ❌ | ✔️ |
集成 | ✔️ | ✔️ | ✔️ |
(a) 集成提升性能。
测试例子 | 例 1 | 例 2 | 例 3 |
---|---|---|---|
f 1 f_1 f1 | ✔️ | ✔️ | ❌ |
f 2 f_2 f2 | ✔️ | ✔️ | ❌ |
f 3 f_3 f3 | ✔️ | ✔️ | ✔️ |
集成 | ✔️ | ✔️ | ❌ |
(b) 集成不起作用。
测试例子 | 例 1 | 例 2 | 例 3 |
---|---|---|---|
f 1 f_1 f1 | ✔️ | ✔️ | ❌ |
f 2 f_2 f2 | ❌ | ✔️ | ✔️ |
f 3 f_3 f3 | ❌ | ❌ | ✔️ |
集成 | ❌ | ❌ | ✔️ |
© 集成起负作用。
每个基分类器正确率为66.6%。每个基分类器精度为66.6%,但每个基分类器之间没有差别。
在图(a)中,通过集成学习,我们可以看到集成模型在所有测试例子上都得到了正确的预测,这表明集成学习可以提升模型的性能。在图(b)中,尽管每个基分类器的精度相同,但集成模型并没有提升性能,这说明基学习器之间需要有一定的差异性才能有效集成。在图©中,集成模型甚至比单个基分类器表现得更差,这表明如果基学习器之间差异过大或者集成方式不当,可能会起到反效果。
5、集成学习的两个基本问题
在集成学习中,我们需要解决两个核心问题:
(1)如何训练出具有差异性的多个基学习器?
- 基学习器算法不同:这属于异质集成学习(Heterogeneous Ensemble Learning)。通过使用不同的算法来训练基学习器,我们可以增加它们的多样性,从而提高集成模型的性能。
- 基学习器算法相同,但训练集不同:这属于同质集成学习(Homogeneous Ensemble Learning)。即使使用相同的算法,通过在不同的训练集上训练,我们也可以训练出具有差异性的基学习器。
(2)如何将多个基学习器的预测结果集成为最终的强学习器预测结果?
- Bagging、Boosting、投票、堆叠:这些是常见的集成技术,用于将多个基学习器的预测结果合并为一个最终预测。Bagging(Bootstrap Aggregating)通过重采样训练多个模型并平均它们的预测结果来减少方差。Boosting通过迭代地训练模型,每次训练都试图纠正前一个模型的错误。投票和堆叠则是通过结合多个模型的预测来提高整体性能。
通过这些方法,我们可以有效地利用多个基学习器的预测结果,从而提高最终模型的准确性和鲁棒性。
二、自助法(Bagging)

这张图展示了集成学习中的一种常见方法------Bagging(Bootstrap Aggregating)的流程。Bagging是一种通过组合多个基模型来提高预测性能的技术。下面是图中各部分的详细解释:
-
训练集:这是用于训练模型的原始数据集。
-
Bootstrap采样:从原始训练集中通过有放回的抽样方法生成多个子训练集。这意味着每个子训练集可能包含一些重复的样本,同时也有一些样本没有被选中。
-
子训练集:由Bootstrap采样生成的多个子集,每个子集用于训练一个基模型。
-
基模型 :使用每个子训练集独立训练出的模型。图中显示了 M M M个基模型(基模型1到基模型 M M M)。
-
集成模型:将所有基模型的预测结果进行整合的模型。整合方法可以是投票(对于分类问题)或平均(对于回归问题)。
-
aggregating(整合):这是将基模型的预测结果合并为最终预测的过程。对于分类问题,通常使用多数投票法;对于回归问题,通常取平均值。
-
预测:集成模型对新数据进行预测的过程。
-
预测结果:集成模型最终输出的预测结果。
通过这种方法,Bagging可以减少模型的方差,提高模型的稳定性和预测准确性。每个基模型都是在数据的不同子集上训练的,因此它们可能会犯不同的错误,当这些模型的预测结果被整合时,可以相互抵消一些错误,从而得到更准确的预测。
1、Bagging
Bagging,即自助聚合(Bootstrap Aggregating),是一种通过构建多个模型并综合它们的预测结果来提高整体模型性能的方法。下面是Bagging的详细步骤和数学表达:
- 对给定有 N N N个样本的数据集 D \mathcal{D} D进行Bootstrap采样,得到 D 1 \mathcal{D}^1 D1,在 D 1 \mathcal{D}^1 D1上训练模型 f 1 f_1 f1。
- 上述过程重复 M M M次,得到 M M M个模型,则 M M M个模型的平均(回归)/投票(分类)为:
f avg ( x ) = 1 M ∑ m = 1 M f m ( x ) f_{\text{avg}}(x) = \frac{1}{M} \sum_{m=1}^{M} f_m(x) favg(x)=M1m=1∑Mfm(x)
- 可以证明:Bagging可以降低模型的方差。
在Bagging中,每个模型都是在数据集的一个随机子集上训练的,这些子集是通过有放回抽样得到的。这意味着一些样本可能会被重复选中,而另一些则可能从未被选中。通过这种方式,每个模型可能会看到不同的数据视角,从而减少模型对特定样本的依赖,降低过拟合的风险。最终,通过平均所有模型的预测结果(对于回归问题)或通过投票机制选择最常见的预测类别(对于分类问题),可以得到一个更加稳定和准确的预测。
2、Bootstrap
Bootstrap是一种统计方法,用于从原始数据集中生成多个新的样本集,以估计统计量的分布。以下是Bootstrap的基本概念和步骤:
- 通过从原始的 N N N个样本数据 D = { x 1 , . . . , x N } \mathcal{D} = \{x_1, ..., x_N\} D={x1,...,xN}进行 N N N次有放回采样 N N N个数据 D ′ \mathcal{D}' D′,称为一个bootstrap样本。
- 对原始数据进行有放回的随机采样,抽取的样本数目同原始样本数目一样。
例如:若原始样本为 D = { A , B , C , D , E } \mathcal{D} = \{A, B, C, D, E\} D={A,B,C,D,E}
则bootstrap样本可能为:
- D 1 = { A , B , B , D , E } \mathcal{D}^1 = \{A, B, B, D, E\} D1={A,B,B,D,E}
- D 2 = { A , C , D , D , E } \mathcal{D}^2 = \{A, C, D, D, E\} D2={A,C,D,D,E}
图中展示了如何从原始数据 { A , B , C , D , E } \{A, B, C, D, E\} {A,B,C,D,E}中通过有放回抽样生成三个不同的Bootstrap样本:
- 样本1: { A , B , E , B , D } \{A, B, E, B, D\} {A,B,E,B,D}
- 样本2: { A , D , D , C , E } \{A, D, D, C, E\} {A,D,D,C,E}
- 样本3: { D , B , D , E , B } \{D, B, D, E, B\} {D,B,D,E,B}
Bootstrap方法通过这种方式生成多个样本集,每个样本集都可能包含一些重复的元素,也可能缺少一些原始数据集中的元素。这种方法常用于估计模型的方差、偏差以及预测的不确定性。
Bootstrap采样的数学性质
在Bootstrap采样中,我们关心的是原始样本中某个特定样本在Bootstrap采样中未被选中的概率。
- 一个样本不在一个Bootstrap采样集中出现的概率: ( 1 − 1 N ) N \left(1 - \frac{1}{N}\right)^N (1−N1)N
- 当 N N N趋向于无穷大时,上述概率的极限值为: lim N → ∞ ( 1 − 1 N ) N = 0.368 \lim_{N \to \infty} \left(1 - \frac{1}{N}\right)^N = 0.368 N→∞lim(1−N1)N=0.368
这意味着大约有36.8%的样本在任何给定的Bootstrap采样中都不会出现。
- 包内数据 :原始训练集中约有 1 − 0.368 = 63.2 % 1 - 0.368 = 63.2\% 1−0.368=63.2% 的样本出现在采样集中。
- 包外数据 (out of bag, oob):其余 0.368 0.368 0.368 的数据,即大约36.8%的数据,没有出现在采样集中。
由于这种特性,我们可以将其用作验证集,用于对包外数据不参与某个基模型泛化性能的估计,这样无需额外留出验证集。
3、Bagging: 集成学习的两个基本问题
Bagging,即自助法,是一种常用的集成学习方法,它通过构建多个基学习器并结合它们的预测结果来提高模型的性能。Bagging主要解决以下两个问题:
(1)如何训练出具有差异性的多个基学习器?
- 基学习器算法相同,但训练集不同:对训练集的Bootstrap采样。这意味着我们使用相同的算法来训练基学习器,但每个基学习器都是在原始训练集的一个Bootstrap样本上训练的。Bootstrap采样是一种有放回的随机抽样方法,它确保了每个基学习器看到的数据略有不同,从而增加了模型的多样性。
(2)如何将多个基学习器的预测结果集成为最终的强学习器预测结果?
- 每个基学习器的地位相同:
- 对于分类任务 ,通常采取投票法,即取多个基学习器的预测类别的众数作为最终预测。
- 对于回归任务 ,通常使用平均法,即取多个基学习器的预测值的平均作为最终预测。
通过这种方式,Bagging可以有效地降低模型的方差,提高模型的稳定性和预测准确性。每个基学习器都是在数据的不同子集上训练的,因此它们可能会犯不同的错误,当这些模型的预测结果被整合时,可以相互抵消一些错误,从而得到更准确的预测。
4、Bagging: 降低模型方差
Bagging通过构建多个基学习器并平均它们的预测结果来降低模型的方差。以下是Bagging降低方差的数学原理:
假设 f 1 ( x ) f_1(x) f1(x), f 2 ( x ) f_2(x) f2(x), ... , f M ( x ) f_M(x) fM(x)是相互独立同分布的模型,
则 M M M个独立同分布的预测的均值为:
f ( x ) = 1 M ∑ m = 1 M f m ( x ) f(x) = \frac{1}{M} \sum_{m=1}^{M} f_m(x) f(x)=M1m=1∑Mfm(x)
预测均值的期望为:
E ( f ( x ) ) = E ( 1 M ∑ m = 1 M f m ( x ) ) = 1 M ∑ m = 1 M E ( f m ( x ) ) = E ( f m ( x ) ) \mathbb{E}(f(x)) = \mathbb{E}\left(\frac{1}{M} \sum_{m=1}^{M} f_m(x)\right) = \frac{1}{M} \sum_{m=1}^{M} \mathbb{E}(f_m(x)) = \mathbb{E}(f_m(x)) E(f(x))=E(M1m=1∑Mfm(x))=M1m=1∑ME(fm(x))=E(fm(x))
预测均值的方差为:
Var ( f ( x ) ) = Var ( 1 M ∑ m = 1 M f m ( x ) ) = 1 M 2 ∑ m = 1 M Var ( f m ( x ) ) = 1 M Var ( f m ( x ) ) \text{Var}(f(x)) = \text{Var}\left(\frac{1}{M} \sum_{m=1}^{M} f_m(x)\right) = \frac{1}{M^2} \sum_{m=1}^{M} \text{Var}(f_m(x)) = \frac{1}{M} \text{Var}(f_m(x)) Var(f(x))=Var(M1m=1∑Mfm(x))=M21m=1∑MVar(fm(x))=M1Var(fm(x))
通过上述公式可以看出,Bagging通过平均 M M M个独立同分布的模型的预测结果,可以将方差降低到原来的 1 M \frac{1}{M} M1。这意味着随着基学习器数量的增加,集成模型的方差会逐渐减小,从而提高模型的稳定性和泛化能力。
需要注意的是,上述推导假设基学习器之间是相互独立的。在实际应用中,可以通过对训练集进行Bootstrap采样来近似实现基学习器之间的独立性。每个基学习器都是在原始训练集的一个Bootstrap样本上训练的,因此它们可能会看到不同的数据视角,从而降低它们之间的相关性。
5、Bagging可降低模型方差
在Bagging方法中,通过对数据集进行多次Bootstrap采样并训练多个模型,可以降低模型的方差,同时保持模型的偏差不变。以下是Bagging降低方差的详细解释:
- 在Bagging中, M M M次预测结果的均值 f ( x ) f(x) f(x)的方差比用原始训练样本单次训练的模型的预测结果 f m ( x ) f_m(x) fm(x)的方差小,二者的期望相同:
- Bagging可以降低模型方差
- Bagging不改变模型偏差
- Bagging中的每个模型不完全独立(训练样本有一部分相同),方差的减少没那么多,但也会减少:
- 若 f m f_m fm之间的相关性为 ρ \rho ρ,则 f ( x ) f(x) f(x)的方差为: ρ × σ 2 + ( 1 − ρ ) × σ 2 M \rho \times \sigma^2 + (1 - \rho) \times \frac{\sigma^2}{M} ρ×σ2+(1−ρ)×Mσ2
- 随机森林相比标准的bagging,对样本和特征进行抽样,进一步减少树之间的相关性
Bagging通过平均多个模型的预测结果来降低方差。由于每个模型都是在数据集的一个Bootstrap样本上训练的,因此它们可能会犯不同的错误。当这些模型的预测结果被平均时,一些错误可能会相互抵消,从而降低整体的方差。
需要注意的是,Bagging中的模型并不是完全独立的,因为它们的训练数据有重叠。但是,即使模型之间存在一定的相关性,Bagging仍然可以有效地降低方差。此外,随机森林作为一种特殊的Bagging方法,通过进一步对样本和特征进行抽样,可以进一步减少模型之间的相关性,从而更有效地降低方差。
推荐阅读:
- 《为什么说bagging是减少variance,而boosting是减少bias?》
- 使用sklearn进行集成学习------理论
6、Bagging的应用场景
Bagging(Bootstrap Aggregating)是一种集成学习技术,特别适合用于那些偏差低、方差高的模型进行融合。以下是Bagging适用的一些情况:
- Bagging适合对偏差低、方差高的模型进行融合
- 例如较复杂的决策树、神经网络等模型。
决策树模型特别容易过拟合,这会导致模型在训练数据上表现很好,但在新数据上的泛化能力差。过拟合的模型通常具有以下特点:
- 决策树很容易过拟合 → 偏差低、方差高
- 如果每个训练样本为一个叶子结点,训练误差为0,这意味着模型可能已经记住了训练数据而不是学会了数据的潜在规律。
Bagging通过创建多个决策树并结合它们的预测结果,有助于减少模型的方差,提高模型的稳定性和泛化能力。每个决策树都是在数据集的一个Bootstrap样本上训练的,因此它们可能会犯不同的错误,当这些树的预测结果被平均时,一些错误可能会相互抵消,从而降低整体的方差。
7、Scikit-Learn中的Bagging
Scikit-Learn库提供了对任意基学习器进行Bagging的支持,主要包含两类方法:分类和回归。
- 分类 :
BaggingClassifier
- 回归 :
BaggingRegressor
以下是Scikit-Learn中BaggingClassifier
和BaggingRegressor
的类定义:
python
class sklearn.ensemble.BaggingClassifier(
base_estimator=None, n_estimators=10, max_samples=1.0,
max_features=1.0, bootstrap=True, bootstrap_features=False, oob_score=False,
warm_start=False, n_jobs=None, random_state=None, verbose=0
)
class sklearn.ensemble.BaggingRegressor(
base_estimator=None, n_estimators=10, max_samples=1.0,
max_features=1.0, bootstrap=True, bootstrap_features=False, oob_score=False,
warm_start=False, n_jobs=None, random_state=None, verbose=0
)
8、BaggingClassifier的参数
BaggingClassifier
的参数如下表所示:
参数 | 说明 |
---|---|
base_estimator |
基学习器,scikit-learn的分类器或回归器。如果没有给出,默认使用决策树(不推荐,不如RandomForest )。 |
n_estimators |
基学习器的数目。通常基学习器越多,模型的方差越小。 |
max_samples |
每个数据子集(用于训练基学习器)的样本数量。可以是浮点数(0.0至1.0,表示取样本占所有样本的比例),也可以是整数(表示样本的实际数量)。注意:如果输入了1而不是1.0,那么每个数据子集仅包含1个样本,会导致严重失误。 |
max_features |
训练基学习器的特征数量。 |
bootstrap |
在随机选取样本时是否有放回。 |
bootstrap_features |
在随机选取特征时是否有放回。 |
oob_score |
是否计算out-of-bag分数。每个基学习器只在原始数据集的一部分上训练,所以可以用剩下样本上的误差(out-of-bag error),来估计它的泛化误差/测试误差。 |
warm_start |
如果是True ,在下一次使用fit方法时,向原有的模型再增加n_estimators 个新的基学习器。 |
n_jobs |
并行运行的线程数。 |
random_state |
控制随机数生成的种子。 |
verbose |
控制输出的详细程度。 |
通过这些参数,用户可以灵活地配置Bagging模型,以适应不同的数据集和任务需求。
9、Out-of-bag error (OOBE)
在Bagging方法中,每个基学习器仅在原始数据集的一部分上进行训练,因此可以利用未被选中的数据(即包外数据,out-of-bag data)来评估模型的性能,而无需进行交叉验证。这种方法称为包外误差(Out-of-bag error),简称OOBE。
具体来说,对于每个基学习器,大约有36.8%的数据未被选入其训练集,这些数据可以作为验证集来估计该基学习器的泛化误差。通过这种方式,我们可以直接使用包外样本上的误差来估计整个Bagging模型的泛化误差或测试误差。
图中展示了一个简单的例子:
- 左图表示单次训练数据,其中一部分数据被选中用于训练,另一部分未被选中。
- 右图表示单次测试数据,其中黄色区域表示被选中的数据,这部分数据用于训练,而橙色区域表示未被选中的数据,这部分数据用于测试。
图中给出的准确率估计为: 11 15 × 100 % = 73.33 % \frac{11}{15} \times 100\% = 73.33\% 1511×100%=73.33%
这意味着在测试数据中,有11个样本被正确分类,总共15个样本,因此准确率为73.33%。这个准确率是基于包外数据计算得出的,可以作为模型泛化能力的估计。
通过OOBE,我们可以在不进行交叉验证的情况下,快速评估Bagging模型的性能,这在实际应用中非常有用。
10、基学习器数目
在Bagging方法中,增加基学习器的数目通常会提升模型的效果,但同时也会增加测试时间和训练时间。
- 当基学习器的数量超过一个临界值之后,算法的效果不再显著地变好。因此,参数基学习器数目n_estimators
并不是模型复杂度参数,无需通过交叉验证来确定。
图中展示了基学习器数目对模型准确率的影响。可以看到,随着基学习器数目的增加,模型的准确率先增加后趋于稳定。
参数值建议:
- 对分类问题 ,可设置基学习器数目为 D \sqrt{D} D ,其中 D D D为特征数目;
- 对回归问题 ,可设置基学习器数目为 D / 3 D/3 D/3。
这些建议可以帮助我们在不牺牲太多模型性能的情况下,减少计算时间和资源消耗。