AdaBoost算法
0x00 概述
AdaBoost,全称是“Adaptive Boosting”,由Freund和Schapire在1995年首次提出,并在1996发布了一篇新的论文证明其在实际数据集中的效果。
这篇博客主要解释AdaBoost的算法详情以及实现。它可以理解为是首个“boosting”方式的集成算法。是一个关注二分类的集成算法。
0x01 算法的总体情况
AdaBoost的目标是建立如下的最终的分类器:
其中,假设我们输入的训练数据总共有
1.1 sign函数
这里的
1.2 弱分类器f(x)
模型中的
0x02 AdaBoost的求解
前面可以看到AdaBoost的模型本身非常简单。那么,如何求解这个模型中弱分类器的权重及其参数呢?其步骤如下:
首先,根据前面所述,有
接下来,我们对每一个弱分类器
1) 训练一个弱分类器,使得其分类误差最小,此时计算该分类器的误差计算如下公式:
这个公式的含义就是模型的误差等于每一个错分的样本权重之和。
当该模型是第一个弱分类器(即第一次迭代的时候),该公式中的含义就是计算当前弱分类器分错的样本个数,除以总的样本数量,得到该弱分类器的误差(因为,此时每个样本的误差都是1/n)。同时注意,在后面的迭代中,每个错分的样本的权重是不同的,这里的
该公式的含义就是,当该弱分类器的准确率(1-前面的误差)大于0.5,那么这个权重就是正值(因为此时
3)最后,我们根据模型权重更新数据的权重:
这里的
解释一下这个公式的含义,指数内部
0x03 AdaBoost的Python实现
根据上述原理,AdaBoost的实现就很容易了。这里的主要目标是训练好每个弱分类器的同时,计算好分类器的权重。
# 载入数据
# 训练数据的特征和标签
x_train, y_train = ...
# 预测数据的特征
y_train = ...
# 定义分类器数量
M = 100
models = getModel(100)
# 计算数据数量
n_train = x_train.shape[0]
# 初始化数据权重
w = np.ones(n_train) / n_train
# 初始化模型权重
theta = np.zeros(n_train)
# 循环迭代
for m in range(M):
# 训练一个弱分类器
models[m].fit(x_train,y_train)
# 计算弱分类器误差
pred_train = models[m].predict(x_train)
miss = [int(x) for x in (pred_train != y_train)]
error = np.dot(w, miss)
# 计算弱分类器的权重
theta[m] = 0.5 * np.log((1-error)/error)
# 更新数据权重
for i in n_train:
w[i] = w[i]*np.exp(-theta[m]*y_train[i]*pred_train[i])
# 正规化权重
for i in n_train:
w[i] /= np.sum(w[i])
# 最终的预测
predict = np.dot(theta, [model[m].predict(x_test) for m in range(M)])