通过这篇文章,我们需要理解adaboost算法的思想,知道adaboost的构建过程;能说出残差提升树的概念,能说出残差提升树的基本构建过程,能说出梯度提升树GBDT的基本构建过程。
一、Adaboost算法
Adaptive Boosting(自适应提升)基于 Boosting思想实现的一种集成学习算法核心思想是通过逐步提高那些被前一步分类错误的样本的权重来训练一个强分类器。
1.训练第一个学习器

2.调整数据分布

3.训练第二个学习器

4.再次调整数据分布

5.依次训练学习器,调整数据分布

6.整体过程实现

Adaboost算法推导
1 初始化训练数据权重相等,训练第 1 个学习器
如果有 100 个样本,则每个样本的初始化权重为:1/100
根据预测结果找一个错误率最小的分裂点,计算、更新:样本权重、模型权重
2 根据新权重的样本集 训练第 2 个学习器
根据预测结果找一个错误率最小的分裂点计算、更新:样本权重、模型权重
3 迭代训练在前一个学习器的基础上,根据新的样本权重训练当前学习器
- 直到训练出 m 个弱学习器
4 m 个弱学习器集成预测公式:
- α 为模型的权重,输出结果大于 0 则归为正类,小于 0 则归为负类
5 模型权重计算公式:
,𝑎**t为模型权重,𝜀**𝑡表示第 t 个弱学习器的错误率
6 样本权重计算公式:
,其中Z**t为归一化值(所有样本权重总和)
*Dt(𝑥)*为样本权重 𝑎**t为模型权重
二、Adaboost算法 -- 构建过程
举个例子:
已知训练数据见下面表格,假设弱分类器由 x 产生,预测结果使该分类器在训练数据集上的分类误差率最低,试用 Adaboost 算法学习一个强分类器。






Adaboost算法-构建第2个弱学习器





