Python集成学习和随机森林算法

大家好,机器学习模型已经成为多个行业决策过程中的重要组成部分,然而在处理嘈杂或多样化的数据集时,它们往往会遇到困难,这就是集成学习(Ensemble Learning)发挥作用的地方。

本文将揭示集成学习的奥秘,并介绍其强大的随机森林算法,通过本文将全面了解集成学习以及Python中随机森林的工作原理。

集成学习概论

集成学习是一种机器学习方法,它将多个弱模型的预测结果组合在一起,以获得更强的预测结果,集成学习的概念是通过充分利用每个模型的预测能力来减少单个模型的偏差和错误。

为了更好地理解,接下来举一个生活中的例子,假设你看到了一种动物,但不知道它属于哪个物种。因此询问十位专家,然后由他们中的大多数人投票决定,这就是所谓的“硬投票”。

硬投票是指考虑到每个分类器的类别预测,然后根据具有最大投票数的类别将输入进行分类。另一方面,软投票是指考虑每个分类器对每个类别的概率预测,然后根据该类别的平均概率(在分类器概率的平均值上取得)将输入分类到具有最大概率的类别。

集成学习总是用于提高模型性能,包括提高分类准确度和降低回归模型的平均绝对误差。此外,集成学习总能产生更稳定的模型。当模型之间没有相关性时,集成学习的效果最好,因为这样每个模型都可以学习到独特的内容,从而提高整体性能。

集成学习策略

尽管集成学习可以以多种方式应用在很多方面,但在实践中,有三种策略因其易于实施和使用而广受欢迎。这三种策略分别是:

  1. 装袋法(Bagging):Bagging是bootstrap aggregation的缩写,是一种集成学习策略,它使用数据集的随机样本来训练模型。

  2. 堆叠法(Stacking):Stacking是堆叠泛化(stacked generalization)的简称,是一种集成学习策略。在这种策略中,我们训练一个模型,将在数据上训练的多个模型结合起来。

  3. 提升法(Boosting):提升法是一种集成学习技术,重点在于选择被错误分类的数据来训练模型。

接下来深入探讨每种策略,并看看如何使用Python在数据集上训练这些集成模型。

装袋法集成学习

装袋法使用随机样本数据,并使用学习算法和平均值来获取装袋概率,也称为自助聚合,它将多个模型的结果聚合起来得到一个综合的结果。

该方法涉及以下步骤:

  1. 将原始数据集分割成多个子集,并进行替换。

  2. 为每个子集开发基础模型。

  3. 在运行所有预测之前,同时运行所有模型,并将所有预测结果汇总以获得最终预测结果。

Scikit-learn提供了实现BaggingClassifier和BaggingRegressor的能力。BaggingMetaEstimator可以识别原始数据集的随机子集以适应每个基础模型,然后通过投票或平均的方式将各个基础模型的预测结果聚合成最终预测结果,该方法通过随机化构建过程来减少差异。

【Scikit-learn】:https://scikit-learn.org/stable/

接下来本文以一个示例来说明如何使用scikit-learn中的装袋估计器:

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bagging = BaggingClassifier(base_estimator=DecisionTreeClassifier(),n_estimators=10, max_samples=0.5, max_features=0.5)

装袋分类器需要考虑几个参数:

  • base_estimator:装袋方法中使用的基础模型。这里我们使用决策树分类器。

  • n_estimators:装袋方法中将使用的估计器数量。

  • max_samples:每个基础估计器将从训练集中抽取的样本数。

  • max_features:用于训练每个基础估计器的特征数量。

现在,本文将在训练集上拟合该分类器并进行评分。

bagging.fit(X_train, y_train)
bagging.score(X_test,y_test)

对于回归任务,我们也可以做类似的操作,不同之处在于我们将使用回归估计器。

from sklearn.ensemble import BaggingRegressor
bagging = BaggingRegressor(DecisionTreeRegressor())
bagging.fit(X_train, y_train)
model.score(X_test,y_test)

 堆叠集成学习

