集成学习两大流派

摘要

本周学习了集成学习中的两种重要方法:Boosting和Bagging。Boosting通过迭代训练弱学习器,并根据前一轮的表现调整样本权重,最终将弱学习器组合成强学习器。AdaBoost是Boosting的一个经典实现。Bagging则是通过对数据集进行随机采样来并行训练多个弱学习器,然后结合它们的预测结果。随机森林作为Bagging的一种改进,引入了特征随机选择机制,进一步提高了模型的泛化能力和处理高维数据的能力。通过实例展示了这些方法在分类和回归问题上的应用。

abstract

This week studied two important methods in ensemble learning: Boosting and Bagging. Boosting eventually combines weak learners into strong learners by iteratively training them and adjusting the sample weights based on the performance of the previous round. AdaBoost is a classic implementation of Boosting. Bagging trains multiple weak learners in parallel by randomly sampling data sets and then combining their predictions. Random forest, as an improvement of Bagging, introduces a feature random selection mechanism, which further improves the generalization ability of the model and the ability of processing high-dimensional data. The application of these methods to classification and regression problems is demonstrated by examples.

1.Boosting

弱学习机:对一定分布的训练样本给出假设(如根据有云猜测可能会下雨)
强学习机:根据得到的弱学习机和相应的权重给出假设(最大程度上符合实际情况 根据cnn、abc、cbs以往的预测表现及实际天气情况作出综合准确的天气预测)
弱学习机通过Boodting变成强学习机
Boosting 流程:
在这里插入图片描述
在这里插入图片描述

  • 1.原始训练集输入,带有原始分布
  • 2.给出训练集中各样本的权重
  • 3.改变分布后的训练集输入已知的弱学习机,弱学习机对每个样本给出假设
  • 4.** 对此次的弱学习机给出权重**
  • 5.转到2,直到循环到达一定次数或者某度量标准符合要求
  • 6.将弱学习机按其相应的权重加权组合形成强学习机
    如何计算弱学习机的权重?
    (x1,y1)…(xn,yn),xi∈X,yi∈{-1,1}
    H t ( X i ) = s i g n ( ∑ i = 1 t w i ⋅ h t ( X i ) ) H_{t}(X_{i})=sign(\sum_{i=1}^{t}w_{i}\cdot h_{t}(X_{i})) Ht(Xi)=sign(i=1twiht(Xi))
    最基本的损失函数表达形式:
    ∑ i = 1 N ( y i ≠ H ( x i ) ? 1 : 0 ) \sum_{i=1}^N(y_i\neq H(x_i)?1:0) i=1N(yi=H(xi)?1:0)
    为了方便计算,采用以下的目标函数:
    ∑ i = 1 N exp ⁡ ( − y i H ( x i ) ) \sum_{i=1}^N\exp(-y_iH(x_i)) i=1Nexp(yiH(xi))
    y i H ( x i ) = 1 y_iH(x_i)=1 yiH(xi)=1表示预测准确,否则预测错误(根据ex的函数图像,当预测正确时,对整个误差求和影响较小)

给定当前分布和选定的弱学习机,如何求下一次分布?
boosting的设计思想:

  • 改变分布,提高错误样本概率,使下一次的弱学习机能够集中精力针对那些困难样本。
  • 调整分布后的训练集对当前学习机具有最大的随机性,正确率为50%(恰好为随机猜测)

补充
熵映射(相对熵原理–最小鉴别信息原理)
物理意义:在只掌握部分信息的情况下要对分布作出判断时,应该选取符合约束条件但熵值取得最大的概率分布。

1.1Adaboost算法

核心思想:针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)

