集成学习:融合多个模型

news2024/11/15 21:49:40

集成学习 是一种机器学习范式,它创建一组模型,并将它们的预测结果结合起来,以期望最终模型能够优于单个模型。集成学习的关键在于如何有效地结合不同的模型。 

集成学习算法分为:Bagging,Boosting和Stacking等类型。

  1. Bagging(自举汇聚):通过自助采样从原始训练数据集中创建多个数据集,然后在每个数据集上训练相同的模型,最后将结果结合起来。
  2. Boosting(提升):按顺序训练模型,每个新模型都在前一个模型的误差上进行改进。
  3. Stacking(堆叠):训练多个不同的模型,然后将它们的预测作为新的特征输入到一个或多个最终模型中。

Bagging:并行的弱学习器

Bagging,即Bootstrap Aggregating,是一种简单而有效的集成技术。它通过并行训练多个弱学习器来实现:

  • 原理:Bagging通过对原始数据集进行多次重采样(有放回抽样)来创建不同的训练子集,然后在每个子集上训练一个弱学习器。
  • 分类问题:在分类问题中,Bagging通过投票机制来决定最终的预测类别,即得票最多的类别获胜。
  • 回归问题:在回归问题中,Bagging简单地计算所有弱学习器预测值的平均值作为最终预测。

典例:随机森林是一种典型的Bagging集成方法,它使用多个决策树作为弱学习器,并通过并行训练和投票/平均机制来提高预测的准确性和鲁棒性。

Bagging随机森林

RF 默认采用 CART 作为基学习器,而且它在 Bagging 模型的基础上再进一步,每次训练基学习器时,除对样本随机采样外,对样本的特征也进行随机采样。

由于采用的是 CART ,所以 RF 既可以用来分类,又可以用来回归 RF 用来分类时使用 CART 分类树作为基学习器,最后的投票结果是取票数最多的类别作为最终的预测结果;RF 用来回归时使用 CART 回归树作为基学习器,最后的预测结果是采用所有 CART 回归树的预测值的均值。

怎样获得不同的弱分类器?

  1. 使用不同的训练集:随机森林通过从原始训练集中进行有放回抽样来为每棵决策树创建不同的训练集。这种重采样过程增加了模型的多样性,因为每棵树都是在略微不同的数据集上训练的。

  2. 决策树桩:随机森林中的弱分类器通常是决策树桩(decision stumps),即深度为1的决策树。这些树桩虽然简单,但足以捕捉数据中的局部特征。

  3. 参数多样性:即使使用相同的学习算法,不同的参数设置也能产生不同的模型。随机森林通过调整决策树的参数(如树的最大深度、分裂所需的最小样本数等)来增加模型的多样性。

  4. 特征随机性:在随机森林中,每棵树在分裂节点时不是考虑所有特征,而是随机选择一部分特征。这种方法进一步增加了每棵树的独立性。

  5. 不同表示法:通过使用不同的特征子集或变换,相同的输入对象可以有不同的表示,从而凸显数据的不同特征

随机森林的流程

  1. 初始化:设置森林中树的数量和其他相关参数。

  2. 重采样:对于每棵树,从原始训练集中进行有放回抽样,创建不同的训练数据集。

  3. 训练:在每个训练集上训练一棵决策树,通常每棵树都是一个简单的决策树桩。

  4. 特征选择:在每个决策树的节点分裂过程中,随机选择一部分特征,选择最佳分裂点。

  5. 弱分类器集合:重复步骤2-4,直到获得足够数量的树。

  6. 聚合结果:对于分类问题,通过多数投票的方式决定最终的预测类别;对于回归问题,计算所有树预测结果的平均值。

Code

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 创建一个二分类数据集
X, y = make_classification(n_samples=1000, n_features=20,
                           n_informative=2, n_redundant=10,
                           random_state=42)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化随机森林分类器
# 参数解释:
# n_estimators: 森林中树的数量
# max_depth: 树的最大深度
# min_samples_split: 分割内部节点所需的最小样本数
# min_samples_leaf: 叶节点所需的最小样本数
# random_state: 控制随机性的种子
rf_classifier = RandomForestClassifier(n_estimators=100, max_depth=10,
                                       min_samples_split=2, min_samples_leaf=1,
                                       random_state=42)

# 训练模型
rf_classifier.fit(X_train, y_train)

# 预测测试集
y_pred = rf_classifier.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

# 特征重要性
feature_importances = rf_classifier.feature_importances_
print("Feature importances:", feature_importances)