堆叠是一种将多个估计器组合在一起以减小它们的偏差并产生准确预测的技术。然后将每个估计器的预测结果进行组合,并输入到通过交叉验证训练的最终预测元模型中;堆叠可以应用于分类和回归问题。

图片

堆叠集成学习

堆叠的步骤如下:

  1. 将数据分为训练集和验证集。

  2. 将训练集分为K个折叠。

  3. 在K-1个折叠上训练基础模型,并在第K个折叠上进行预测。

  4. 重复步骤3,直到对每个折叠都有一个预测结果。

  5. 在整个训练集上拟合基础模型。

  6. 使用该模型对测试集进行预测。

  7. 对其他基础模型重复步骤3-6。

  8. 使用测试集的预测结果作为新模型(元模型)的特征。

  9. 使用元模型对测试集进行最终预测。

在下面的示例中,本文首先创建两个基础分类器(RandomForestClassifier和GradientBoostingClassifier)和一个元分类器(LogisticRegression),然后使用K折交叉验证从这些分类器的预测结果(iris数据集上的训练数据)中提取特征用于元分类器(LogisticRegression)的训练。

在使用K折交叉验证将基础分类器在测试数据集上进行预测,并将这些预测结果作为元分类器的输入特征后,再使用这两者的预测结果进行测试集上的预测,并将其准确性与堆叠集成模型进行比较。

# 加载数据集
data = load_iris()
X, y = data.data, data.target

# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 定义基础分类器
base_classifiers = [
   RandomForestClassifier(n_estimators=100, random_state=42),
   GradientBoostingClassifier(n_estimators=100, random_state=42)
]

# 定义元分类器
meta_classifier = LogisticRegression()

# 创建一个数组来保存基础分类器的预测结果
base_classifier_predictions = np.zeros((len(X_train), len(base_classifiers)))

# 使用K折交叉验证进行堆叠
kf = KFold(n_splits=5, shuffle=True, random_state=42)
for train_index, val_index in kf.split(X_train):
   train_fold, val_fold = X_train[train_index], X_train[val_index]
   train_target, val_target = y_train[train_index], y_train[val_index]

   for i, clf in enumerate(base_classifiers):
       cloned_clf = clone(clf)
       cloned_clf.fit(train_fold, train_target)
       base_classifier_predictions[val_index, i] = cloned_clf.predict(val_fold)

# 在基础分类器预测的基础上训练元分类器
meta_classifier.fit(base_classifier_predictions, y_train)

# 使用堆叠集成进行预测
stacked_predictions = np.zeros((len(X_test), len(base_classifiers)))
for i, clf in enumerate(base_classifiers):
   stacked_predictions[:, i] = clf.predict(X_test)

# 使用元分类器进行最终预测
final_predictions = meta_classifier.predict(stacked_predictions)

# 评估堆叠集成的性能
accuracy = accuracy_score(y_test, final_predictions)
print(f"Stacked Ensemble Accuracy: {accuracy:.2f}")

提升集成学习

提升(Boosting)是一种机器学习的集成技术,通过将弱学习器转化为强学习器来减小偏差和方差。这些弱学习器按顺序应用于数据集,首先创建一个初始模型并将其拟合到训练集上。一旦第一个模型的错误被识别出来,就会设计另一个模型来进行修正。

有一些流行的算法和实现方法用于提升集成学习技术,接下来将探讨其中最著名的几种。

  • AdaBoost

AdaBoost是一种有效的集成学习技术,通过按顺序使用弱学习器进行训练。每次迭代都会优先考虑错误的预测结果,同时减小分配给正确预测实例的权重;这种策略性地强调具有挑战性的观察结果,使得AdaBoost随着时间的推移变得越来越准确,其最终的预测结果由弱学习器的多数投票或加权总和决定。

AdaBoost是一种通用的算法,适用于回归和分类任务,但在这里本文更关注它在分类问题上的应用,使用Scikit-learn进行演示。接下来看看如何在下面的示例中将其应用于分类任务:

from sklearn.ensemble import AdaBoostClassifier
model = AdaBoostClassifier(n_estimators=100)
model.fit(X_train, y_train)
model.score(X_test,y_test)

