集成学习-Adaboost

Adaboost 是 Boosting 算法中有代表性的一个。原始的 Adaboost 算法用于解决二分类问题,因此对于一个训练集

$$ T = {\left(x_1, y_1\right), \left(x_2, y_2\right), …, \left(x_n, y_n\right)} $$

其中 (x_i \in \mathcal{X} \subseteq \mathbb{R}^n, y_i \in \mathcal{Y} = {-1, +1}),首先初始化训练集的权重

$$ \begin{equation} \begin{split} D_1 =& \left(w_{11}, w_{12}, …, w_{1n}\right) \ w_{1i} =& \dfrac{1}{n}, i = 1, 2, …, n \end{split} \end{equation} $$

根据每一轮训练集的权重 (D_m),对训练集数据进行抽样得到 (T_m),再根据 (T_m) 训练得到每一轮的基学习器 (h_m)。通过计算可以得出基学习器 (h_m) 的误差为 (\epsilon_m),根据基学习器的误差计算得出该基学习器在最终学习器中的权重系数

$$ \alpha_m = \dfrac{1}{2} \ln \dfrac{1 - \epsilon_m}{\epsilon_m} $$

更新训练集的权重

$$ \begin{equation} \begin{split} D_{m+1} =& \left(w_{m+1, 1}, w_{m+1, 2}, …, w_{m+1, n}\right) \ w_{m+1, i} =& \dfrac{w_{m, i}}{Z_m} \exp \left(-\alpha_m y_i h_m\left(x_i\right)\right) \end{split} \end{equation} $$

其中 (Z_m) 为规范化因子

$$ Z_m = \sum_{i = 1}^{n} w_{m, i} \exp \left(-\alpha_m y_i h_m \left(x_i\right)\right) $$

从而保证 (D_{m+1}) 为一个概率分布。最终根据构建的 (M) 个基学习器得到最终的学习器:

$$ h_f\left(x\right) = \text{sign} \left(\sum_{m=1}^{M} \alpha_m h_m\left(x\right)\right) $$

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Importing necessary libraries
from sklearn.datasets import load_iris
from sklearn.model_selection
import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 加载 Iris 数据集。
iris = load_iris()
X, y = iris.data, iris.target

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

# 定义 max_depth=1 的基础决策树分类器来创建弱学习器。
base_classifier = DecisionTreeClassifier(max_depth=1)

# 使用基分类器(决策树)定义 AdaBoost 分类器,并指定要使用的估计器(增强轮数)的数量
adaboost_classifier = AdaBoostClassifier(estimator=base_classifier, n_estimators=50, random_state=42)

# 在训练数据上训练 AdaBoost 分类器。
adaboost_classifier.fit(X_train, y_train)

# 预测测试数据的标签。
y_pred = adaboost_classifier.predict(X_test)

# 最后,我们计算 AdaBoost 分类器在测试集上的准确率。
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
-------------本文结束感谢您的阅读-------------