当前位置: 首页 > news >正文

Boosting

Boosting

学习目标

  • 知道boosting集成原理和实现过程
  • 知道bagging和boosting集成的区别
  • 知道AdaBoost集成原理

Boosting思想

Boosting思想图
  • 每一个训练器重点关注前一个训练器不足的地方进行训练
  • 通过加权投票的方式,得出预测结果
  • 串行的训练方式

1 什么是boosting

随着学习的积累从弱到强
简而言之:每新加入一个弱学习器,整体能力就会得到提升
代表算法:Adaboost,GBDT,XGBoost,LightGBM

Bagging&Boosting对比

bagging

boosting

数据采样 

对数据进行有放回的采样训练

全部样本,根据前一轮学习结果调整数据的重要性

投票方式

所有学习器平权投票

对学习器进行加权投票

学习顺序

并行的,每个学习器没有依赖关系

串行,学习有先后顺序

2 实现过程:

1.训练第一个学习器
2.调整数据分布
3.训练第二个学习器
4.再次调整数据分布
5.依次训练学习器,调整数据分布
6.整体过程实现

3 bagging与boosting的区别

  • 区别一:数据方面
    • Bagging:对数据进行采样训练;
    • Boosting:根据前一轮学习结果调整数据的重要性。
  • 区别二:投票方面
    • Bagging:所有学习器平权投票;
    • Boosting:对学习器进行加权投票。
  • 区别三:学习顺序
    • Bagging的学习是并行的,每个学习器没有依赖关系;
    • Boosting学习是串行,学习有先后顺序。
  • 区别四:主要作用
    • Bagging主要用于提高泛化性能(解决过拟合,也可以说降低方差)
    • Boosting主要用于提高训练精度 (解决欠拟合,也可以说降低偏差)

4 AdaBoost介绍

4.1 Adaboost算法推导

1 初始化训练数据 权重相等,训练第 1 个学习器
如果有 100 个样本,则每个样本的初始化权重为:1/100
根据预测结果找一个错误率最小的分裂点,计算、更新:样本权重、模型权重
2 根据新权重的样本集训练第 2 个学习器
根据预测结果找一个错误率最小的分裂点计算、更新:样本权重、模型权重
3 迭代训练在前一个学习器的基础上,根据新的样本权重训练当前学习 器直到训练出 m 个弱学习器
4 m 个弱学习器集成预测公式:
α 为模型的权重,输出结果大于 0 则归为正类,小于 0 则归为负类。
5 模型权重计算公式:
6 样本权重计算公式:

4.2 关键点剖析

如何确认投票权重?
如何调整数据分布?

4.3 案例介绍

给定下面这张训练数据表所示的数据,假设弱分类器由xv产生,其阈值v使该分类器在训练数据集上的分类误差率最低,试用Adaboost算法学习一个强分类器。
问题解答:
构建第一个弱学习器
  1. 初始化工作:初始化 10 个样本的权重,每个样本的权重为:0.1
  2. 构建第一个基学习器:

a.寻找最优分裂点

- 1.对特征值 x 进行排序,确定分裂点为:0.5、1.5、2.5、3.5、4.5、5.5、6.5、7.5、8.5
- 2.当以 0.5 为分裂点时,有 5 个样本分类错误,错误率5/10
- 3.当以 1.5 为分裂点时,有 4 个样本分类错误,错误率4/10
- 4.当以 2.5 为分裂点时,有 3 个样本分类错误,错误率3/10
- 5.当以 3.5 为分裂点时,有 4 个样本分类错误,错误率4/10
- 6.当以 4.5 为分裂点时,有 5 个样本分类错误,错误率5/10
- 7.当以 5.5 为分裂点时,有 4 个样本分类错误,错误率4/10
- 8.当以 6.5 为分裂点时,有 5 个样本分类错误,错误率5/10
- 9.当以 7.5 为分裂点时,有 4 个样本分类错误,错误率4/10
- 10.当以 8.5 为分裂点时,有 3 个样本分类错误,错误率3/10
- 11.最终,选择以 2.5 作为分裂点(出现相同概率的情况使用奥卡姆剃刀选择最简单的情况),计算得出基学习器错误率为:3/10=0.3

b.计算模型权重: 1/2 * np.log((1-0.3)/0.3)=0.4236  (numpy中的计算公式np.log)

c.更新样本权重
- 1.分类正确样本为:1、2、3、4、5、6、10 共 7 个,其计算公式为:

 ,则正确样本权重变化系数为:e-0.4236 = 0.6547

- 2.分类错误样本为:7、8、9 共 3 个,其计算公式为:

,则错误样本权重变化系数为:e0.4236 = 1.5275

- 3.样本 1、2、3、4、5、6、10  权重值为:0.06547
        新的权重=权重系数*旧权重值,这里是0.1
- 4.样本 7、8、9  的样本权重值为:0.15275
- 5.归一化 Zt  值为:0.06547 * 7 + 0.15275 * 3 = 0.9165(所有新的权重和)
- 6.样本 1、2、3、4、5、6、10  最终权重值为(正样本权重/归一化值): 0.07143
- 7.样本 7、8、9  的样本权重值为(负样本权重/归一化值):0.1667

