说说集成学习的四种模型

news2024/11/15 4:35:08

集成学习概念

集成学习是机器学习中的一种思想,它通过多个模型的组合形成一个精度更高的模型,参与组合的

模型成为弱学习器(弱学习器)。训练时,使用训练集依次训练出这些弱学习器,对未知的样本进

行预测时,使用这些弱学习器联合进行预测。

集成学习分类

Bagging

特点:

        有放回的抽样(booststrap抽样)产生不同的训练集,从而训练不同的学习器

        通过平权投票、多数表决的方式决定预测结果

        弱学习器可以并行训练

Boosting

特点:

        每一个训练器重点关注前一个训练器不足的地方进行训练

        通过加权投票的方式,得出预测结果

        串行的训练方式

代表模型

Bagging的代表模型:

1.随机森林算法

随机森林是基于 Bagging 思想实现的一种集成学习算法,采用决策树模型作为每一个弱学习器。

        训练: 有放回的产生训练样本

                    随机挑选 n 个特征(n 小于总特征数量)

        预测:平权投票,多数表决输出预测结果

 随机森林API
from sklearn.ensemble import RandomForestClassifier # 分类
from sklearn.ensemble import RandomForestRegressor  # 回归

n_estimators:决策树数量,(default =10)
Criterion:entropy、或者gini, (default= gini)
max_depth:指定树的最大深度,(default=None 表示树会尽可能的生长)
max features="auto”,决策树构建时使用的最大特征数量
bootstrap:是否采用有放回抽样,如果为False 将会使用全部训练样本,(defaut=True)
min_samples_split: 结点分裂所需最小样本数,(defaut=2)
    # 如果节点样本数少于min_samples_split,则不会再进行划分
    # 如果样本量不大,不需要设置这个值.
    # 如果样本量数量级非常大,则推荐增大这个值.
min_samples_leaf:叶子节点的最小样本数,(default=1)
    # 如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝
    # 较小的叶子结点样本数量使模型更容易捕捉训练数据中的噪声.
min_impurity_split: 节点划分最小不纯度
    # 如果某节点的不纯度(基尼系数,均方差)小于这个阈值,则该节点不再生成子节点,并变为叶子节点
    # 一般不推荐改动默认值1e-7。

 2.Adaboost算法

Adaptive Boosting(自适应提升)基于 Boosting思想实现的一种集成学习算法核心思想是通过逐步提

高那些被前一步分类错误的样本的权重来训练一个强分类器。

构建过程

1 初始化数据权重,来训练第1个弱学习器。找最小的错误率计算模型权重,再更新模数据权重。

2 根据更新的数据集权重,来训练第2个弱学习器,再找最小的错误率计算模型权重,再更新模数

据权重。

3 依次重复第2步,训练n个弱学习器。组合起来进行预测。结果大于0为正类、结果小于0为负类

            1.训练第一个学习器                                                        2.调整数据分布

               3.训练第二个学习器                                                4.再次调整数据分布

 

           5.依次训练学习器,调整数据分布                          6.整体过程实现

 

 案例代码演示
# AdaBoost实战葡萄酒数据
import pandas as pd

from sklearn.model_selection import train_test_split # 划分
from sklearn.tree import DecisionTreeClassifier # 指定的决策树
from sklearn.ensemble import AdaBoostClassifier     # 集成学习
from sklearn.metrics import accuracy_score # 评估
#%%
# 加载数据
df_wine = pd.read_csv('wine0501.csv')

df_wine = df_wine[df_wine['Class label']!=1] # 去掉一部分数据做二分类
x = df_wine[['Alcohol','Hue']]
y = df_wine['Class label']
#%%

X_train, X_test, y_train, y_test = train_test_split(x,y,random_state=22)
# 创建一个基学习器 决策树
dct_classifier = DecisionTreeClassifier(max_depth=1)
# 创建AdaBoost的分类器, 指定使用决策树分类器作为基学习器, 100棵树 学习率0.1
ada_classifier = AdaBoostClassifier(base_estimator=dct_classifier,n_estimators=100,learning_rate=0.1)
# 模型训练 评估
ada_classifier.fit(X_train,y_train)
print(ada_classifier.score(X_train, y_train))
print(ada_classifier.score(X_test, y_test))

