【机器学习算法】——决策树之集成学习:Bagging、Adaboost、Xgboost、RandomForest、XGBoost

集成学习

**集成学习(Ensemble learning)**是机器学习中近年来的一大热门领域。其中的集成方法是用多种学习方法的组合来获取比原方法更优的结果。
使用于组合的算法是弱学习算法,即分类正确率仅比随机猜测略高的学习算法,但是组合之后的效果仍可能高于强学习算法,即集成之后的算法准确率和效率都很高。

三个臭皮匠,赛过诸葛亮!!!以弱搏强,就是集成学习!
在这里插入图片描述
主要方法包括:

  • Bagging
  • Boosting
  • Stacking

Stacking方法(知识蒸馏)

==Stacking方法(知识蒸馏)==是指训练一个模型用于组合其他各个模型。

  • 先训练多个不同的模型,然后把训练得到的各个模型的输出作为输入来训练一个模型,以得到一个最终的输出。
  • 原理:将多个不同模型的预测结果作为新的特征,输入到一个或多个元模型(meta-learner)中进行训练。
    在这里插入图片描述

装袋法(Bagging)

装袋法(Bagging)又称为Bootstrap Aggregating, 是通过组合多个训练集的分类结果来提升分类效果
原理:对原始数据集进行多次有放回的抽样(bootstrap sampling),生成多个不同的训练数据集。
装袋法由于多次采样,每个样本被选中的概率相同,因此噪声数据的影响下降,所以装袋法太容易受到过拟合的影响。
【[数据挖掘Python] 26 集成学习 1 bagging算法 BaggingClassifier 个人银行贷款数据】

Bagging算法就是用多个弱分类器(CART)对划分的不同数据集进行分类,对于弱分类器的结果进行投票或者加权得到最终的结果。

Bagging对鸢尾花数据集进行分类

鸢尾花数据集是4个类别。

  1. 导入数据集
  2. 对数据集进行划分:· KFold函数进行K折交叉验证
  3. 创建CART决策树:
cart = DecisionTreeClassifier(criterion='gini', max_depth=3)
cart_result = cart.fit(X, Y)# 训练决策树模型
  1. 利用CART模型作为基决策器生产Bagging模型:
    可以设置基决策器的数量n_estimators,但不是越多越好哦!
model = BaggingClassifier(estimator=cart, n_estimators=100, random_state=seed)
result = cross_val_score(model, X, Y, cv=kfold)
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets# 1.获取数据
iris = datasets.load_iris()
X = iris.data
Y = iris.target
seed = 42# 创建K折交叉验证,设置分割数为10,打乱数据,设置随机种子
kfold = KFold(n_splits=10, shuffle=True, random_state=seed)# 2.构建模型
# 创建决cart模型基础模型,设置使用基尼系数作为分裂标准,树的最大深度为3
cart = DecisionTreeClassifier(criterion='gini', max_depth=3)
cart_result = cart.fit(X, Y)# 训练决策树模型result = cross_val_score(cart_result, X, Y, cv=kfold)# 使用交叉验证计算决策树模型的分数
print("CART树结果:", result.mean())
#————————————————————————————————————————————————————————————————————————————————
# 创建bagging分类器,设置基础模型为cart,设置cart分类器数量为100,设置随机种子
model = BaggingClassifier(estimator=cart, n_estimators=100, random_state=seed)
result = cross_val_score(model, X, Y, cv=kfold)
print("装袋法提升后结果:", result.mean())

结果:

CART树结果: 0.9466666666666667
装袋法提升后结果: 0.9600000000000002

提升法:Boosting

原理

提升法(Boosting)与装袋法(Bagging)相比:每次的训练样本均为同一组,并且引入了权重的概念,给每个单独的训练样本都会分配个相同的初始权重。
在这里插入图片描述

  1. 从训练集用初始权重训练出一个弱学习器1

  2. 根据弱学习的学习误差率表现来更新训练样本的权重:
    使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的羽学习器2中得到更多的重视。

  3. 然后基于调整权重后的训练集来训练弱学习器2.,

  4. 如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器

Adaboost(Adaptive Boosting)是一种自适应增强算法,它集成多个弱决策器进行决策。Adaboost解决二分类问题,且二分类的标签为{-1,1}。
注:一定是{-1,1},不能是{0,1}

它的训练过程是通过不断添加新的弱决策器,使损失函数继续下降,直到添加决策器已无效,最终将所有决策器集成一个整体进行决策。

理论上Adaboost适用于多种决策器,但实际中基本都是以决策树作为决策器

