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 | # Importing necessary libraries |