机器学习(七)——集成学习(个体与集成、Boosting、Bagging、随机森林RF、结合策略、多样性增强、多样性度量、Python源码)
目录
- 关于
- 1 个体与集成
- 2 Boosting
- 3 Bagging与随机森林
- 4 结合策略
- 5 多样性
- X 案例代码
- X.1 分类任务-Adaboost-SVM
- X.1.1 源码
- X.1.2 数据集(鸢尾花数据集)
- X.1.3 模型效果
- X.2 分类任务-随机森林RF
- X.2.1 源码
- X.2.2 数据集(鸢尾花数据集)
- X.2.3 模型效果
关于
- 本文是基于西瓜书(第八章)的学习记录。内容包括个体学习和集成学习,集成学习介绍了Boosting方法、Bagging方法和随机森林。还讲解了集成学习的结合策略、多样性分析等等,文章附Python实现源码。
- 西瓜书电子版:百度网盘分享链接
1 个体与集成
- 集成学习通过构建并结合多个学习器来完成任务,有时也被称为多分类器系统或基于委员会的学习等。
- 集成学习通过结合多个个体学习器来获得比单一学习器更优越的泛化性能。
- 同质集成与异质集成
- 同质集成:集成的是同种类型的个体学习器
- 异质集成:集成的是不同类型的个体学习器
- 基学习器:同质集成中的个体学习器也称“基学习器”,相应的学习算法称为“基学习算法”
- 获得好的集成的关键:个体学习器应“好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太坏,并且要有“多样性”,即学习器间具有差异。事实上,如何产生好而不同的个体学习器是研究集成学习的核心。
- 集成学习方法分类:
- 个体学习器间存在强依赖关系、必须串行生成的序列化方法,代表是Boosting。
- 个体学习器间不存在强依赖关系、可同时生成的并行化方法,代表是Bagging和随机森林。
- 弱学习器
- 弱学习器的性能略优于随机猜测
2 Boosting
- Boosting是一族可以将弱学习器提升为强学习器的算法。这族算法的工作机制类似:
- 从初始训练集训练出一个基学习器
- 根据基学习器的表现对训练样本分布进行调整
- 重复进行直至基学习器数目达到指定值T
- 最终将这T个基学习器进行加权结合
- Boosting算法要求基学习器能对特定的数据分布进行学习
- 重赋权法:在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重
- 重采样法:对无法接受带权样本的基学习算法,可在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得的样本集对基学习器进行训练
3 Bagging与随机森林
-
Bagging和随机森林是并行式集成学习方法,通过从原始训练集中采样产生不同的子集来训练基学习器。
-
为了使基学习器具有明显差异,一种可能的做法是对训练样本进行采样,产生出若干个不同的子集,再从每个数据子集中训练出一个基学习器。但是为了保证基学习器效果不是太差,可以使用相互有交叠的子集。
-
Bagging
- 使用自助采样法(采样后放回袋子,样本可能被重复采集)产生多个训练样本子集
- 每个子集训练出一个基学习器
- 在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法.
- 训练一个Bagging集成与直接使用基学习算法训练一个学习器的复杂度同阶,
- 与标准AdaBoost只适用于二分类任务不同,Bagging能不经修改地用于多分类、回归等任务.
- 自助采样时包外样本的用处:当基学习器是决策树时,可使用包外样本来辅助剪枝,或用于估计决策树中各结点的后验概率以辅助对零训练样本结点的处理;当基学习器是神经网络时,可使用包外样本来辅助早期停止以减小过拟合风险.
-
随机森林
- RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择:在选择最佳划分属性时,先随机选择k个属性构成子集,然后从中找到最佳属性,这里k控制了随机性的引入程度。推荐 k = log 2 d k=\log_2d k=log2d
- 通过样本扰动和属性扰动增加基学习器的多样性
- 随机森林简单、容易实现、计算开销小,令人惊奇的是,它在很多现实任务中展现出强大的性能,被誉为“代表集成学习技术水平的方法”
4 结合策略
集成学习中的结合策略是将多个基学习器的预测结果结合起来以提高整体性能。
-
数值型输出:平均法
- 简单平均法:直接计算所有基学习器预测结果的平均值
- 加权平均法:根据基学习器的权重计算加权平均值
- 加权平均法的权重一般是从训练数据中学习而得,现实任务中的训练样本通常不充分或存在噪声,这将使得学出的权重不完全可靠。加权平均法未必一定优于简单平均法
- 在个体学习器性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法
-
分类型输出:投票法
- 绝对多数投票法:得票过半数的类别作为预测结果,否则拒绝预测,这在可靠性要求较高的学习任务中是一个很好的机制
- 相对多数投票法:得票最多的类别作为预测结果
- 加权投票法:根据基学习器的权重进行投票
- 虽然分类器估计出的类概率值一般都不太准确,但基于类概率进行结合却往往比直接基于类标记进行结合性能更好.
-
学习法:Stacking
- 当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合
- 我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器
- Stacking先从初始数据集训练出初级学习器,然后“生成” 一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记
5 多样性
-
误差分歧分解:个体学习器准确性越高、多样性越大,则集成越好。
- 误差(E):个体学习器误差的加权均值。
- 分歧(A):个体学习器的加权分歧值。
- 集成的泛化误差: E = E ‾ − A ‾ E=\overline{E}-\overline{A} E=E−A,该式明确提示出:个体学习器准确性越高、多样性越大,则集成越好。
-
多样性度量