在这个示例中,本文使用了Scikit-learn中的AdaBoostClassifier,并将n_estimators设置为100。默认的学习器是决策树,用户可以进行更改。此外,还可以调整决策树的参数。

  • 极限梯度提升(XGBoost)

极限梯度提升(eXtreme Gradient Boosting),更常被称为XGBoost,是提升集成学习算法中最佳的实现之一,由于其并行计算能力,在单台计算机上运行非常高效,可以通过机器学习社区开发的xgboost软件包来使用XGBoost。

import xgboost as xgb
params = {"objective":"binary:logistic",'colsample_bytree': 0.3,'learning_rate': 0.1,
               'max_depth': 5, 'alpha': 10}
model = xgb.XGBClassifier(**params)
model.fit(X_train, y_train)
model.fit(X_train, y_train)
model.score(X_test,y_test)
  • LightGBM

LightGBM是另一种基于树学习的梯度提升算法,但与其他基于树的算法不同的是,它使用基于叶子的树生长方式,这使其收敛更快。

图片

树叶的生长/图片来源:LightGBM

在下面的示例中,本文将使用LightGBM解决一个二元分类问题:

import lightgbm as lgb
lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)
params = {'boosting_type': 'gbdt',
             'objective': 'binary',
             'num_leaves': 40,
             'learning_rate': 0.1,
             'feature_fraction': 0.9
             }
gbm = lgb.train(params,
   lgb_train,
   num_boost_round=200,
   valid_sets=[lgb_train, lgb_eval],
   valid_names=['train','valid'],
  )

综上所述,集成学习和随机森林是强大的机器学习模型,机器学习从业者和数据科学家经常使用它们。本文中介绍了提升集成学习的基本原理、应用场景,并介绍了其中最受欢迎的算法及其在Python中的使用方法。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rust开发——使用rust实现Redis中hset

一、Redis中hset HSET 是 Redis 中用于在哈希数据结构中设置指定字段的值的命令。哈希是一种类似于字典或映射的数据结构,它存储了键值对的集合,其中每个键都包含多个字段和与这些字段相关联的值。 哈希表在 Redis 中以键值对形式存储,并通…

【libGDX】ApplicationAdapter生命周期