优点

  1. 高准确性:由于随机森林结合了多个决策树的预测,它通常能够提供比单个决策树更高的准确性。

  2. 防止过拟合:随机森林通过训练多个树并进行投票或平均,减少了模型对训练数据的过度拟合。

  3. 特征重要性评估:随机森林能够评估各个特征对预测结果的重要性,这有助于特征选择和数据理解。

  4. 并行处理:随机森林中的每棵树是独立构建的,可以并行训练,这使得它在处理大规模数据集时非常高效。

Boosting:迭代的弱学习器

Boosting是一种迭代的集成技术,它逐步构建弱学习器,每个学习器都在前一个的基础上进行改进:

  • 原理:Boosting通过调整数据的权重来关注前一轮分类错误的样本,从而使得后续的弱学习器能够专注于难以分类的数据点。
  • 加权机制:在加入新的弱学习器时,通常会根据它们的分类准确率给予不同的权重,以确保模型的性能不断提升。
  • 数据重新加权:每次迭代后,数据会被重新加权,以强化对错误分类数据点的关注。

典例:AdaBoost(Adaptive Boosting)算法是一种流行的Boosting方法,它通过迭代地调整数据权重和弱学习器的权重,有效地提高了分类的准确性。

AdaBoost的运行过程

AdaBoost算法的核心在于其迭代过程,主要涉及以下几个问题:

  1. 如何计算每一次训练集样本的权重?AdaBoost 轮都会使用全部的训练集样本,但每一轮都会改变样本的权重分布,其方法是用本轮得到的基学习器对所有训练样本进行 次预测,得到一个预测误差率 ;下一轮训练中各个训练样本的情况由该训练样本自身、本轮基学习器对该样本的预测值、本轮基学习器对训练样本的整体预测误差率三者共同决定。

  2. 如何训练基模型?实际上, AdaBoost与RF一样,既可以用于分类问题,又可以用于回归问题, 因为它们默认使用的基学习器都是 CART 决策树。所以,只要每一轮将原始样本按新的权重系数重新计算出来后,基学习器的训练与普通的单模型训练过程是完全一致的。

  3. 如何计算基模型的预测误差率?对于分类问题,计算模型的预测误差率可以直接使用 0-1损失函数:对于回归问题,计算基模型的预测误差率可以使用平方损失函数或指数损失函数。

  4. 如何计算各个基学习器的投票权重?各个基学习器的投票权重问是根据每一轮的预测误差率计算得到的,假设通过 轮迭代,我们得到了各个基学习器的投票权重\alpha _k, k = 1,2, ... , K,那么对于结果为 {-1,1}的二分类,最后的投票公式就是:

f(x)=sign\sum_{k=1}^{K}\alpha _k\cdot T_k(x)

          其中T_k(x)是第k个基学习器的预测结果值。

流程图如下:

流程

  1. 初始化样本权重:为训练集中的每个样本分配相同的权重。

  2. 训练基模型:在当前加权的训练集上训练一个弱学习器。

  3. 计算预测误差率:评估基模型在加权训练集上的表现,计算误差率。

  4. 计算基学习器权重:根据基模型的误差率计算其权重,误差率越低,权重越大。

  5. 更新样本权重:根据基模型的表现更新样本权重,错误分类的样本将获得更高的权重。

  6. 迭代训练:重复步骤2-5,直到满足迭代次数或模型性能不再提升。

  7. 组合基模型:将所有基模型按照其权重进行投票或加权平均,得到最终的强分类器。

Code

 使用Python和scikit-learn库实现AdaBoost算法的一个简单例子如下:

from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 创建一个二分类数据集
X, y = make_classification(n_samples=1000, n_features=20,
                           n_informative=2, n_redundant=10,
                           random_state=42)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化AdaBoost分类器
ada_boost = AdaBoostClassifier(n_estimators=50, random_state=42)

# 训练模型
ada_boost.fit(X_train, y_train)

# 预测测试集
y_pred = ada_boost.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

优点

  1. 提高准确性:AdaBoost通过逐步关注难以分类的样本,提高了模型的整体准确性。
  2. 防止过拟合:通过结合多个弱学习器,AdaBoost减少了过拟合的风险。
  3. 易于实现:AdaBoost算法简单,易于实现,并且可以使用不同的弱学习器。
  4. 自适应性:AdaBoost能够适应数据的变化,自动调整基学习器的权重。
  5. 鲁棒性:AdaBoost对噪声和异常值具有较好的鲁棒性。

 

Stacking:堆叠的模型

Stacking是一种将多个模型的预测结果作为新特征输入到一个或多个最终模型中的集成技术:

  • 原理:Stacking首先训练多个不同的基模型,然后将它们的预测结果作为新的特征,用于训练一个或多个元模型(meta-model)。
  • 多模型融合:这种方法可以结合不同模型的优势,通过元模型的非线性能力来提高整体的预测性能。