d.此时得到:

  1. 构建第二个弱学习器

1.寻找最优分裂点:

  • 对特征值 x 进行排序,确定分裂点为:0.5、1.5、2.5、3.5、4.5、5.5、6.5、7.5、8.5
  • 当以 0.5 为分裂点时,有 5 个样本分类错误,错误率为:0.07143 * 2 +0.16667 * 3= 0.64287
  • 当以 1.5 为分裂点时,有 4 个样本分类错误,错误率为:0.07143 * 1 + 0.16667 * 3 = 0.57144       
  • 当以 2.5 为分裂点时,有 3 个样本分类错误,错误率为:0.16667 * 3 = 0.57144。。。 。。。
  • 当以 8.5 为分裂点时,有 3 个样本分类错误,错误率为:0.07143 * 3  = 0.21429
  • 最终,选择以 8.5 作为分裂点,计算得出基学习器错误率为:0.21429

2.计算模型权重:1/2 * np.log((1-0.21429)/0.21429)=0.64963

3.分类正确的样本:1、2、3、7、8、9、10,其权重调整系数为:0.5222

4.分类错误的样本:4、5、6,其权重调整系数为:1.9148

5.分类正确样本权重值:

        a.样本 0、1、2、、9 为:0.0373

        b.样本 6、7、8 为:0.087

6.分类错误样本权重值:0.1368

7.归一化 Zt 值为:0.0373 * 4 + 0.087 * 3 + 0.1368 * 3 = 0.8206

8.最终权重:

        a.样本 0、1、2、9 为 :0.0455

        b.样本 6、7、8 为:0.1060

        c.样本 3、4、5 为:0.1667

此时得到:

  • 构建第三个弱学习器
错误率:0.1820,模型权重:0.7514
  • 强学习器

4.4 api

  • from sklearn.ensemble import AdaBoostClassifier
    • api链接:AdaBoostClassifier — scikit-learn 1.6.1 documentation

4.5 LabelEncoder标签标准化

LabelEncoder 是一个用于将标签标准化为从 0 到 n_classes-1 的值的工具,通常用于机器学习中的分类任务。它属于 sklearn.preprocessing 模块,可以将类别标签转换为整数编码,以便于模型处理。
以下是如何使用 LabelEncoder 的基本示例:
from sklearn.preprocessing import LabelEncoder

# 创建一个 LabelEncoder 对象
le = LabelEncoder()

# 假设我们有一些类别标签
labels = ['cat', 'dog', 'mouse', 'cat', 'dog']

# 使用 fit_transform 方法将标签转换为整数编码
encoded_labels = le.fit_transform(labels)

print(encoded_labels)  # 输出: [0 1 2 0 1]

# 如果需要将整数编码转换回原始标签,可以使用 inverse_transform 方法
original_labels = le.inverse_transform(encoded_labels)

print(original_labels)  # 输出: ['cat' 'dog' 'mouse' 'cat' 'dog']
LabelEncoder 会根据类别标签的首次出现顺序为每个类别分配一个整数标签。以下是对输出 [0 1 2 0 2] 的详细解释:
解释
[0 1 2 0 2]:
  • 0:表示类别标签 'cat'。在输入列表 ['cat', 'dog', 'bird', 'cat', 'bird'] 中,'cat' 是第一个出现的类别标签,因此被分配了整数标签 0。
  • 1:表示类别标签 'dog'。'dog' 是第二个出现的类别标签,因此被分配了整数标签 1。
  • 2:表示类别标签 'bird'。'bird' 是第三个出现的类别标签,因此被分配了整数标签 2。
过程
首次出现顺序:
LabelEncoder 会根据类别标签在输入数据中首次出现的顺序进行编码。在这个例子中,'cat' 首次出现,所以被编码为 0;'dog' 第二个出现,所以被编码为 1;'bird' 第三个出现,所以被编码为 2。
  • 重复标签:
如果某个类别标签在输入数据中多次出现,它会被分配相同的整数标签。例如,'cat' 在输入列表中出现了两次,都被编码为 0;'bird' 也出现了两次,都被编码为 2

4.6 AdaBoost实战葡萄酒数据

需求:已知葡萄酒数据,根据数据进行葡萄酒分类
葡萄酒分为白葡萄酒和红葡萄酒两类。 该分析涉及白葡萄酒,并基于数据集中显示的13个变量/特征:固定酸度,挥发性酸度,柠檬酸,残留糖,氯化物,游离二氧化硫,总二氧化硫,密度,pH值,硫酸盐,酒精,质量等。为了评估葡萄酒的质量,我们提出的方法就是根据酒的物理化学性质与质量的关系,找出高品质的葡萄酒具体与什么性质密切相关,这些性质又是如何影响葡萄酒的质量。
1 读数据到内存#
2 特征处理
2-1 修改列名
2-2 Adaboost一般做二分类 去掉一类(1,2,3)
2-4 类别转化 (2,3)=>(0,1)
2-5 划分数据
3 实例化单决策树 实例化Adaboost-由500颗树组成
4 单决策树训练和评估
5 AdaBoost训练和评估
# 获取数据
import pandas as pd
df_wine = pd.read_csv('data/wine.data')