1 前言 libGDX 中,用户自定义的渲染窗口需要继承 ApplicationAdapter 类,ApplicationAdapter 实现了 ApplicationListener 接口,但实现的方法都是空方法,方法释义如下。 public interface ApplicationListener {// 应用首次创建时…

java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

ArmV8常用汇编指令2

接上文,我们来分析一些具体指令。 1.加载存储指令 Load/Store可以分为立即数、寄存器等操作,格式如下: 这里Rn和Rt均为4位,原因在于,A32/T32是16个通用寄存器。因此使用4bit刚好可以遍历所有。如果是运行在AArch64&a…

Spring Task使用介绍

文章目录 Spring Task介绍cron表达式入门案例Spring Task使用步骤全注解的方式代码开发测试结果 代码仓库 Spring Task 介绍 Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 定位定时任务框架 作用定时自动执行某段Java…

python爬虫概述及简单实践:获取豆瓣电影排行榜

目录 前言 Python爬虫概述 简单实践 - 获取豆瓣电影排行榜 1. 分析目标网页 2. 获取页面内容 3. 解析页面 4. 数据存储 5. 使用代理IP 总结 前言 Python爬虫是指通过程序自动化地对互联网上的信息进行抓取和分析的一种技术。Python作为一门易于学习且强大的编程语言&…

Ps:锁定图层

使用“图层”面板上的锁定图层 Lock Layer功能可以完全或部分锁定图层以保护其内容。 比如,在完成某个图层后希望它不再被修改(包括不透明度和图层样式等),可将其完全锁定。 如果不想更改图像,但对其摆放位置还在犹豫不…

SpringBoot实现IP地址归属地查询

SpringBoot实现IP地址归属地查询 功能特性 标准化的数据格式 每个 IP 数据段的 region 信息都固定了格式: 国家|区域|省份|城市|ISP,只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,后前的选项全部是 0。…

6.运行mysql容器-理解容器数据卷

运行mysql容器-理解容器数据卷 1.什么是容器数据卷2.如何使用容器数据卷2.1 数据卷挂载命令2.2 容器数据卷的继承2.3 数据卷的读写权限2.4 容器数据卷的小实验(加深理解)2.4.1 启动挂载数据卷的centos容器2.4.2 启动后,在宿主机的data目录下会…

demo(三)eurekaribbonhystrix----服务降级熔断

一、介绍: 1、雪崩: 多个微服务之间调用的时候,假如微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的"扇出"。如果扇出的链路上某个微服务的调用响应的时间过长或者不可用&am…

【flutter】使用getx下的GetMaterialApp创建路由和使用时间选择器国际化问题

GetMaterialApp是啥 网上解释说是 MaterialApp Getx properties GetMaterialApp 问题 在使用showDateRangePicker组件的时候, 一直报错 No MaterialLocalizations found 我就愁思是不是GetMaterialApp跟MaterialApp方法不一样的问题,结果不是&#…

【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis

目录 【7】Spring Boot 3 集成组件:缓存组件 spring cache spring data redis什么是缓存抽象声明式注解JSR-107对应SpEL上下文数据 引入依赖cache 支持的缓存类型缓存类型配置NONESIMPLEREDIS自定义配置 CAFFEINE Hazelcast...总结 个人主页: 【⭐️个人主页】 需要…

【第2章 Node.js基础】2.7 Node.js 的流(一) 可读流

🌈 Node.js 的流 🚀什么是流 流不是 Node.js 特有的概念。它们是几十年前在 Unix 操作系统中引入的。 我们可以把流看作这些数据的集合,就像液体一样,我们先把这些液体保存在一个容器里(流的内部缓冲区 BufferList&…

Windows SmartScreen中的漏洞!

🔥另一个流行漏洞是 CVE-2023-36025 - 绕过 Windows SmartScreen 安全功能,该功能是多个微软产品的网络钓鱼和恶意软件保护组件。 👾有多危险 利用该漏洞,攻击者可以绕过 Windows Defender SmartScreen 检查和相关警告。利用该漏…

【Python】Pandas(学习笔记)

一、Pandas概述 1、Pandas介绍 2008年WesMcKinney开发出的库,专门用于数据挖掘的开源python库 以Numpy为基础,借力Numpy模块在计算方面性能高的优势 基于matplotib,能够简便的画图 独特的数据结构 import pandas as pd2、Pandas优势 便…

Dart 3.2 更新,Flutter Web 的未来越来越明朗

参考原文:https://medium.com/dartlang/dart-3-2-c8de8fe1b91f 本次跟随 Flutter 3.16 发布 的 Dart 3.2 ,包含有:私有 final 字段的非空改进、新的 interop 改进、对 DevTools 中的扩展支持、以及对 Web 路线图的更新,包括对 Was…

Unity开发之C#基础-集合(字典)(Dictionary)

前言 Hello 兄弟们 一转眼俩月又过去了(失踪人口回归) 不出意外的是出意外了 失踪了两个月 有点对不起我这为数不多的粉丝们 实不相瞒忙的焦头烂额 也没心情写博客 实在对不住各位 好了长话短说 今天这篇文章是讲解c#当中的新的一种集合的表现&#xff…

ProtocolBuffers(protobuf)详解

目录 前言特点语法定义关键字JSON与Protocol Buffers互相转换gRPC与Protocol Buffers的关系 前言 Protocol Buffers(通常简称为protobuf)是Google公司开发的一种数据描述语言,它能够将结构化数据序列化,可用于数据存储、通信协议…

pip 问题

升级pip命令: python -m pip install --upgrade pippip不能下载pytorch: 这个问题我一直没解决。不知道有哪位大佬可以留言给我。把whl文件下载到本地也没有,pip不会进行本地文件夹搜索。

园区网络项目实战

实验背景 某写字楼备搭建一张网络供楼内企业办公使用。写字楼共6层,目前已有三层投入使用,分别 是一层会客大厅、二层行政部及总经理办公室、三层研发部和市场部。一层设有核心机房,其 他各楼层均有一个小房间放置网络设备。 第一步 询…