个体学习器之间存在强依赖关系、必须串行生成的序列化方法。

  1. 【提高】那些在前一轮被弱分类器【分错】的样本的权值
  2. 【减小】那些在前一轮被弱分类器【分对】的样本的权值
  3. 【加法模型】将弱分类器进行【线性组合】

Adaboost

是Boosting算法中最典型的一个算法!!!
【【五分钟机器学习】Adaboost:前人栽树后人乘凉】

直接上代码:
Adaboost对乳腺癌数据集进行分类(良性、恶心)

from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasetsdataset_all = datasets.load_iris()#获取乳腺癌数据集
X = dataset_all.data
Y = dataset_all.targetseed = 42
kfold = KFold(n_splits=10, shuffle=True,random_state=seed)#10折交叉验证
cart = DecisionTreeClassifier(criterion='gini',max_depth=3)#构建决策树分类器,使用基尼系数(Gini)作为分裂的准则,并且设置树的最大深度为3
dtree = cart.fit(X, Y)#训练
result = cross_val_score(dtree, X, Y, cv=kfold)#交叉验证分数
print("决策树结果:",result.mean())model = AdaBoostClassifier(estimator=cart, n_estimators=100,random_state=seed)#创建AdaBoost分类器,使用决策树作为基学习器,弱学习器数量为100
result = cross_val_score(model, X, Y, cv=kfold)#交叉验证分数
print("提升法改进结果:",result.mean())

决策树结果: 0.92969924812
提升法改进结果: 0.970112781955

随机森林(RandomForest)

原理

随机森林与装袋法采取相同的样本抽取方式。

  • 装袋法中的决策树每次从所有属性中选取一个最优的属性(gini)作为其分支属性,
  • 而随机森林算法每次从所有属性中随机抽取𝑡个属性,然后从这𝑡个属性中选取一个最优的属性作为其分支属性,
  • 这样就使得整个模型的随机性更强,从而使模型的泛化能力更强。
  • 随机森林算法使用的弱分类决策树通常为CART算法。
  • 【【五分钟机器学习】随机森林(RandomForest):看我以弱搏强】

代码实现

随机森林对鸢尾花数据进行分类,输出每个特征数据的重要性。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)#测试级比例是0.3,训练集比例是0.7.
# #训练集的特征X_train和训练集的标签y_train进行训练;测试集的特征X_test和测试集的标签y_test进行预测与评估# 创建随机森林分类器实例
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)#默认基分类器(弱分类器)是CART模型,CART模型数量是100个。
# 训练模型
rf_classifier.fit(X_train, y_train)#用划分的训练集数据(包括X_train, y_train)进行训练
# 预测测试集结果
y_pred = rf_classifier.predict(X_test)#用划分的测试集数据进行测试,但是预测predict只需要X_test(测试集的特征数据),预测结果为测试集的y_pred
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)#计算测试集的预测值y_pred和测试集的标签y_test的准确率accuracy
print(f"模型准确率: {accuracy:.2f}")# 输出特征重要性
feature_importances = rf_classifier.feature_importances_
print("特征重要性:")
for name, importance in zip(iris.feature_names, feature_importances):print(f"{name}: {importance:.4f}")

模型准确率: 100.00%
特征重要性:
sepal length (cm): 0.1081
sepal width (cm): 0.0304
petal length (cm): 0.4400
petal width (cm): 0.4215

Xgboost

GBDT

  • 梯度提升决策树算法是利用梯度下降的思想,使用损失函数的负梯度在当前模型的值,作为提升树中残差的近似值,以此来拟合回归决策树。
  • GBDT中的树都是回归树,不是分类树。
  • GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。
    GBDT

XGBoost

XGBoost
XGBoost可以用于:

  • 分类
  • 回归
  • 异常检测

XGBoost安装:
pip install xgboost -i https://pypi.tuna.tsinghua.edu.cn/simple

XGBRegressor

import xgboost as xgb
import numpy as np
from sklearn.linear_model import LinearRegression
# 数据准备
X = [[1],[2],[3]]
y = [2, 4, 6]
# 构建XGBRegressor模型
model = xgb.XGBRegressor(n_estimators=1)# 训练模型
model.fit(X, y)
# 预测
X_predict = [[4]]  # 修正预测数据的格式y_predict = model.predict(X_predict)
print(f"{X_predict}XGBoost预测y值为: {y_predict}")
#____________________________________________
model1 = LinearRegression()
#继续写线性回归预测X_predict
model1.fit(X,y)
y_predict = model1.predict(X_predict)
print(f"{X_predict}LinearRegression预测y值为: {y_predict}")