三、案例AdaBoost实战葡萄酒数据
"""
案例:
演示AdaBoost算法 之 葡萄酒案例。
AdaBoost介绍:
它属于Boosting思想,即:串行执行,每次使用全部样本,最后 加权投票。
原理:
1. 使用全部样本,通过决策树模型(第1个弱分类器)进行训练,获取结果
思路:
预测正确 -> 权重下降
预测错误 -> 权重上升
2. 使用全部样本,把第1个弱分类器的处理结果,交给第2个弱分类器进行训练,获取结果。
思路:
预测正确 -> 权重下降
预测错误 -> 权重上升
3. 依次类推,串行执行,直至获取最终结果。
"""
# 导包
import pandas as pd
from sklearn.preprocessing import LabelEncoder # 标签编码器
from sklearn.model_selection import train_test_split # 训练集、测试集分割
from sklearn.tree import DecisionTreeClassifier # 决策树分类器
from sklearn.ensemble import AdaBoostClassifier # AdaBoost分类器 -> 集成学习
from sklearn.metrics import accuracy_score # 模型评估 -> 正确率
# 1.获取数据集
df_wine = pd.read_csv('./data/wine0501.csv')
# df_wine.info()
# print(df_wine['Class label'].unique()) # [1 2 3] 葡萄酒类别,但是决策树只能识别 二叉树。
# 2.数据预处理
# 2.1 从标签列(Class label)中,获取出 两种类别,过滤掉1类别,剩下2,3类别
df_wine = df_wine[df_wine['Class label'] != 1 ]
df_wine.info()
# print(df_wine['Class label'].unique()) # [2 3]
# 2.2 获取特征列 和 标签列。
x = df_wine[['Alcohol','Hue']] # 酒精 和 色泽
y = df_wine['Class label'] # 标签列
# 2.3 打印数据
# print(x[:5])
# print(y[:5])
# 2.4 通过标签编码器,把 标签列,转换为 数值列
le = LabelEncoder()
y = le.fit_transform(y)
# print(y) # [2,3] -> [0,1]
# 2.5 训练集、测试集分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 23, stratify = y)
# 3.特征工程(此处略)
# 4.模型训练,预测,评估
# 场景1:单一决策树 -> 充当弱分类器
# 4.1 创建模型对象
estimator1 = DecisionTreeClassifier(max_depth = 3)
# 4.2 模型训练
estimator1.fit(x_train, y_train)
# 4.3 模型预测
y_pred1 = estimator1.predict(x_test)
print(f'单一决策树模型预测值为:{y_pred1}')
# 4.4 模型评估
print(f'单一决策树模型的准确率为:{accuracy_score(y_test, y_pred1)}')
# 场景2:AdaBoost -> 集成学习,CART树,200棵
# 4.1 创建模型对象
# 参1:弱分类器(决策树对象),参2:弱分类器个数,参3:学习率
estimator2 = AdaBoostClassifier(DecisionTreeClassifier(max_depth=3), n_estimators = 200, learning_rate = 0.1)
estimator2.fit(x_train, y_train)
# 4.2 训练模型
estimator2.fit(x_train, y_train)
# 4.3 模型预测
y_pred2 = estimator2.predict(x_test)
print(f'AdaBoost集成学习预测结果:{y_pred2}')
# 4.4 模型评估
print(f'AdaBoost集成学习预测正确率:{accuracy_score(y_test, y_pred2)}')s
四、关于Ababoost的总结
Adaboost****概念
•通过逐步提高被分类错误的样本的权重来训练一个强分类器。提升的思想
Adaboost****构建过程
•1 初始化数据权重,来训练第1个弱学习器。找最小的错误率计算模型权重,再更新模数据权重。
•2 根据更新的数据集权重,来训练第2个弱学习器,再找最小的错误率计算模型权重,再更新模数据权重。
•3 依次重复第2步,训练n个弱学习器。组合起来进行预测。结果大于0为正类、结果小于0为负类
五、提升树 (Boosting Decision Tree )
思想:
•通过拟合残差的思想来进行提升
•残差:真实值 - 预测值
生活中的例子:
•预测某人的年龄为100岁
•第1次预测:对100岁预测,预测成80岁;100 -- 80 = 20(残差)
•第2次预测:上一轮残差20岁作为目标值,预测成16岁;20 -- 16 = 4 (残差)
•第3次预测:上一轮的残差4岁作为目标值,预测成3.2岁;4 -- 3.2 = 0.8(残差)
•若三次预测的结果串联起来: 80 + 16 + 3.2 = 99.2
•通过拟合残差可将多个弱学习器组成一个强学习器,这就是提升树的最朴素思想
六、梯度提升树 (Gradient Boosting Decision Tree)
梯度提升树不再拟合残差,而是利用梯度下降的近似方法,利用损失函数的负梯度作为提升树算法中的残差近似值。

GBDT 拟合的负梯度就是残差。如果我们的 GBDT 进行的是分类问题,则损失函数变为 logloss,此时拟合的目标值就是该损失函数的负梯度值。
梯度提升树 --案例
已知:

初始化弱学习器(CART树):
当模型预测值为何值时,会使得第一个弱学习器的平方误差最小,即:求损失函数对 f(xi) 的导数,并令导数为0.

梯度提升树 -- 例子2
2 构建第1个弱学习器,根据负梯度的计算方法得到下表:

3 当 6.5 作为切分点时,平方损失最小,此时得到第1棵决策树
构建第2个弱学习器

以3.5 作为切分点时,平方损失最小,此时得到第2棵决策树

构建第3个弱学习器

以6.5 作为切分点时,平方损失最小,此时得到第3棵决策树

构建最终弱学习器

以把x=6样本为例:输入到最终学习器中的结果 :7.31 + (-1.07) + 0.22 + 0.15 = 6.61
梯度提升树的构建流程
1 初始化弱学习器(目标值的均值作为预测值)
2 迭代构建学习器,每一个学习器拟合上一个学习器的负梯度
3 直到达到指定的学习器个数
4 当输入未知样本时,将所有弱学习器的输出结果组合起来作为强学习器的输出
七、梯度提升树 -- 案例泰坦尼克号生存预测


八、总结
1****提升树
每一个弱学习器通过拟合残差来构建强学习器
2****梯度提升树
每一个弱学习器通过拟合负梯度来构建强学习器