集成学习:串联(提升方法),并联(随机森林)
Adaboost:分类加法模型(更新样本权值,投票权值-由权值误差率决定)
提升树:回归加法模型 (更新标签:为上次模型的残差,由平方误差最小原则学得弱分类器)
adaboost算法
AdaBoost(Adaptive Boosting)是一种流行的提升方法,它通过迭代地组合多个弱分类器来构建一个强分类器。AdaBoost的核心思想是:
- 弱学习器的转换:即使弱学习器的性能只比随机猜测略好,AdaBoost也能够通过适当的组合提升其性能。
- 样本权重的调整:在每一轮迭代中,AdaBoost增加被前一轮弱分类器错误分类样本的权重,减少正确分类样本的权重,从而使得后续的弱学习器更加关注难以分类的样本。
在 AdaBoost 算法中,解决提到的两个关键问题
1. 如何改变训练数据的权值或概率分布?
在每一轮 AdaBoost 的迭代中,训练数据的权值会根据前一轮弱分类器的性能进行调整。具体步骤如下:
- 错误分类的样本:增加被前一轮弱分类器错误分类的样本的权值。这意味着这些样本在下一轮中将有更大的影响力,因为模型会尝试更加关注这些难以分类的样本。
- 正确分类的样本:降低被正确分类的样本的权值。这些样本在下一轮中的权重会减少,因为它们已经被当前模型很好地分类了。
通过这种方式,AdaBoost 算法逐步集中于难以分类的样本,从而提高模型的整体性能。
2. 如何将弱分类器组合成一个强分类器?
AdaBoost 算法通过加权多数表决的方式来组合多个弱分类器,形成一个强分类器。具体步骤包括:
计算弱分类器的系数:每个弱分类器都会根据其性能获得一个系数(alpha)。这个系数是通过弱分类器的错误率计算得出的,计算公式为:
其中,ϵm 是第 m 个弱分类器的错误率。
加权多数表决:最终的预测结果是通过将所有弱分类器的预测结果进行加权求和得到的。弱分类器的系数 αmαm 决定了它在最终决策中的重要性。具有较小错误率的弱分类器会有较大的系数,因此在最终的表决中起到更大的作用。
最终预测:对于分类问题,最终的预测是所有弱分类器预测结果的加权多数表决。对于回归问题,最终的预测是加权平均值。
AdaBoost算法流程
- 初始化:为训练数据集的每个样本分配相同的权重。
- 迭代训练:在每一轮中,根据当前权重分布训练一个弱分类器,并计算其在加权训练集上的表现。
- 权重更新:根据弱分类器的错误率调整样本权重,为下一轮迭代做准备。
- 组合弱分类器:通过加权多数表决的方式组合所有弱分类器,形成最终的强分类器。
提升树:决策树的强强联合
提升树是一种以决策树作为基本分类器的提升方法,它在分类和回归问题上都表现出色。提升树的关键特点包括:
- 决策树的简洁性:提升树中的决策树通常具有较浅的深度,如决策树桩,这使得它们易于理解和实现。
- 逐步优化:通过逐步添加决策树并优化损失函数,提升树能够逐渐逼近复杂的数据结构。
提升树算法流程
- 初始化模型:通常以一个常数值或基于训练数据的简单模型开始。
- 负梯度计算:在每一步中,计算当前模型输出与真实值之间的残差,即损失函数的负梯度。
- 弱学习器训练:训练一个新的决策树,使其拟合这些残差。
- 模型更新:将新训练的决策树以一定的学习率加入到现有模型中,更新整体模型。
梯度提升:损失函数的梯度下降
梯度提升算法是提升方法的另一种形式,它通过利用损失函数的负梯度作为残差的近似值来训练弱学习器。梯度提升的关键步骤包括:
- 初始化:设置一个初始模型,通常是一个常量或简单的预测。
- 迭代优化:在每一轮迭代中,计算当前模型的负梯度,并用它来指导新弱学习器的训练。
- 模型更新:将新训练的弱学习器加入到现有模型中,逐步优化整体模型。
例题及解答:
Code
import numpy as np
# 初始数据和标签
X = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
y = np.array([1, 1, 1, -1, -1, -1, 1, 1, -1, -1])
# 初始化样本权重
n_samples = len(X)
D = np.ones(n_samples) / n_samples
# 弱分类器的阈值和系数
thresholds = [2.5, 8.5, 5.5]
alphas = [0.4236, 0.6496, 0.7514]
# 弱分类器函数
def weak_classifier(X, threshold):
return np.sign(X - threshold)
# AdaBoost 迭代
def adaboost(X, y, D, thresholds, alphas):
final_classifier = 0
for alpha, threshold in zip(alphas, thresholds):
G = weak_classifier(X, threshold)
err = np.sum(D[G != y]) # 计算误差率
D *= np.exp(-alpha * y * G) # 更新权重
D /= D.sum() # 归一化权重
final_classifier += alpha * G # 累加弱分类器的预测结果
return final_classifier
# 调用 AdaBoost
final_prediction = adaboost(X, y, D, thresholds, alphas)
# 将最终分类器的结果转换为 -1 或 1
final_prediction = np.sign(final_prediction)
print("最终预测结果:", final_prediction)
最终预测结果: [-1. -1. -1. -1. -1. -1. 1. 1. 1. 1.]