[[4]]XGBoost预测y值为: [4.3]
[[4]]LinearRegression预测y值为: [8.]

XGBoost预测误差很大!!!
因为XGBoost 是一个强大的非线性模型,更适合处理复杂的非线性关系。
而这个数据明显是简单的线性模型,更适合用LinearRegression!

XGBClassifier

用XGBoost对UCI蘑菇数据集进行分类:
UCI蘑菇数据集Kaggle下载

  • 类别信息:可食用=e,有毒=p
  • 帽形:钟形=b,圆锥形=c,凸面=x,平面=f,结节=k,凹陷=s
  • 帽表面:纤维=f,凹槽=g,鳞片=y,光滑=s
  • 帽子颜色:棕色=n,浅黄色=b,肉桂色=c,灰色=g,绿色=r,粉红色=p,紫色=u,红色=e,白色=w,黄色=y
    瘀伤:瘀伤=t,否=f
    气味:杏仁=a,八角=l,杂酚油=c,鱼腥味=y,恶臭=f,霉味=m,无=n,辛辣=p,辛辣=s

    在写代码的时候需要将数据集进行编码转化为数字
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import LabelEncoder
import xgboost as xgb
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import AdaBoostClassifier
# 加载数据集
data = pd.read_csv('mushrooms.csv')#相对路径:mushrooms.csv# 对分类数据进行编码:值由字母变成数字
label_encoder = LabelEncoder()
for column in data.columns:data[column] = label_encoder.fit_transform(data[column])print(data.head())# 分割数据集
X = data.drop('class', axis=1)
y = data['class']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化Xgboost模型
model = xgb.XGBClassifier()
# 训练模型
model.fit(X_train, y_train)
# 预测测试集
y_pred = model.predict(X_test)
print(y_pred)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'模型准确率:{accuracy*100}%')#_________________________________________________
# LogisticRegression、AdaBoostClassifier也可以实现二分类哦
# model1 = LogisticRegression()
# model2 = AdaBoostClassifier()

class cap-shape cap-surface … spore-print-color population habitat
0 1 5 2 … 2 3 5
1 0 5 2 … 3 2 1
2 0 0 2 … 3 2 3
3 1 5 3 … 2 3 5
4 0 5 2 … 3 0 1
[5 rows x 23 columns]
[0 1 1 … 1 1 1]
模型准确率:100.0%
Process finished with exit code 0

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java常用 Date 时间格式化、Calender日历、正则表达式的用法

目录 1. SimpleDateFormat 日期格式化类 1.1 Date 类型转 String 1.2 String 类型转 Date 2. Calendar 日历类 3. 正则表达式 3.1 正则表达式的组成部分 3.2 手机号正则表达式 3.3 常用密码校验正则表达式 1. SimpleDateFormat 日期格式化类 SimpleDateFormat 是Java中…

jdk1.8安装及环境配置(最新最详细教学!!!)

jdk1.8安装: 看了网上很多关于jdk1.8的安装,我觉得有时候会让人云里雾里,虽然自己可能配置成功,不过没有一套自己的思路,我结合自己的经验来说一下。 jdk在windows有两种安装方式,一种是解压缩包&#xf…

51c嵌入式~单片机~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信? 下面这个“电平转换”电路,理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途:当两个MCU在不同的工作电压下工作&a…

httpsok-v1.18.0-SSL证书自动续期

🔥httpsok-v1.18.0-SSL证书自动续期 介绍 httpsok 是一个便捷的 HTTPS 证书自动续期工具,基于全新的设计理念,专为 Nginx 、OpenResty、Apache 等服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分…

Dynamics 365 CRM- 后端

Dynamics 365 CRM 后端插件语法示例 public IPluginExecutionContext context null;//上下文 public IOrganizationServiceFactory serviceFactory null;//组织服务工厂对象 public IOrganizationService service null;//Org服务对象//创建执行上下文 context (IPluginExe…

Linux驱动开发(12):中断子系统–按键中断实验

本章我们以按键为例讲解在驱动程序中如何使用中断, 在学习本章之前建议先回顾一下关于中断相关的裸机部分相关章节, 这里主要介绍在驱动中如何使用中断,对于中断的概念及GIC中断控制器相关内容不再进行讲解。 本章配套源码和设备树插件位于“…

Grafana配置告警规则推送企微机器人服务器资源告警