-
不合度量:
dis = (b+c) / m- 值越大表示多样性越大。
-
相关系数(Correlation Coefficient):
p_ij = (ad - bc) / sqrt((a+b)(a+c)(c+d)(b+d)))- 值为0表示分类器无关,正值表示正相关,负值表示负相关。
-
Q-统计量(Q-Statistic):
Q = (ad - bc) / (ad + bc)- 与相关系数符号相同,但值域更宽。
-
K-统计量(K-Statistic):
K = (P1 - P2) / (1 - P2)- 其中P1是两个分类器取得一致的概率,P2是两个分类器偶然达成一致的概率。
-
-
多样性增强
-
数据样本扰动:
- 通过自助采样等方法从初始数据集中产生不同的数据子集,训练出不同的个体学习器。
- 数据样本扰动法对“不稳定基学习器”效果好
- 不稳定基学习器:对训练样本敏感,如决策树和神经网络。
- 稳定基学习器:线性学习器、支持向量机、朴素贝叶斯、k 近邻学习器
-
输入属性扰动:
- 从初始属性集中抽取出若干个属性子集,基于每个属性子集训练一个基学习器。
- 对包含大量冗余属性的数据,在子空间中训练个体学习器不仅能产生多样性大的个体,还会因属性数的减少而大幅节省时间开销
-
输出表示扰动:
- 对训练样本的类标记稍作变动,如“翻转法”随机改变一些训练样本的标记。
-
算法参数扰动:
- 通过随机设置不同的参数,产生差别较大的个体学习器,如神经网络的隐层数量和神经元数量
-
X 案例代码
X.1 分类任务-Adaboost-SVM
X.1.1 源码
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.svm import SVC
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
import seaborn as sns# 1. 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
print("此时X,y的数据类型为:", type(X), type(y), '\n')# 2. 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("此时X_train,y_train的数据类型为:", type(X_train), type(y_train), '\n')
print("X_train的前10条数据展示:")
print(pd.DataFrame(X_train).head(10).to_string(index=False, justify='left'), '\n')# 3. 构建SVM基分类器并应用AdaBoost算法
base_svc = SVC(kernel='linear', probability=True, random_state=42) # 使用线性核并启用概率预测
model = AdaBoostClassifier(estimator=base_svc, n_estimators=50, random_state=42)
model.fit(X_train, y_train)# 4. 预测测试集上的目标变量
y_pred = model.predict(X_test)# 5. 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)
print("分类报告:")
print(classification_report(y_test, y_pred))# 6. 绘制混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names)
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.title('Confusion Matrix for Iris Dataset (AdaBoost with SVM)')
plt.tight_layout()
plt.show()# 可选:将结果保存到DataFrame中以便进一步分析
results = pd.DataFrame({'Actual': y_test,'Predicted': y_pred
})
print("模型预测结果:")
print(results.head())
X.1.2 数据集(鸢尾花数据集)
-
鸢尾花数据集是机器学习领域中最著名的数据集之一,常被用于分类算法的测试和演示。
-
概览
- 样本数量:150个样本
- 特征数量:4个特征
- 标签种类数量:3个类别,每个类别有50个样本
-
特征描述
- 萼片长度 (sepal length):花萼的长度,单位为厘米。
- 萼片宽度 (sepal width):花萼的宽度,单位为厘米。
- 花瓣长度 (petal length):花瓣的长度,单位为厘米。
- 花瓣宽度 (petal width):花瓣的宽度,单位为厘米。
-
目标变量是鸢尾花的种类,共有三种:
- Iris setosa
- Iris versicolor
- Iris virginica
-
使用
- 可以使用
sklearn.datasets.load_iris()函数来加载这个数据集,并查看其详细信息。
- 可以使用
X.1.3 模型效果