3.梯度提升树

梯度提升树不再拟合残差,而是利用梯度下降的近似方法,利用损失函数的负梯度作为提升树算法

中的残差近似值。

假设:

        前一轮迭代得到的强学习器是:fi-1(x)

        损失函数为平方损失是:L(y,f​i−1(x))

        本轮迭代的目标是找到一个弱学习器:hi(x)即 fi(X)=fi_1(X)+hi(X)

        让本轮的损失最小化: L(y, fi(x))=L(y, fi−1(x) + hi(x)) 损失函数定义为平方损失L(y, f(x))=1/2(y-

f(X))2  得到L(y, fi(x)) = 1/2(y-(fi-1(X)+hi(X)))²

        则要拟合的负梯度为:

 GBDT 拟合的负梯度就是残差。如果我们的 GBDT 进行的是分类问题,则损失函数变为 logloss,

此时拟合的目标值就是该损失函数的负梯度值

 构建流程

        1 初始化弱学习器(目标值的均值作为预测值)

        2 迭代构建学习器,每一个学习器拟合上一个学习器的负梯度

        3 直到达到指定的学习器个数

        4 当输入未知样本时,将所有弱学习器的输出结果组合起来作为强学习器的输出

案例代码演示
# 导入库
import pandas as pd
from sklearn.model_selection import train_test_split # 划分
from sklearn.ensemble import GradientBoostingClassifier  # 梯度提升树
from sklearn.metrics import classification_report # 分析性能
from sklearn.model_selection import GridSearchCV  # 交叉网格
from sklearn.metrics import accuracy_score  # 评估
# 读取数据
titanic_df = pd.read_csv('titanic/train.csv')
titanic_df
#%%
# 确定x,y
x = titanic_df[['Pclass','Age','Sex']]
y = titanic_df['Survived']
#%%
# 缺失值处理
x['Age'].fillna(x['Age'].mean(), inplace=True)
#%%
# 年龄进行缺失值填充
x['Age'].fillna(x['Age'].mean(),inplace = True)
#%%
# 性别编码
X = pd.get_dummies(x)

#%%
# 划分
X_train, X_test, y_train, y_test = train_test_split(X,y,stratify=y,random_state=66)

# GBDT 梯度提升树   交叉网格
rf_classifier = GradientBoostingClassifier()
# 参数解释: n_estimators弱学习器的数量   max_depth树的最大深度   learning_rate 学习率
parmas = {"n_estimators": [ 50,100,150], "max_depth": [2,3,5, 8, 10], "learning_rate":[0.1,0.3,0.5,0.7,0.9]}
# 交叉网格
gs_estimator = GridSearchCV(rf_classifier,param_grid=parmas,cv=4)
gs_estimator.fit(X_train,y_train)
x_pre = gs_estimator.predict(X_test)
#%%
gs_estimator.best_params_  # 最佳参数组合
#%%
gs_estimator.best_score_ # 最佳分数
#%%
gs_estimator.score(X_test, y_test)
#%%
# 分析性能
print(classification_report(x_pre,y_test, target_names=['丧生', '生还']))

4.XGBoost

极端梯度提升树,集成学习方法的王牌,在数据挖掘比赛中,大部分获胜者用了XGBoost。

XGBoost 基本的原理还是 GBDT, 是对GBDT的优化

xgb 在GBDT的基础上 给损失函数引入了正则

γT 中的 T 表示一棵树的叶子结点数量。

λ||w||^2中的 w 表示叶子结点输出值组成的向量, ||w||^ 向量的模;

λ对该项的调节系数可以避免过拟合

案例代码演示
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

#%%
# 获取数据
data = pd.read_csv('红酒品质分类.csv')
x = data.iloc[:,:-1]  # 特征数据
y = data.iloc[:,-1] -3

#%%
# 划分
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2,stratify=y,random_state=22)
# objective 当前解决的问题使用的目标函数 multi:多分类:softmax 目标函数
# eval_metric 评估指标 merror 多分类的错误率
# n_estimators 基学习器的数量
# # eta 学习率
estimator = xgb.XGBClassifier(n_estimators = 100,eval_metric='merror',eta=0.1,objective='multi:softmax')