# 修改列名
df_wine.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium', 'Total phenols',
'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue', 'OD280/OD315 of diluted wines',
'Proline']

# 去掉一类(1,2,3)
df_wine = df_wine[df_wine['Class label'] != 1]

# 获取特征值和目标值
X = df_wine[['Alcohol', 'Hue']].values
y = df_wine['Class label'].values
​
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split

# 类别转化 (2,3)=>(0,1)
le = LabelEncoder()
y = le.fit_transform(y)

# 划分训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4,random_state=1)
​
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier

# 机器学习(决策树和AdaBoost)
tree = DecisionTreeClassifier(criterion='entropy',max_depth=1,random_state=0)
ada= AdaBoostClassifier(base_estimator=tree,n_estimators=500,learning_rate=0.1,random_state=0)
from sklearn.metrics import accuracy_score

# 决策树和AdaBoost分类器性能评估
# 决策树性能评估
tree = tree.fit(X_train,y_train)
y_train_pred = tree.predict(X_train)
y_test_pred = tree.predict(X_test)
tree_train = accuracy_score(y_train,y_train_pred)
tree_test = accuracy_score(y_test,y_test_pred)
print('Decision tree train/test accuracies %.3f/%.3f' % (tree_train,tree_test))
# Decision tree train/test accuracies 0.845/0.854
​
# AdaBoost性能评估
ada = ada.fit(X_train,y_train)
y_train_pred = ada.predict(X_train)
y_test_pred = ada.predict(X_test)
ada_train = accuracy_score(y_train,y_train_pred)
ada_test = accuracy_score(y_test,y_test_pred)
print('Adaboost train/test accuracies %.3f/%.3f' % (ada_train,ada_test))
# Adaboost train/test accuracies 1/0.875 
总结:AdaBosst预测准确了所有的训练集类标,与单层决策树相比,它在测试机上表现稍微好一些。单决策树对于训练数据过拟合的程度更加严重一些。总之,我们可以发现Adaboost分类器能够些许提高分类器性能,并且与bagging分类器的准确率接近.

5 小结

  • 什么是Boosting 【知道】
    • 随着学习的积累从弱到强
    • 代表算法:Adaboost,GBDT,XGBoost,LightGBM
  • bagging和boosting的区别【知道】
    • 区别一:数据方面
      • Bagging:对数据进行采样训练;
      • Boosting:根据前一轮学习结果调整数据的重要性。
    • 区别二:投票方面
      • Bagging:所有学习器平权投票;
      • Boosting:对学习器进行加权投票。
    • 区别三:学习顺序
      • Bagging的学习是并行的,每个学习器没有依赖关系;
      • Boosting学习是串行,学习有先后顺序。
    • 区别四:主要作用
      • Bagging主要用于提高泛化性能(解决过拟合,也可以说降低方差)
      • Boosting主要用于提高训练精度 (解决欠拟合,也可以说降低偏差)
  • AdaBoost构造过程【知道】
    • 步骤一:初始化训练数据权重相等,训练第一个学习器;
    • 步骤二:AdaBoost反复学习基本分类器;
    • 步骤三:对m个学习器进行加权投票

相关文章:

  • 基于SpringBoot的美妆购物网站系统设计与实现现(源码+SQL脚本+LW+部署讲解等)
  • 国自然面上项目|基于多模态MR影像的胶质母细胞瘤高危区域定位及预后预测研究|基金申请·25-02-28
  • Unity中VFX烟雾特效与场景中的碎片物体重叠时闪烁问题
  • JavaWeb后端基础(3)
  • 学习第八天---链表
  • 【通俗讲解电子电路】——从零开始理解生活中的电路(一)
  • Task :prepareKotlinBuildScriptModel UP-TO-DATE,编译卡在这里不动或报错
  • Skynet入门(一)
  • JavaScript系列02-函数深入理解
  • Android SDK与NDK的区别
  • LeetCode第58题_最后一个单词的长度
  • 进行性核上性麻痹患者的生活护理指南
  • tableau之标靶图、甘特图和瀑布图
  • CI/CD与容器化技术核心知识点的QA
  • SQL 语言基础:日期和时间处理
  • ES怎么查询大于10000条数据
  • 在一台win10专业版设备上使用docker的怪现象
  • 本地部署DeepSeek-R1(Dify发件邮箱、找回密码、空间名称修改)
  • mysql中的的锁
  • 05 英雄C++ STL 编程(下)
  • 姓名域名/长沙网站托管优化
  • 盘州网站建设/湖南seo技术培训
  • 组网方案设计/成都seo网站qq
  • 推荐聊城做网站/搜索引擎优化的核心及内容
  • 企业手机网站/网站seo谷歌
  • 云南建设工程有限公司/科学新概念seo外链平台