X.2 分类任务-随机森林RF
X.2.1 源码
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
import seaborn as sns# 1. 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
print("此时X,y的数据类型为:", type(X), type(y), '\n')# 2. 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("此时X_train,y_train的数据类型为:", type(X_train), type(y_train), '\n')
print("X_train的前10条数据展示:")
print(pd.DataFrame(X_train).head(10).to_string(index=False, justify='left'), '\n')# 3. 构建并训练随机森林分类模型
model = RandomForestClassifier(n_estimators=100, random_state=42) # 使用100棵树的随机森林
model.fit(X_train, y_train)# 4. 预测测试集上的目标变量
y_pred = model.predict(X_test)# 5. 评估模型性能
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)
print("分类报告:")
print(classification_report(y_test, y_pred))# 6. 绘制混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names)
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.title('Confusion Matrix for Iris Dataset (Random Forest)')
plt.tight_layout()
plt.show()# 可选:将结果保存到DataFrame中以便进一步分析
results = pd.DataFrame({'Actual': y_test,'Predicted': y_pred
})
print("模型预测结果:")
print(results.head())
X.2.2 数据集(鸢尾花数据集)
-
鸢尾花数据集是机器学习领域中最著名的数据集之一,常被用于分类算法的测试和演示。
-
概览
- 样本数量:150个样本
- 特征数量:4个特征
- 标签种类数量:3个类别,每个类别有50个样本
-
特征描述
- 萼片长度 (sepal length):花萼的长度,单位为厘米。
- 萼片宽度 (sepal width):花萼的宽度,单位为厘米。
- 花瓣长度 (petal length):花瓣的长度,单位为厘米。
- 花瓣宽度 (petal width):花瓣的宽度,单位为厘米。
-
目标变量是鸢尾花的种类,共有三种:
- Iris setosa
- Iris versicolor
- Iris virginica
-
使用
- 可以使用
sklearn.datasets.load_iris()函数来加载这个数据集,并查看其详细信息。
- 可以使用
X.2.3 模型效果