estimator.fit(x_train,y_train)
y_pred = estimator.predict(x_test)
print(classification_report(y_test,y_pred))
#%%
# 计算权重
from sklearn.utils import class_weight
class_weights = class_weight.compute_sample_weight(class_weight='balanced',y=y_train)
#%%
# 增加权重 在训练评估一下
estimator.fit(x_train,y_train,sample_weight=class_weights)

y_pred = estimator.predict(x_test)
print(classification_report(y_test,y_pred))
#%%
# 对xgb调参

from sklearn.model_selection import GridSearchCV,StratifiedKFold
# 数据切成5份,保证每一份y的比例 shuffle 乱序
spliter =StratifiedKFold(n_splits=5,shuffle=True)
params = {'n_estimators':[50,100,150],'eta':[0.1,0.3,0.5,0.9],'max_depth':[1,3,5]}
estimator = xgb.XGBClassifier(n_estimators = 100,eval_metric='merror',eta=0.1,objective='multi:softmax')
# 交叉验证
gs_estimator = GridSearchCV(estimator=estimator,param_grid=params,cv=spliter)
gs_estimator.fit(x_train,y_train)


# 当样本分布不均衡的时候,做交又验证和网格搜索,使用StratifiedKFold, GridsearchCV 中v参数 直接传入StratifiedKFold的
# 对象,不要直接传入一个数字,这样能保证训练集,验证集,每个类别的数据都有,并按比例划分
#%%

gs_estimator.best_score_
#%%
gs_estimator.best_params_
#%%
import  joblib
# 模型的保存
joblib.dump(estimator,'xgboost_wine.pth')
#%%
# 模型的加载
estimator = joblib.load('xgboost_wine.pth')
estimator.predict(x_test)

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

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

相关文章

day15 DOM(1)

目录 DOM简介DOM作用能力使用场景 DOM树(文档树)DOM对象获取DOM对象根据CSS选择器来获取DOM元素其它获取DOM元素方法 操作元素内容操作元素属性 DOM简介 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model&a…

KKVIEW远程控制软件介绍

KKVIEW是一款全功能远程控制软件,可以随时随地访问家里或公司设备。KKVIEW,连接自由,KKVIEW旨在帮助用户在远程技术支持、远程办公、远程教育等领域便利的开展工作。 [主要功能] 远程桌面 一键远程显示远程桌面,一键开启远程控制&#xff0…

Linux环境下部署Tomcat(详细图文)

目录 一、下载地址 1.服务器不能联网情况下载 2.服务器能够联网 二、安装 1. Tomcat解压 2. Tomcat目录说明: 3. 重命名解压后的文件名 4. 配置环境变量 5. 修改配置文件 6.启动Tomcat 7.访问Tomcat 8. 停止Tomcat 一、下载地址 1.服务器不能联网情况下…

软考十大管理领域49个过程开展频次总结

1、仅开展一次或仅在预定义时点开展的项目管理过程 序号 过程 过程组 说明 1 制定项目章程 启动 项目章程尽量在整个项目期间保持不变 2 制订项目管理计划 计划 各种管理(程序性)计划和项目基准尽量在整个项目期间保持不变 3 规划范围管理 除规划沟通管…

读懂比特币—bitcoin代码分析(一)

