机器学习(七)——集成学习(个体与集成、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=EA,该式明确提示出:个体学习器准确性越高、多样性越大,则集成越好。
  • 多样性度量
    在这里插入图片描述

    • 不合度量

      • 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):花瓣的宽度,单位为厘米。
  • 目标变量是鸢尾花的种类,共有三种:

    1. Iris setosa
    2. Iris versicolor
    3. 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):花瓣的宽度,单位为厘米。
  • 目标变量是鸢尾花的种类,共有三种:

    1. Iris setosa
    2. Iris versicolor
    3. Iris virginica
  • 使用

    • 可以使用 sklearn.datasets.load_iris() 函数来加载这个数据集,并查看其详细信息。

X.2.3 模型效果

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Matlab轻松烟雾检测

小编经验分享:如何使用Matlab进行烟雾检测 烟雾检测是一项重要的安全技术,它可以帮助我们及时发现火灾风险并采取相应的措施。在这篇文章中,小编将和大家分享如何使用Matlab进行烟雾检测的经验。希望这些经验对大家在实际应用中能够有所帮助…

c语言其实很简单----【数组】

TOC 1.输入10个学生成绩&#xff0c;计算及格人数&#xff0c;平均成绩&#xff0c;总成绩。 #include<stdio.h> int main(){float score[10];int i ,cut;float avar0.0,sum0.0;for(i0;i<10;i)scanf("%f",&score[i]);//输入10个学生的成绩cut0;for(i0…

在 .NET 6.0 中创建用于 CRUD 操作的 Web API

快速概述&#xff1a; 在动态的技术世界中&#xff0c;创建强大的 Web API 已成为开发人员不可或缺的关键技能。这些 API 是促进不同应用程序之间顺畅通信的重要链接&#xff0c;可实现无缝数据检索和操作。本文的重点是在 .NET 6 中为 CRUD 操作创建 Web API。 为了实现这一点…

lua 编译网路核心

下载 Severity Code Description Project File Line Suppression State Details Error LNK1104 cannot open file lua53.lib mime D:\MyWork\lua\luasocket-master\luasocket-master\LINK 1 2> Creating library Release\soc…

SystemC学习(4)— 在VCS中运行SystemC

SystemC学习&#xff08;4&#xff09;— 在VCS中运行SystemC 一、前言 参考&#xff1a;VCS编译verilog&SystemC 二、仅包含SystemC的仿真 源文件使用上一篇&#xff1a;SystemC学习&#xff08;3&#xff09;— APB_SRAM的建模与测试 编写makefile如下所示&#xff…

Qt第三课 ----------布局

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

MySQL本地安装及密码重置常见错误处理

文章目录 一、MySQL下载二、配置环境变量三、MySQL初始化1.初始化MySQL数据库2.安装MySQL服务3.启动MySQL服务 四、密码重置 一、MySQL下载 官网地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.5.html#downloads 下载完成后&#xff0c;直接解压缩到D盘 二、配置…

TBB开启并行编程之旅

本文基于小彭老师TBB课程&#xff0c;并对部分晦涩知识添加了更详细的解释与示例 第0章&#xff1a;从并发到并行 停滞的摩尔定律 你醒啦&#xff1f;免费午餐结束了&#xff01; 摩尔定律具体内容我们就不再提&#xff0c;从上图可以看到晶体管的密度的确仍在指数增长&…

「QT」几何数据类 之 QPointF 浮点型点类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

青藤深度参编的终端安全国家标准正式发布

近日&#xff0c;国家市场监督管理总局、国家标准化管理委员会发布中华人民共和国国家标准公告&#xff0c;由TC260&#xff08;全国网络安全标准化技术委员会&#xff09;归口&#xff0c;公安部第三研究所牵头的GB/T 29240-2024《网络安全技术 终端计算机通用安全技术规范》&…

[极客大挑战 2019]Secret File 1

[极客大挑战 2019]Secret File 1 审题 看到题目应该是一道简单的按照要求找flag的题目 知识点 跟着题目走 解题 一&#xff0c;查看源码 找到网站进入 点开发现 【注意它说没看清吗】 二&#xff0c;使用BP抓包试试 发现新出现了/action.php 抓到后放到Repeater中响应 得…

Day41 | 动态规划 :完全背包应用 完全平方数单词拆分(类比爬楼梯)

Day41 | 动态规划 &#xff1a;完全背包应用 完全平方数&&单词拆分&#xff08;类比爬楼梯&#xff09; 动态规划应该如何学习&#xff1f;-CSDN博客 01背包模板 | 学习总结-CSDN博客 完全背包模板总结-CSDN博客 难点&#xff1a; 代码都不难写&#xff0c;如何想…

ELK-Kibana配置

文章目录 一、什么是Kibana、有什么用&#xff1f;二、Kibana的安装与基本配置1. 下载Kibana安装包2. 解压安装包3. 修改Kibana配置文件4. 添加用户目录权限5. 启动Kibana6. 访问Kibana 三、Kibana的使用Index pattern的配置查看收集到的数据画图 一、什么是Kibana、有什么用&a…

kdump 应该怎么安装 linux-crashdump kdump-tools

sudo apt install linux-crashdump sudo apt install crash sudo apt install kdump-tools 1. 两个工具的关系 linux-crashdump kdump-tools 在 Ubuntu 上安装 kdump 功能&#xff0c;这两个包都是相关的&#xff0c;但有不同的作用. linux-crashdump 是一个元包&#xff08;…

pdf转excel;pdf中表格提取

一、问题描述 在工作中或多或少会遇到&#xff1a;需要将某份pdf中的表格数据提取出来&#xff0c;以便能够“修改使用”数据 可将pdf中的表格提取出来&#xff0c;解决办法还有点复杂 尤其涉及“pdf中表格不是标准的单元格”的时候&#xff0c;提取数据到excel不太容易 比…

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动&#xff0c;日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…

qt配合映美精取图开发

最近开发一个项目&#xff0c;用映美精相机配合halcon做取图开发&#xff0c;由于网上资料小特意写个记录。到映美精官网下载驱动&#xff0c;映美精官网&#xff0c;下载映美精的工具开发包SDK 映美精的SDK下载SDK后找到classlib文件夹 里面就是SDK新建一个qt程序&#xff0c…

springboot yml文件数据源出现警告/报黄/数据库配置警告问题

1、看一下数据源的依赖是不是都引入完整了 2、看一下数据源是否有拼写错误 上图就是数据源拼写错误

手机上用什么方法可以切换ip

手机上用什么方法可以切换IP&#xff1f;在某些特定情境下&#xff0c;用户可能需要切换手机的IP地址&#xff0c;以满足网络安全、隐私保护或绕过地域限制等需求。下面以华为手机为例&#xff0c;将详细介绍手机IP地址切换的几种方法&#xff0c;帮助用户轻松实现这一目标。 一…

python可视化将多张图整合到一起(画布)

这周有点事忙着&#xff0c;没时间重温刚结束的Mathurcup数学建模&#xff0c;这两天也是再看了下&#xff0c;论文还是赶紧挺烂的&#xff0c;但比国赛又有进步&#xff08;说起国赛又不得不抱怨了&#xff0c;基本其余省份都发了&#xff0c;但江西......哎&#xff09;。哎&…