大家好,咱们今天聊AdaBoost!
简单来说,AdaBoost(Adaptive Boosting)是一种集成学习方法,主要用于提升弱分类器的性能,通过组合多个弱分类器(例如决策树)来构建一个强分类器。
AdaBoost在1995年由Yoav Freund和Robert Schapire提出,并且在机器学习领域得到了广泛的应用。
基本介绍
AdaBoost的基本思想是迭代地训练一系列弱分类器,每个弱分类器针对训练数据集进行训练,并根据上一个弱分类器的结果对数据进行加权。在每一轮迭代中,AdaBoost都会关注上一轮分类错误的样本,尝试通过调整权重使得这些样本在下一轮分类中得到更好的处理。最终,将这些弱分类器组合成一个强分类器,其性能优于单个弱分类器。
核心原理
初始化样本权重: 将每个样本的权重初始化为相等值。 迭代训练: 在每一轮迭代中,根据当前样本权重训练一个弱分类器。 计算错误率: 使用训练好的弱分类器对样本进行分类,并计算分类错误的样本的权重之和。 更新样本权重: 对于分类错误的样本,增加其权重,使其在下一轮迭代中更受关注;而对于分类正确的样本,减小其权重,降低其在下一轮迭代中的影响。 组合弱分类器: 根据每个弱分类器的分类准确性(权重),组合这些弱分类器得到一个强分类器。
公式推理
设训练数据集为,其中为样本特征,为样本标签,。AdaBoost的基本公式推理如下:
1. 初始化样本权重:
2. 迭代训练:
设第轮迭代中,分类器为,其中表示第个分类器。
3. 计算错误率:
第轮分类器的错误率为:
其中为指示函数,若与不相等则为1,否则为0。
4. 更新样本权重:
更新样本权重的公式为:
其中为第个分类器的权重,为规范化因子(使得成为概率分布),计算方式为:
5. 组合弱分类器:
最终的强分类器为所有弱分类器的线性组合:
其中为迭代轮数。
在训练过程中,的计算公式为:
这样,分类错误率较低的弱分类器在最终的强分类器中会被赋予更大的权重,从而更大程度上影响最终的分类结果。
代码案例
使用多项式数据来演示AdaBoost回归器的效果,并且绘制了两个不同数量基学习器的情况下的回归结果。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import AdaBoostRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
# 生成多项式数据
np.random.seed(42)
X = np.random.rand(500) * 10
y = np.sin(X) + np.random.normal(0, 0.5, 500)
# 将数据转换成二维数组
X = X[:, np.newaxis]
# 定义基学习器
base_regressor = DecisionTreeRegressor(max_depth=4)
# 定义AdaBoost回归器
regr_1 = AdaBoostRegressor(base_regressor, n_estimators=10, random_state=42)
regr_2 = AdaBoostRegressor(base_regressor, n_estimators=100, random_state=42)
# 训练模型
regr_1.fit(X, y)
regr_2.fit(X, y)
# 生成预测结果
X_test = np.linspace(0, 10, 500)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
# 绘制结果
plt.figure(figsize=(10, 6))
plt.scatter(X, y, c='b', label='Training samples')
plt.plot(X_test, y_1, c='r', label='n_estimators=10', linewidth=2)
plt.plot(X_test, y_2, c='g', label='n_estimators=100', linewidth=2)
plt.xlabel('Data')
plt.ylabel('Target')
plt.title('AdaBoost Regression with Polynomial Features')
plt.legend()
plt.show()
首先,生成了一些多项式数据,然后使用了决策树回归器作为基学习器,并且分别使用了10个和100个基学习器的AdaBoost回归器进行拟合。
最后,我们绘制出了原始数据以及两种情况下的拟合结果。
最后
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~