最近美国 SEC 通过了比特币的 ETF申请,比特币究竟是个什么东西,从技术上来说,bitcoin 是一个点对点的电子现金系统,它可以实现分布式的记账,不依赖中心化的账务系统(比如银行,支付宝&#xff09…

线上排查问题全套命令WIP(查看日志、端口占用、磁盘、CPU等)

线上排查问题全套命令WIP(查看日志、端口占用、磁盘、CPU等) 1 查看日志 1.1 less ①less xxx.log:查看日志文件 ②less -N xxx.log:带行号查看日志 ③g:定位到文件顶部 ④G(shiftg键)&am…

AI嵌入式K210项目(15)-安全散列算法加速器

文章目录 前言一、什么是SHA256?实验原理 二、K210的安全散列算法加速器三、实验过程总结 前言 K210内置了丰富的加速器,包括神经网络处理器 (KPU),AES(高级加密加速器),APU 麦克风阵列语音数据加速计算处理器,现场可…

【RabbitMQ】快速入门及基本使用

一、引言 1、、消息队列 Ⅰ、什么是消息队列? 消息队列是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据…

HCIA-HarmonyOS设备开发认证-序

序 最近涉及到HarmonyOS鸿蒙系统设备开发,在网络上已经有很多相关资料,视频教程,我也移植了公司的一个stm32G474板卡,运行LiteOS-m L0系统。 一面看资料一面移植,遇到不少坑,当看到运行的LOGO时&#xff0…

关于ElasticSearch,你应该知道的

一、集群规划优化实践 1、基于目标数据量规划集群 在业务初期,经常被问到的问题,要几个节点的集群,内存、CPU要多大,要不要SSD? 最主要的考虑点是:你的目标存储数据量是多大?可以针对目标数据…

纯命令行在Ubuntu中安装qemu的ubuntu虚拟机,成功备忘

信息总体还算完整,有个别软件更新了名字,所以在这备忘一下 1. 验证kvm是否支持 ________________________________________________________________ $ grep vmx /proc/cpuinfo __________________________________________________________________…

vue.js安装

1:下载 Node.js 官网:https://nodejs.org/en/download 2:安装 node -v npm -v 3:配置 npm config set prefix "F:\node\node_global" npm config set cache "F:\node\node_cache" 按 win 键并输入“编辑系统环境变量”调出系统属性界面&a…

汽车微电机行业研究:预计2029年将达到188亿美元

微电机行业是技术密集型行业,其起源于欧洲的德国、瑞士等国家,发展于日本。随着改革开放,中国作为发展中国家,承接了德国、日本等发达国家的汽车微电机产业转移,技术扩散逐步向我国转移。 微特电机广泛应用于信息处理设…

5G+物联网:连接万物,重塑智慧社区,开启未来生活新纪元,助力智慧社区的革新与发展

一、5G与物联网:技术概述与基础 随着科技的飞速发展,第五代移动通信技术(5G)和物联网(IoT)已经成为当今社会的热门话题。这两项技术作为现代信息社会的核心基础设施,正深刻地改变着人们的生活和…

解决字符串类型转数字类型相加结果异常问题

js字符串类型转换数字类型有七种方法,分别是parseInt(),parseFloat(),Math.floor(),乘以数字(*1),Number(),双波浪号 (~~number),一元运算符(number&#xff…

Linux:多线程

目录 1.线程的概念 1.1线程的理解 1.2进程的理解 1.3线程如何看待进程内部的资源? 1.4进程 VS 线程 2.线程的控制 2.1线程的创建 2.2线程的等待 2.3线程的终止 2.4线程ID 2.5线程的分离 3.线程的互斥与同步 3.1相关概念 3.2互斥锁 3.2.1概念理解 3.2.2操作理解…

x-cmd pkg | aliyun - 阿里云 CLI

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 aliyun 是基于阿里云 OpenAPI 的管理工具,用于与阿里云服务交互,管理阿里云资源。 首次用户 使用 x env use aliyun 即可自动下载并使用 在终端运行 eval "$(curl https://get.x-cmd.com…

NativePHP:开发跨平台原生应用的强大工具

NativePHP 是一种创新性的技术,可以帮助开发者使用 PHP 语言构建原生应用程序。本文将介绍 NativePHP 的概念和优势,探讨其在跨平台应用开发中的应用,并提供一些使用 NativePHP 开发原生应用的最佳实践。 什么是 NativePHP? Nati…

解决系统开发中的跨域问题:CORS、JSONP、Nginx

文章目录 一、概述1.问题场景2.浏览器的同源策略3.解决思路 二、一点准备工作1.创建前端工程12.创建后端工程3.创建前端工程24.跨域问题 三、方法1:使用CORS四、方法2:JSONP五、方法3:Nginx1.安装和启动(windows)2.使用…

多维时序 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积长短期记忆神经网络融合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积长短期记忆神经网络融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积长短期记忆神经网络融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效果…