Stacking算法流程

Stacking是一种层次化的集成方法,它通常分为两个层次:

  1. 基础层(Level 0):在基础层,训练多个不同的模型,这些模型可以是决策树、支持向量机、神经网络等。

  2. 元层(Level 1):元层是一个或多个模型,它们使用基础层模型的预测作为输入来做出最终预测。

流程

  • 步骤 1:将训练数据集分割为多个子集。

  • 步骤 2:在每个子集上训练基础层模型。

  • 步骤 3:使用基础层模型对验证集进行预测。

  • 步骤 4:将这些预测作为特征,训练元层模型。

  • 步骤 5:在测试集上重复步骤3和4,得到最终预测。

Code

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

# 加载数据集
X, y = load_iris(return_X_y=True)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 基础层模型
level_0_models = [
    RandomForestClassifier(n_estimators=50),
    SVC(probability=True),
    GradientBoostingClassifier(n_estimators=50)
]

# 元层模型
meta_model = LogisticRegression()

# Stacking预测
stacked_predictions = np.zeros((X_train.shape[0], len(level_0_models)))

for i, model in enumerate(level_0_models):
    model.fit(X_train, y_train)
    stacked_predictions[:, i] = model.predict_proba(X_train)[:, 1]

# 元层模型训练
meta_model.fit(stacked_predictions, y_train)

# 预测测试集
test_predictions = np.zeros((X_test.shape[0], len(level_0_models)))
for i, model in enumerate(level_0_models):
    test_predictions[:, i] = model.predict_proba(X_test)[:, 1]

# 元层模型预测
final_predictions = meta_model.predict(test_predictions)

# 输出结果
print("Final predictions:", final_predictions)

优点

  1. 提高准确性:通过结合多个模型的预测,Stacking通常能够提高模型的准确性。

  2. 减少过拟合:Stacking通过引入元层模型,有助于减少过拟合的风险。

  3. 灵活性:Stacking允许使用不同类型的基础层和元层模型,提供了高度的灵活性。

  4. 特征学习:元层模型可以从基础层模型的预测中学习更复杂的特征。

  5. 鲁棒性:Stacking通过集成多个模型,提高了对异常值和噪声的鲁棒性。

总结

集成算法的优势

  1. 提高准确性:集成算法通过结合多个模型的预测,通常能够提供比单个模型更高的准确性。
  2. 增强鲁棒性:集成算法减少了模型对异常值和噪声的敏感性,提高了模型的泛化能力。
  3. 减少过拟合:通过多样化的模型组合,集成算法降低了过拟合的风险。

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

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

相关文章

关于k8s集群的存储卷

目录 1.emptyDir存储卷 2.hostPath存储卷 3.nfs共享存储卷 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的…

大神器! 直接显示中英文期刊的等级, 及该期刊在中国顶级大学的认可度!

今天,推荐一款学术神器——easyScholar,别看这个插件小小的,它的功能非常强大。 它可以显示期刊的影响因子、中科院分区、JCR分区等信息! 比如,它可以在知网数据库中显示期刊等级信息。 也能够在万方数据库中显示期刊等…

【Linux WEB】Linux嵌入式WEB服务器(BOA)部署

1. 下载boa源码 进入官网下载http://www.boa.org/news.html,版本为0.94.13 2. 交叉编译boa源码 2.1 解压boa源码压缩包   将下载好的压缩包放入到Ubuntu系统中进行解压 tar -zxvf boa-0.94.13.tar.gz 2.2 生成并配置Makefile文件 (1)将…

交换机常用的贴片网络变压器,滤波器H5084NL / H82409S

华强盛电子导读千兆交换机: 199/2643/0038 在交换机行业中,常用的贴片网络变压器和滤波器型号会根据具体的应用需求、性能指标、成本考量等因素而有所不同。通常,这些器件需要满足网络通信中的高频传输、阻抗匹配、信号隔离、电磁兼容&…

【C++】vector 的模拟实现

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

⌈ 传知代码 ⌋ CNN实现脑电信号的情感识别

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

怎么压缩ppt文件?4个常用的PPT压缩技巧分享!

在当今数字化的工作和学习环境中,PPT已经成为我们表达观点、展示成果的重要工具。然而,有时PPT文件的体积过大,给我们的分享和存储带来了诸多不便,表现在:无端占用宝贵的磁盘空间,接收下载耗费时间长等。 …

KSV1(KSU1)/KSV5(KSU5)-创建分配(分摊)规则/运行分配