前提 已经部署Grafana,并且dashboard接入数据 大屏编号地址:Node Exporter Full | Grafana Labs 创建企微机器人 备注:群里若有第三方外部人员不能创建 机器人创建完成,记录下来Webhook地址 Grafana配置告警消息模板 {{ define &…

[WiFi] WiFi安全加密WEP Vs WPA Vs WPA2 Vs WPA3整理

WiFi安全标准时间线 WEP(Wired Equivalent Privacy) WEP最早于1997年推出,是为了保护无线网络上的数据通信而设计的。当时,Wi-Fi技术还处于起步阶段,人们开始意识到需要一种安全协议来防止未经授权的访问和窃听。WEP被…

使用Keil V6编译 FreeRTOS CMSIS V2版本 ETH + Lwip 编译报错问题解决方式

网上其他人写的都解决不了,要不用的是CMSIS V1版本,根据他们的方式搞完还是报错,今天花点时间自己搞一下。 不想自己动手?没问题,模版已上传Gitee https://gitee.com/maybe_404/stm32-f4xx_-free-rtos_-lwip_-templa…

群控系统服务端开发模式-应用开发-操作记录功能开发

一、开放路由 在根目录下route文件夹下修改app.php文件,代码如下: // 操作日志Route::get(token/get_list,permission.Token/getList);// 获取操作日志列表Route::post(token/get_all,permission.Token/getAll);// 获取操作日志所有数据Route::post(toke…

大模型闯关学习——L1G6000 OpenCompass 评测书生大模型实践

任务要求: 基础任务: 首先创建开发机 进入开发机: 创建测评所需要的环境 conda create -n opencompass python3.10 conda activate opencompass cd /root git clone -b 0.3.3 https://github.com/open-compass/opencompass cd opencompas…

C# 探险之旅:第三十节 - 类型class(继承Inheritance) —— 当“儿子”继承“老爸”的遗产

嘿,探险家们!欢迎再次踏上我们的C#奇幻旅程。今天,我们要聊一个既有趣又实用的话题——继承(Inheritance)!想象一下,如果你的“儿子”能够继承“老爸”的遗产,那编程世界里的对象们也…

排序算法(2)——快速排序

目录 1. 实现方式 1.1 霍尔法 ​ 1.2 挖坑法 1.3 前后指针法 2. 复杂度分析 3. 快速排序优化 3.1 三数取中 3.2 小区间使用插入排序 3.3 非递归实现 快速排序是英国计算机科学家托尼・霍尔(C. A. R. Hoare)在 1960 年年提出的一种二叉树结构的交…

【python】最新版抖音js逆向拿到数据,非常详细教程(附完整代码)

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

apollo2.0.0本地调试运行

一、下载源码 https://github.com/apolloconfig/apollo/tree/v2.0.0 二、本地环境 jdk 1.8 mysql 5.7 maven 3.6.3 三、IDEA运行源码 IDEA直接Open打开项目即可 需要依次启动configservice、adminservice、portal三个服务 基于apollo-assembly模块的ApolloApplication…

STP(生成树协议)

STP的基本概念 概述 STP是一个用于局域网中消除环路的协议。运行该协议的设备通过彼此交互信息而发现网络中的环路,并对某些接口进行阻塞以消除环路。STP在网络中运行后会持续监控网络的状态,当网络出现拓扑变更时,STP能够感知并且进行自动…

3D 生成重建039-Edify 3D:Nvidia的3D生成大模型

3D 生成重建039-Edify 3D:Nvidia的3D生成大模型 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 文档介绍了Edify 3D,一种为高质量的3D资产生成而设计的高级解决方案。首先在多个视点上合成了所描述对象的RGB和表面法线图像正在使用扩散模型。然后使用多视图…

Maven学习(依赖版本维护、依赖传递、解决Maven依赖冲突的3种方式)

目录 一、Maven的依赖版本维护。 (1)为什么需要依赖版本维护? (2)依赖统一管理的具体操作步骤。 第一步。在pom.xml文件中使用标签定义jar包的版本。 第二步。在的对应jar的中使用"${}"引入上面定义好的版本…

CV(4)--边缘提取和相机模型

前言 仅记录学习过程,有问题欢迎讨论 边缘提取(涉及语义分割): 图象的边缘是指图象局部区域亮度变化显著的部分,也有正负之分,暗到亮为正 求边缘的幅度:sobel,Canny算子 图像分高频分量和低…

鸿蒙项目云捐助第三讲鸿蒙App应用的启动页实现

鸿蒙项目云捐助第三讲鸿蒙App应用的启动页实现 对于移动端的应用,一般启动app的时候,首先显示启动页,启动页中显示出该应用一些介绍内容,通过这个介绍内容可以了解这个应用具体处理的内容。 进入启动后,通过滑动启动…