AdaBoost
顺序训练弱学习器,提高误分类样本权重,并按学习器表现加权投票。
学习前需要掌握
背景与问题
均匀训练的浅树桩可能总是忽略少数难分样本。AdaBoost 在每轮之后改变样本权重,使下一轮更重视当前错误,并按弱学习器表现加权组合。困难样本如果是错标或异常,也可能被反复放大。
概念定义
AdaBoost 是顺序构建加权弱学习器的集成。标准二分类推导用 ±1 标签和指数损失,弱学习器按当前样本分布训练,误差决定模型权重,错分样本相对权重提高。多分类 SAMME 等变体的系数与更新约定不同。
直观理解
每轮复习后,把没做对的题在下一轮抽题中提高比重。但一直答不对的题也可能是答案本身错误;关注难题有收益,也会增加对噪声的敏感性。
核心原理
加权错误率是错分样本权重之和,不能用未加权的错误比例代替。标准二分类系数为半个 log((1−ε)/ε),要求弱学习器优于随机猜测;ε=0 或不优于随机时必须按实现做停止或特殊处理。
样本乘 exp(−α y h) 后重新归一化。正确项乘 exp(−α),错误项乘 exp(α);因此说“只提高错误权重”是相对意义,不是保持所有正确项数值不变。
迭代数、学习率和基学习器复杂度共同决定拟合过程。弱学习器间存在顺序依赖,不能像 bagging 那样完全独立训练;验证要关注错标和少数异常是否占据了大量权重。
数学表达
标准二分类 AdaBoost 系数与权重
标签与弱分类输出为 ±1;Z 是归一化常数,本式不是所有多分类变体的通用实现。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1在训练数据上初始化归一化样本权重。
- 2用当前权重拟合弱分类器,并计算加权错误率。
- 3检查是否满足继续提升的条件,计算该分类器系数。
- 4按正确或错误预测更新每条样本权重,再归一化。
代码对应位置
示例 1一次二分类 AdaBoost 权重更新:用完整权重与错分标记核对二分类推导,不冒充多分类接口内部实现。
手算与场景核对
四条样本初始权重均为 0.25,弱分类器只错一条,所以加权错误率 ε=0.25,模型系数为 0.5×ln(3)≈0.549306。
归一化后,唯一错分样本权重为 0.5,每条正确样本约为 0.166667。下一轮会更关注该错误,但如果它是错标,提升也会持续追逐错误标签。
计算与实现步骤
- 在训练数据上初始化归一化样本权重。
- 用当前权重拟合弱分类器,并计算加权错误率。
- 检查是否满足继续提升的条件,计算该分类器系数。
- 按正确或错误预测更新每条样本权重,再归一化。
- 累加加权决策分数,并在独立验证中选择迭代预算。
代码实现
示例 1
一次二分类 AdaBoost 权重更新
example_01.py用途:用完整权重与错分标记核对二分类推导,不冒充多分类接口内部实现。
import math
weights = [0.25] * 4
incorrect = [False, False, False, True]
error = sum(w for w, wrong in zip(weights, incorrect) if wrong)
alpha = 0.5 * math.log((1-error)/error)
updated = [w * math.exp(alpha if wrong else -alpha) for w, wrong in zip(weights, incorrect)]
normalizer = sum(updated)
updated = [w/normalizer for w in updated]
print(f"weighted_error={error:.3f}, alpha={alpha:.6f}")
print("weights=" + ",".join(f"{w:.6f}" for w in updated))代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
用完整权重与错分标记核对二分类推导,不冒充多分类接口内部实现。
alpha- 当前学习率,控制每次参数更新的步长。
w- 模型权重或当前待优化参数。
Step 1 · 1–10 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import math
weights = [0.25] * 4
incorrect = [False, False, False, True]
error = sum(w for w, wrong in zip(weights, incorrect) if wrong)
alpha = 0.5 * math.log((1-error)/error)
updated = [w * math.exp(alpha if wrong else -alpha) for w, wrong in zip(weights, incorrect)]
normalizer = sum(updated)
updated = [w/normalizer for w in updated]
print(f"weighted_error={error:.3f}, alpha={alpha:.6f}")
print("weights=" + ",".join(f"{w:.6f}" for w in updated))预期输出或运行结果
weighted_error=0.250, alpha=0.549306 weights=0.166667,0.166667,0.166667,0.500000
常见错误 · 3 条
- 用普通错误率替代当前加权错误率。
- 忽略归一化,导致样本权重不再表示分布。
- 将二分类半 log 系数直接当作所有 SAMME 接口的系数。
实际应用
- 以浅树桩为基学习器,逐轮组合较简单的分类边界。
- 分析哪些训练样本在迭代中持续被赋予高权重。
常见错误
- 用普通错误率替代当前加权错误率。
- 忽略归一化,导致样本权重不再表示分布。
- 将二分类半 log 系数直接当作所有 SAMME 接口的系数。
资料与假设
参见 scikit-learn:AdaBoost。 本页数值均为构造例;涉及模型分数时仅说明给定数据与协议下的计算。
推荐学习资料
参考库不会生成虚假资源或无效外部链接。