对于boosting 算法,存在两个问题:
1.如何调整训练集,使得在训练集上训练的弱分类器得以进行
2.如何将训练得到的各个弱分类器联合起来形成强分类器
针对以上两个问题,Adaboost算法进行了调整:
1.使用加权后选取的训练数据代替随机选取的训练样本,这样将训练的焦点集中在比较难分的训练数据样本上。
2.将弱分类器联合起来,使用加权的投票机制代替平均投票机制。让分类效果好的弱分类器具有较大的权重,而分类效果差的分类器具有较小的权重。
训练过程
A.初始化训练样本xi 权重 D 1 ( i ) i = 1 , . . . , N \mathcal{D}_{1}(i) i=1,...,N D1(i)i=1,...,N
(1)若正负样本数目一致,则 D 1 ( i ) = 1 N \mathcal{D}_1(i)=\frac1N D1(i)=N1
(2)若正负样本数目分别为N+、N-,则 { 正样本 D 1 ( i ) = 1 2 N + 负样本 D 1 ( i ) = 1 2 N − \begin{cases}\text{正样本}\mathcal{D}_1(\boldsymbol{i})=\frac{1}{2N_+}\\\\\text{负样本}\mathcal{D}_1(\boldsymbol{i})=\frac{1}{2N_-}\end{cases} 正样本D1(i)=2N+1负样本D1(i)=2N1
B.(1)训练弱分类器 f m ( x ) = L ( D , D m ) ∈ { − 1 , + 1 } f_{m}\left(x\right)=L\left(\mathcal{D},\mathcal{D}_{m}\right)\in\left\{-1,+1\right\} fm(x)=L(D,Dm){1,+1}
(2)估计弱分类器 f m ( x ) f_{m}\left(x\right) fm(x)的分类错误率em
例如: e m = 1 2 ∑ i = 1 N D m ( i ) ⋅ ∣ f m ( x i ) − y i ∣ [ 注: e m < 0.5 ] e_{m}=\frac{1}{2}\sum_{i=1}^{N}D_{m}\left(i\right)\cdot\left|f_{m}\left(x_{i}\right)-y_{i}\right|\quad\left[\text{注:} e_{m}<0.5\right] em=21i=1NDm(i)fm(xi)yi[:em<0.5]
(3) 估计弱分类器 f m ( x ) f_{m}\left(x\right) fm(x)的权重 c m = log ⁡ 1 − e m e m c_{m}=\log\frac{1-e_{m}}{e_{m}} cm=logem1em
(4)基于弱分类器 f m ( x ) f_{m}\left(x\right) fm(x)调整各样本权重,并归一化。
调整 D m + 1 ( i ) = D m ( i ) ⋅ exp ⁡ [ c m ⋅ 1 ( f m ( x i ) ≠ y i ) ] \mathcal{D}_{m+1}\left(i\right)=\mathcal{D}_{m}\left(i\right)\cdot\exp\left[c_{m}\cdot1_{\left(f_{m}\left(x_{i}\right)≠y_{i}\right)}\right] Dm+1(i)=Dm(i)exp[cm1(fm(xi)=yi)] = { D m ( i ) 若 f m ( x i ) = y i D m ( i ) ⋅ 1 − e m e m 若 f m ( x i ) ≠ y i =\begin{cases}\mathcal{D}_m\left(i\right)&\text{若}f_m\left(x_i\right)=y_i\\\mathcal{D}_m\left(i\right)\cdot\frac{1-e_m}{e_m}&\text{若}f_m\left(x_i\right)\neq y_i\end{cases} ={Dm(i)Dm(i)em1emfm(xi)=yifm(xi)=yi
归一化
D m + 1 ( i ) ← D m + 1 ( i ) ∑ j = 1 N D m + 1 ( j ) i = 1 , . . . , N \mathcal{D}_{m+1}(i)\leftarrow\frac{\mathcal{D}_{m+1}(i)}{\sum_{j=1}^{N}\mathcal{D}_{m+1}(j)} i=1,...,N Dm+1(i)j=1NDm+1(j)Dm+1(i)i=1,...,N
C.强分类器
H ( x ) = s g n [ ∑ m = 1 M c m f m ( x ) ] H\left(x\right)=\mathrm{sgn}\left[\sum_{m=1}^{M}c_{m}f_{m}\left(x\right)\right] H(x)=sgn[m=1Mcmfm(x)]
实例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

# 生成模拟数据集
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化AdaBoost分类器
ada_clf = AdaBoostClassifier(n_estimators=100, random_state=42)

# 训练模型
ada_clf.fit(X_train, y_train)

# 预测
y_pred = ada_clf.predict(X_test)


# 可视化函数
def plot_decision_boundaries(X, y, model, ax=None):
    if ax is None:
        ax = plt.gca()

    # 创建网格以评估模型
    x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
    y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),
                         np.arange(y_min, y_max, 0.01))

    # 使用模型预测网格上的每个点
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)

    # 绘制决策边界
    ax.contourf(xx, yy, Z, alpha=0.8, cmap=plt.cm.RdBu_r)
    # 绘制散点图
    ax.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o', s=50, cmap=plt.cm.RdBu)
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())


# 绘制决策边界和数据点
plt.figure(figsize=(8, 6))
plot_decision_boundaries(X, y, ada_clf)
plt.title('AdaBoost Decision Boundary')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

结果如下:
在这里插入图片描述
回归问题中个体分类器和集成分类器的对比

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor

rng = np.random.RandomState(1)  # 设置随机数生成器的种子
X = np.linspace(0, 6, 100)[:,np.newaxis]  # 创建一个包含100个元素的数组,形状为(,100)
y = np.sin(X).ravel() + np.sin(6 * X).ravel() + rng.normal(0, 0.1, X.shape[0])  # 添加高斯噪声

regr_1 = DecisionTreeRegressor(max_depth=4)  # 创建一个最大深度为4的决策树回归器
regr_2 = AdaBoostRegressor(DecisionTreeRegressor(max_depth=4), n_estimators=300, random_state=rng)  # 创建一个包含300个基学习器的AdaBoost回归器
regr_1.fit(X, y)  # 对决策树回归器进行训练
regr_2.fit(X, y)  # 对AdaBoost回归器进行训练

y_1 = regr_1.predict(X)  # 使用决策树回归器预测
y_2 = regr_2.predict(X)  # 使用AdaBoost回归器预测

plt.figure()
plt.scatter(X, y, c="k", label="training samples")  # 绘制训练数据点
plt.plot(X, y_1, c="g", label="n_estimators=1", linewidth=2)  # 绘制单棵决策树的预测结果
plt.plot(X, y_2, c="r", label="n_estimators=300", linewidth=2)  # 绘制300棵决策树组成的AdaBoost的预测结果
plt.ylabel("target")
plt.xlabel("data")
plt.title("Boosted Decision Tree Regression")
plt.legend()
plt.show()

在这里插入图片描述
上述结果图可以看出,集成分类器比个体分类器的拟合结果更好,性能更优良。

2.Bagging

与上面的Boosting对比,Bagging的特点是各个弱学习器之间没有依赖关系,可以并行拟合。

2.1 bagging的原理

在这里插入图片描述
随机采样:从训练集里面采集固定个数的样本,但每采集一个样本后,都将样本放回。对于Baging算法,一般会随机采集和训练集样本数m一样的个数的样本。由于每次采样的样本内容不同,做n次次随机采样,n个采样集各不相同。

2.2 Bagging弱学习器

最常用的是决策树和神经网络。

2.3 Bagging结合策略

1.分类问题:通常使用简单投票法(boosting为加权),得到最多票数的类别或者类别之一为最终的模型输出。
2.回归问题:通常使用简单平均法,对T个弱学习器得到的回归结果进行算术平均得到最终的模型输出。

3.随机森林

3.1 随机森林特点

1.随机森林(RF)是Bagging算法的进阶版
2.RF使用了CRT决策树作为弱分类器
3.RF改进了CART决策树的构建过程:
通过随机选择节点上的一部分样本特征,这个数字小于n,假设为nsub,然后在这些随机选择的nsub个样本特征中,选择一个最优的特征来决策树的左右子树划分。同时进一步增强了模型的泛化能力。
随机森林的简单应用

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

# 加载数据集
data = load_iris()
X = data.data  # 特征
y = data.target  # 标签

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 创建随机森林分类器对象
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)

# 使用训练数据拟合模型
rf_classifier.fit(X_train, y_train)

# 对测试集进行预测
y_pred = rf_classifier.predict(X_test)

# 计算并打印准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy * 100:.2f}%")

# 打印详细的分类报告
report = classification_report(y_test, y_pred, target_names=data.target_names)
print("Classification Report:\n", report)

# 查看特征重要性
feature_importances = rf_classifier.feature_importances_
print(f"Feature importances: {feature_importances}")

3.2 随机森林小结

RF的主要优点:
1.训练可以高度并行化,对于大数据时代的大样本训练速度又优势。
2.由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型。
3.由于采用了随机采样,训练出的模型的方差小,泛化能力强
4.对部分特征缺失不敏感。
RF的缺点:
1.某些噪声比较大的样本集上,RF容易陷入过拟合
2.取值划分比较多的特征容易对RF的决策产生更大的影响,会影响拟合的模型的效果。

4.总结

集成学习通过结合多个弱学习器来构建一个强大的模型,其中Boosting和Bagging是最为流行的两类方法。Boosting算法如AdaBoost通过逐步聚焦于难分样本以改善整体性能;而Bagging及其进阶版本随机森林则利用多样化的数据子集来减少过拟合的风险。这两种方法各有优势,适用于不同的场景。在实际应用中,根据数据特性和问题需求选择合适的集成策略能够显著提升机器学习模型的准确性和鲁棒性。随机森林因其易于实现、良好的泛化能力和对大规模数据的适应性,在实践中被广泛采用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值