Boosting

news2025/5/10 19:40:16

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个学习器进行加权投票

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2308710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【通俗讲解电子电路】——从零开始理解生活中的电路(一)

导言:电子电路为什么重要? ——看不见的“魔法”,如何驱动你的生活? 清晨,当你的手机闹钟响起时,你可能不会想到,是电子电路在精准控制着时间的跳动;当你用微波炉加热早餐时&#…

LeetCode72编辑距离(动态规划)

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: 输入:word1 “horse”, word2 “ros” 输出&#xf…

【K8S】Kubernetes 基本架构、节点类型及运行流程详解(附架构图及流程图)

Kubernetes 架构 k8s 集群 多个 master node 多个 work nodeMaster 节点(主节点):负责集群的管理任务,包括调度容器、维护集群状态、监控集群、管理服务发现等。Worker 节点(工作节点):实际运…

Windows版FFmpeg使用及B站视频下载示例python源码

Windows版FFmpeg使用及B站视频下载示例python源码 FFmpeg介绍和下载 FFmpeg 是一个功能强大、灵活且广泛使用的多媒体处理工具,无论是在专业领域还是日常使用中,都能满足各种多媒体处理需求。FFmpeg 是一个开源项目,遵循 LGPL 或 GPL 许可。…

飞书考勤Excel导入到自己系统

此篇主要用于记录Excel一行中,单条数据的日期拿取,并判断上下班打卡情况。代码可能满足不了大部分需求,目前只够本公司用,如果需要,可以参考。 需要把飞书月度汇总的考勤表导入系统中可以参考下。 下图为需要获取的年…

【leetcode hot 100 560】和为K的子数组

解法一&#xff1a;用左右指针寻找字串&#xff0c;如果和>k&#xff0c;则减少一个数&#xff08;left&#xff09;&#xff1b;如果和<k&#xff0c;则加上一个数&#xff08;right&#xff09;。 class Solution {public int subarraySum(int[] nums, int k) {int nu…

EGO-Planner的无人机视觉选择(yolov5和yolov8)

EGO-Planner的无人机视觉选择&#xff08;yolov5和yolov8&#xff09; 效果 yolov5检测效果 yolov8检测效果 一、YOLOv8 vs YOLOv5&#xff1a;关键差异解析 1. 训练效率&#xff1a;为何YOLOv8更快&#xff1f; 架构轻量化 YOLOv8采用C2f模块&#xff08;Cross Stage Partia…

性能测试分析和调优

步骤 性能调优的步骤 性能调优的步骤&#xff1a; 1.确定问题&#xff1a;根据性能测试的结果来分析确定bug。–测试人员职责 2.分析原因&#xff1a;分析问题产生的原因。----开发人员职责 3.给出解决方案&#xff1a;可以是修改软件配置、增加硬件资源配置、修改代码等----…

阿里云oss文件上传springboot若依java

一、第一步 引入依赖 <!-- 阿里云OSS --> <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId> </dependency> 二、第二步 application.yml #阿里云oss服务配置 aliyun:oss:endpoint: …

使用create_sql_query_chain工具根据自然语言问题生成SQL查询,踩坑版

1. 开启调试模式 from langchain import debugdebug True # 启用调试模式说明&#xff1a; 这里从 langchain 库中导入了一个名为 debug 的变量&#xff08;或模块&#xff09;&#xff0c;然后将它设置为 True。这通常用来启用调试模式&#xff0c;方便开发者在程序运行时看…

无人机自主导航与避障技术!

自主导航的实现 环境感知&#xff1a;通过传感器&#xff08;如摄像头、激光雷达、超声波传感器等&#xff09;获取周围环境信息。 地图构建&#xff1a;利用SLAM&#xff08;同步定位与地图构建&#xff09;技术&#xff0c;实时生成环境地图并确定无人机的位置。 路径规划…

密码学(哈希函数)

4.1 Hash函数与数据完整性 数据完整性&#xff1a; 检测传输消息&#xff08;加密或未加密&#xff09;的修改。 密码学Hash函数&#xff1a; 构建某些数据的简短“指纹”&#xff1b;如果数据被篡改&#xff0c;则该指纹&#xff08;以高概率&#xff09;不再有效。Hash函数…

嵌入式开发工程师笔试面试指南-HR面试常见问题汇总

在嵌入式领域的招聘面试中,HR 通过一系列精心设计的问题,全面考察候选人的综合素质、专业能力以及与岗位的匹配度。以下从多个关键方面汇总了 HR 在嵌入式面试中常见的问题。 ** 一、语言表达方面 请简单介绍一下你自己这是面试开场常见问题,旨在让候选人做一个自我展示,…

Docker 搭建 Gitlab 服务器 (完整详细版)

参考 Docker 搭建 Gitlab 服务器 (完整详细版)_docker gitlab-CSDN博客 Docker 安装 (完整详细版)_docker安装-CSDN博客 Docker 日常命令大全(完整详细版)_docker命令-CSDN博客 1、Gitlab镜像 # 查找Gitlab镜像 docker search gitlab # 拉取Gitlab镜像 docker pull gitlab/g…

MongoDB安全管理

MongoDB如何鉴权 保证数据的安全性是数据库的重大职责之一。与大多数数据库一样&#xff0c;MongoDB内部提供了一套完整的权限防护机制。如下例所示&#xff1a; mongo --host 127.0.0.1 --port 27017 --username someone --password errorpass --authenticationDatabasestor…

架构案例:从初创互联网公司到分布式存储与反应式编程框架的架构设计

文章目录 引言一、初创互联网公司架构演化案例1. 万级日订单级别架构2. 十万级日订单级别架构3. 百万级日订单级别架构 二、分布式存储系统 Doris 架构案例三、反应式编程框架架构案例总结 引言 分布式架构 今天我们将探讨三种不同类型的架构案例&#xff0c;分别探讨 一个初…

神经网络之CNN图像识别(torch api 调用)

1.简介 CNN 是受生物学上感受野机制启发而提出的。它通过卷积操作自动提取数据中的特征&#xff0c;避免了传统机器学习方法中复杂的特征工程过程&#xff0c;能够自动学习到数据中的有效特征&#xff0c;从而进行分类、识别等任务。 2.结构 2.1卷积&#xff1a; 假设你有一…

使用Truffle、Ganache、MetaMask、Vue+Web3完成的一个简单区块链项目

文章目录 概要初始化Truffle项目创建编写合约编译合约配置Ganache修改truffle-config.js文件编写迁移文件部署合约使用Truffle 控制台使用MetaMask和VueWeb3与链交互 概要 使用Truffle、Ganache、MetaMask、VueWeb3完成的一个简单区块链项目。 初始化Truffle项目 安装好truf…

学生管理前端

文章目录 首页student.html查询功能 首页 SpringBoot前端html页面放在static文件夹下&#xff1a;/src/main/resources/static 默认首页为index.html&#xff0c;我们可以用两个超链接或者两个button跳转到对应的页面。这里只是单纯的跳转页面&#xff0c;不需要提交表单等其…

DeepSeek 助力 Vue3 开发:打造丝滑的网格布局(Grid Layout)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…