Adaboost
【摘要】 Adaboost 一、基本内容[!note]实现思路:在每一轮训练中,记录每一次由f(x)=∑m=1i−1αmGm(x)f(x) = \sum_{m=1}^{i-1}\alpha_mG_m(x)f(x)=∑m=1i−1αmGm(x)【错误\正确】分类的样本,在加入新的弱学习器中【提高\降低】分类【错误\正确】样本的权值(即改变样本的比例,类似过采样与降采样)加法模型:多个弱分类器Gm...
Adaboost
一、基本内容
[!note]
实现思路:在每一轮训练中,记录每一次由【错误\正确】分类的样本,在加入新的弱学习器中【提高\降低】分类【错误\正确】样本的权值(即改变样本的比例,类似过采样与降采样)
- 加法模型:多个弱分类器与对应权值的叠加:
- 样本权值的初始设计(权值平等):
- 二分类损失函数,指数损失函数:
二、样本权值更新
可以发现,指数损失函数在【正确\错误】分类的样本的值【小于\大于】1,正好符合Adaboost
加法模型的实现思路,在加入新的弱学习器中【提高\降低】分类【错误\正确】样本的权值,所以第个弱分类器,第个样本的权值更新可以设计为:
在Adaboost
模型中,,所以,权值更新的公式为:
为了加强不同弱分类器之间的依赖性,在更新权值时是在上一个弱分类器模型的基础上进行更新的:
最后加入,得到最终的权值更新式子:
其中,规范化因子表示为:
[!important]
分类正确时,, , 其中,对应正确样本的权值会减少,同理当错误分类时,,对应样本的权值增加
三、弱分类器权值更新
目标损失函数:
在模型优化更新权重的过程中,并不是与传统模型一样采用梯度下降法,因为弱分类器的数量多,更新的参数多,难以实现,在Adaboost模型中采用的前向分布算法,只更新当前弱分类器的参数,优化目标:
对求导的结果,表示损失最小的:
其中表示误差率:
最后还需要实现归一化:
四、代码实现
- 定义弱分类器,采用决策树
model = DecisionTreeClassifier(max_depth=1)
model.fit(X, y, sample_weight=w)
y_pred = model.predict(X)
- 权重更新
权重初始化:
# 权重初始化
w = np.ones(n_samples) / n_samples # 初始化权重
误差率计算:
弱分类器更新:
# 误差率计算以及更新权重
err = np.sum(w * (y_pred != y)) / np.sum(w)
alpha = 0.5 * np.log((1 - err) / max(err, 1e-10))
样本权重更新:
# 更新样本权重
norm = np.sum(w)
w = w * np.exp(-alpha * y * y_pred)
w /= norm
- 加法模型预测:
for alpha, model in zip(self.alphas, self.models):
pred += alpha * model.predict(X)
return np.sign(pred)
- 完整代码:
class AdaBoost:
def __init__(self, n_estimators=50):
self.n_estimators = n_estimators
self.alphas = [] # 每个弱分类器的权重
self.models = [] # 弱分类器列表
def fit(self, X, y):
n_samples, n_features = X.shape
# 初始化样本权重
w = np.ones(n_samples) / n_samples # 初始化权重
for _ in range(self.n_estimators):
# 使用样本权重训练一个弱分类器
model = DecisionTreeClassifier(max_depth=1)
model.fit(X, y, sample_weight=w)
y_pred = model.predict(X)
# 计算分类误差率
err = np.sum(w * (y_pred != y)) / np.sum(w)
if err >= 0.5:
break
# 计算弱分类器的权重
alpha = 0.5 * np.log((1 - err) / max(err, 1e-10))
self.alphas.append(alpha)
self.models.append(model)
norm = np.sum(w)
# 更新样本权重
w = w * np.exp(-alpha * y * y_pred)
w /= norm
def predict(self, X):
pred = np.zeros(X.shape[0])
for alpha, model in zip(self.alphas, self.models):
pred += alpha * model.predict(X)
return np.sign(pred)
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)