将A成本中心费用分摊给B、C两个成本中心: 将B、C两个成本中心建一个成本中心组KSV1-创建分配规则 选择发送方的成本中心,选择接收方的成本中心 给不同成本中心分配比例。 点击保存 点击概览可以看到该条规则,可以在系统中创建多条规则。 K…

优阅达携手 HubSpot 助力出海企业营销、销售和服务自动化

2024 年 6 月 17 - 18 日,GTC 2024 全球流量大会在深圳福田会展中心圆满举办。作为跨境出海行业产业链最全、资源最丰富、规模最大的专业展会之一,本次大会聚集了近 3 万名从业者、超过 200 家海内外优质开发厂商,品牌方、服务商,…

【海贼王航海日志:前端技术探索】CSS你了解多少?(二)

目录 1 -> 字体属性 1.1 -> 设置字体 1.2 -> 字体大小 1.3 -> 字体粗细 1.4 -> 文字样式 2 -> 文本属性 2.1 -> 文本颜色 2.1.1 -> 认识RGB 2.1.2 -> 设置文本颜色 2.2 -> 文本对齐 2.3 -> 文本装饰 2.4 -> 文本缩进 2.5 -&g…

Go开发后端和Vue3开发前端的前后端分离框架中自己手戳一个OA流程审批、工作流引擎给新时代一个漂亮便捷的工作流引擎

前言 在软件项目开发中,我们都会接触到流程审批的需要业务,我们以往用的最多就是如下图这种流程编辑引擎插件: 以上截图中的流程工具是不是大家常见的呀!感觉很丑拿不出手呀!在当前行业内卷及竞争激烈情况下&#xff…

uniapp免费申请苹果证书教程每次7天可用于测试

准备一个苹果账号没有加入过任何组织的 然后下载appuploader下载链接 登录上去切记勾选上未付苹果688 然后点击苹果证书创建p12证书 创建描述文件 uniapp打包自定义基座 这就打包好了可以愉快地开发了,但每次生成只有7天,设备限制3个&#xff0c…

【C++】STL | priority_queue 堆(优先级队列)详解(使用+底层实现)、仿函数的引入、容器适配器的使用

目录 前言 总代码 堆的简介 仿函数 堆的基础框架建立size、empty、top、 向上调整法 and push 向上调整 push 向下调整法 and pop 向下调整法 pop 迭代器区间初始化(构造) 逻辑讲解 为何选择向下建堆? 建堆代码实现 结语 前言…

区块链的搭建和运维4

区块链的搭建和运维4 (1) 搭建基于MySQL分布式存储的区块链 1.构建单群组网络节点 使用开发部署工具构建单群组网络节点,命令如下: bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,85452. 启动 MySQL 并设置账户密码 输入如下命令,…

【mysql 第一篇章】系统和数据库的交互方法

一、宏观的查看系统怎么和数据库交互 在我们刚刚接触系统和数据库的时候不明白其中的原理,只知道系统和数据库是需要交互的。所以我们会理解成上图的形式。 二、MYSQL 驱动 随着我们的学习时间的加长以及对程序的了解,发现链接数据库是需要有别的工具辅…

免费【2024】springboot 高校毕业生信息管理系统的设计与实现

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

安卓Termux系统设备安装内网穿透工具实现远程使用SFTP传输文件

文章目录 前言1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 前言 本教程主要介绍如何在安卓 Termux 系统中使用 SFTP 文件传输,并结合cpolar内网穿透工具生成公网地址,轻松实现无公网IP环境远程传输&#xf…

用 echarts 开发地图、点击展示自定义信息框

1、下载所需地市的json 链接&#xff1a;DataV.GeoAtlas地理小工具系列 在右侧输入需要的名称&#xff0c;然后下载json文件到本地 2、在html 中准备容器&#xff0c;并设置宽高 <div id"mapContent"> <div ref"mapChart" style"width:10…

全网详解LVS的四种工作模式及案例

目录 LVS&#xff08;Linux virual server&#xff09; 一、集群和分布式的简介 二、LVS的运行原理 1、LVS简介 2、LVS 相关术语 3、LVS的集群类型 三、LVS-NAT工作模式 部署NAT工作模式案例&#xff1a; 1、实验环境 2、实验环境说明 3、配置 四、LVS-DR工作模式 …

Http:八股

1、Https加密方式 1.1Https通过 摘要算法保证数据的完整性&#xff0c; 1、服务器将公钥注册到CA&#xff0c; CA用自己的私钥给 服务器的公钥进行数字签名。 2、客户端拿到服务器证书后&#xff0c;用CA的公钥确认数字证书的真实性。 3、获取服务器的公钥&#xff0c;使用它对…