相关文章:
机器学习(七)——集成学习(个体与集成、Boosting、Bagging、随机森林RF、结合策略、多样性增强、多样性度量、Python源码)
目录 关于1 个体与集成2 Boosting3 Bagging与随机森林4 结合策略5 多样性X 案例代码X.1 分类任务-Adaboost-SVMX.1.1 源码X.1.2 数据集(鸢尾花数据集)X.1.3 模型效果 X.2 分类任务-随机森林RFX.2.1 源码X.2.2 数据集(鸢尾花数据集)…...
vue跳转传参
path 跳转只能使用 query 传参 ,name 跳转都可以 params :获取来自动态路由的参数 query :获取来自 search 部分的参数...
初识Linux · 共享内存
目录 理解共享内存 Shared memmory code 理解共享内存 前文介绍的管道方式的通信,本文介绍的是进程通信的另外一种方式,即共享内存。但是这种通信方式的特点是只能本地通信,并且不像管道那样有保护机制,这里是没有的。 我们通…...
Illumina测序什么时候会测序到接头序列?
Storage-D: 一个支持实用及个性化 DNA 数据存储的用户友好型平台 iMeta主页:http://www.imeta.science 方法论文 ● 期刊:iMeta(IF 23.7) ● 原文链接DOI: https://doi.org/10.1002/imt2.168 ● 2024年1月21日,中国…...
Element表格show-overflow-tooltip属性
表格默认情况下若内容过多会折行显示,若需要单行显示可以使用show-overflow-tooltip属性,它接受一个Boolean,为true时多余的内容会在 hover 时以 tooltip 的形式显示出来。 <el-table v-loading"loading" :data"list"…...
蓝桥杯竞赛单片机组备赛【经验帖】
本人获奖情况说明 笔者本人曾参加过两次蓝桥杯电子赛,在第十二届蓝桥杯大赛单片机设计与开发组获得省级一等奖和国家级二等奖,在第十五届嵌入式设计开发组获得省级二等奖。如果跟着本帖的流程备赛,只要认真勤奋,拿个省二绝对没问…...
解密复杂系统:理论、模型与案例(3)
第五章:复杂系统的应用案例 复杂系统理论在多个领域中展现出其独特的分析能力和广泛的应用前景。本章将详细探讨复杂系统在生态系统、经济与金融系统、社会网络以及生物系统中的具体应用,通过丰富的案例分析,揭示复杂系统理论在实际问题解决…...
<项目代码>YOLOv8 番茄识别<目标检测>
YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…...
docker安装到D盘
双击安装docker默认是安装在c盘,并且安装时我们没法选择位置,如果我们要安装在其他盘可以通过命令行安装 1、下载docker https://docs.docker.com/desktop/setup/install/windows-install/ Docker Desktop 可以使用 WSL 和 Hyper-V任意一种架构…...
【Java语言】String类
在C语言中字符串用字符可以表示,可在Java中有单独的类来表示字符串(就是String),现在我来介绍介绍String类。 字符串构造 一般字符串都是直接赋值构造的,像这样: 还可以这样构造: 图更能直观的…...
【go从零单排】Directories、Temporary Files and Directories目录和临时目录、临时文件
🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在 Go 语言中,path/filepath 包提供了一组用于处理文件路径的函数&am…...
Diff 算法的误判
起源: for循环的:key的值使用index绑定,当循环列表条目变化更新,导致虚拟 DOM Diff 算法认为原有项被替换,而不是更新。 // vue2写法 错误例子 <template><div><button click"addItem">添加项目<…...
odoo 17 后端路由接口认证自定义
odoo 17 后端路由接口认证自定义 在接口中, 我们都知道有3中常用的认证方式 user 用户级认证public 访问时赋予公共用户none 不做任何用户级处理 一般不做数据库重要数据校验, 仅做访问处理 以上是源码提供的三种方式 接下来我们自定义一个认证方式 首先找到的这认证是在…...
租赁回收系统小程序
1.需求分析:首先,需要明确系统的功能和特点。这包括确定租赁回收的物品类型、用户群体、业务流程等。通过需求分析,可以确保系统能够满足市场和用户的需求。 2.系统设计:在需求分析的基础上,进行系统的整体设计。这包…...
SQL 注入详解:原理、危害与防范措施
文章目录 一、什么是SQL注入?二、SQL注入的工作原理三、SQL注入的危害1. 数据泄露2. 数据篡改3. 拒绝服务4. 权限提升 四、SQL注入的类型1. 基于错误的信息泄露2. 联合查询注入3. 盲注(1). 基于布尔响应的盲注(2). 基于时间延迟的盲注 4. 基于带外的注入 五、防范SQ…...
如何用Java爬虫“采集”商品订单详情的编程旅程
在这个数据驱动的世界里,如果你不是数据,那么你一定是在收集数据。就像蜜蜂采集花粉一样,我们程序员也需要采集数据,以便分析、优化和做出明智的决策。今天,我们就来聊聊如何使用Java编写一个爬虫,这个爬虫…...
《FreeRTOS任务基础知识篇》
FreeRTOS任务基础知识 1. 什么是多任务系统?2. FreeRTOS任务3. 任务状态3.1 运行态3.2 就绪态3.3 阻塞态3.4 挂起态 4. 任务优先级5. 任务的实现6. 任务控制块7. 任务堆栈 FreeRTOS的核心是任务管理,以下介绍FreeRTOS任务的一些基础知识。 1. 什么是多任…...
前端面试笔试(二)
目录 一、数据结构算法等综合篇 1.HTTP/2、ETag有关 二、代码输出篇 1.new URL,url中的hostname,pathname,href 扩展说一下url的组成部分和属性 URL的组成部分 urlInfo 对象的属性 2.一个递归的输出例子 3.数组去重的不普通方法1 4.数…...
基于Python 和 pyecharts 制作招聘数据可视化分析大屏
在本教程中,我们将展示如何使用 Python 和 pyecharts 库,通过对招聘数据的分析,制作一个交互式的招聘数据分析大屏。此大屏将通过不同类型的图表(如柱状图、饼图、词云图等)展示招聘行业、职位要求、薪资分布等信息。 …...
探索光耦:晶体管光耦——智能家居的隐形桥梁,让未来生活更智能
在这个日新月异的科技时代,智能家居正以前所未有的速度融入我们的日常生活,从智能灯光到温控系统,从安防监控到语音助手,每一处细节都透露着科技的温度与智慧。而在这场智能化浪潮中,一个看似不起眼却至关重要的组件—…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
