机器学习 | 集成学习

        团结就是力量!

        Ensemble Learning

        兼听则明,偏信则暗。

        集成学习既是一种思想也是一类算法,它是建立在其他机器学习的算法之上,研究怎么让不同的算法之间进行协同。

        既可以监督学习,也可以无监督学习。

        集成学习用机器学习的术语来讲,就是采用多个学习器对数据集进行预测,从而提高整体学习器的泛化能力。

        


1、核心思想和原理

        集成学习按照 所使用的单个子模型是不是同一种 分为同质的方法和异质的方法。

        按照 子模型的连接方式 可以分为串行策略、并行策略和串并结合的策略。

        其中并联最常见。

        

并联策略 —— Voting

        少数服从多数。

         

并联策略 —— Bagging

        数据组织方式不同,从总的数据集中抽样组成新的子集。

        所有支路使用同样的算法。

        分类还是使用投票的方式集成,回归任务则是使用平均的方式集成。

        

串行策略 —— Boosting

        训练一系列的弱学习器,弱学习器是指仅比随机猜测好一点点的模型,例如较小的决策树。

        训练的方式使用加权的数据,在训练的早期,对于错分的数据给予较大的权重。

        对于训练好的弱分类器,如果是分类任务则按照权重进行投票,如果是回归任务则进行加权,然后再进行预测。

        最常用的一种优化算法AdaBoosting。

        

混联策略 —— Stacking

        其实是一个二次学习的过程。

        


2、并行策略

2.1、Voting

基于Voting的集成学习分类器代码实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
x, y = make_moons(n_samples=1000,noise=0.4,random_state=20
)
x.shape, y.shape
((1000, 2), (1000,))
plt.scatter(x[:, 0], x[:, 1], c = y, s = 10)
plt.show()

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 0)

手动实现集成学习

from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
clf = [KNeighborsClassifier(n_neighbors=3),LogisticRegression(),GaussianNB()
]
for i in range(len(clf)):clf[i].fit(x_train, y_train)print(clf[i].score(x_test, y_test))
0.832
0.848
0.848
y_pred = np.zeros_like(y_test)
for i in range(len(clf)):y_pred += clf[i].predict(x_test)
y_pred[y_pred < 2] = 0
y_pred[y_pred >= 2] = 1
y_pred
array([0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0,1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0,1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1,0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1,0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1,0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0,0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1,1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1,0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1,0, 0, 1, 0, 1, 1, 0, 1])
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_pred)
0.852

sklearn中的集成学习

from sklearn.ensemble import VotingClassifier
clf = [KNeighborsClassifier(n_neighbors=3),LogisticRegression(),GaussianNB()
]
vclf = VotingClassifier(estimators=[('knn', clf[0]),('lr', clf[1]),('gnb', clf[2])],voting='hard',n_jobs=-1
)
vclf.fit(x_train, y_train)
vclf.score(x_test, y_test)
0.852
vclf = VotingClassifier(estimators=[('knn', clf[0]),('lr', clf[1]),('gnb', clf[2])],voting='soft',n_jobs=-1
)
vclf.fit(x_train, y_train)
vclf.score(x_test, y_test)
0.868

 针对分类问题,硬投票和软投票会导致结果的不同。回归问题不涉及。

        


2.2、Bagging

        针对2.1中的集成学习,发现使用的不行还是不够多,差异不明显。

        解决:

                使用同一种模型。

                随机抽取训练集进行训练。

                单个模型准确率略有影响 ——

                        

数据抽取策略 —— 有放回Bagging  √ 一般使用 ~

                     —— 无放回Pasting

        对于有放回取样:

                

OOB(out-of-bag)

        针对上面出现的问题,有36.8%的样本没被抽到,那么:

        不区分训练、测试集,用没被取到的作为测试集。

代码实现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
x, y = make_moons(n_samples=1000, noise=0.4, random_state=20
)
x.shape, y.shape
((1000, 2), (1000,))
plt.scatter(x[:, 0], x[:, 1], c = y, s = 10)
plt.show()

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 0)

Bagging

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bagging = BaggingClassifier(base_estimator=DecisionTreeClassifier(),n_estimators=100,bootstrap=True,max_samples=500,n_jobs=-1,random_state=20
)
bagging.fit(x_train, y_train)
bagging.score(x_test, y_test)
0.848

OOB

bagging = BaggingClassifier(base_estimator=DecisionTreeClassifier(),n_estimators=100,bootstrap=True,max_samples=500,oob_score=True,n_jobs=-1,random_state=20
)
bagging.fit(x, y)
bagging.oob_score_
0.84

最后再讲一下 参数是特征相关的:

        前面讲的都是数据抽取的内容,本质上是想训练多个不同的模型进行集成

        那么对于高维样本,是不是也可以对特征列进行抽取呢?

bagging = BaggingClassifier(base_estimator=DecisionTreeClassifier(),n_estimators=100,bootstrap=True,max_samples=500,oob_score=True,bootstrap_features=True,########有放回无放回max_features=1, n_jobs=-1,random_state=20
)
bagging.fit(x, y)
bagging.oob_score_
0.78


 2.3、随机森林

        Bagging的拓展变体。

        Bagging+ Base Estimator (Decision Tree

        构建决策树时,提供了更多的随机性,他在节点划分时是在随机的特征子集上寻找最优的划分,并不是在每一个节点的所有特征上寻找最优化分。

        子模型的随机性越强。集成效果越好。

        

代码实现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
x, y = make_moons(n_samples=1000, noise=0.4, random_state=20
)
plt.scatter(x[:, 0], x[:, 1], c = y, s = 10)
plt.show()

Bagging

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifierbagging = BaggingClassifier(base_estimator=DecisionTreeClassifier(),n_estimators=100,bootstrap=True,max_samples=500,oob_score=True,n_jobs=-1,random_state=20
)
bagging.fit(x, y)
bagging.oob_score_
0.84

Random Forest Trees

from sklearn.ensemble import RandomForestClassifierrf_clf = RandomForestClassifier(n_estimators=100,max_samples=500,max_leaf_nodes=16,oob_score=True, n_jobs=-1, random_state=20)
rf_clf.fit(x,y)
rf_clf.oob_score_

提取特征的重要性 feature_importances_

rf_clf.feature_importances_
array([0.45660686, 0.54339314])
from sklearn import datasetsiris = datasets.load_iris()
data_X = iris.data
data_y = iris.target
rf_clf = RandomForestClassifier(n_estimators=100,max_leaf_nodes=16,oob_score=True, n_jobs=-1, random_state=20)
rf_clf.fit(data_X,data_y)rf_clf.feature_importances_
array([0.09674332, 0.02771735, 0.43857879, 0.43696054])
iris.feature_names
['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']
labels = np.array(iris.feature_names)
importances = rf_clf.feature_importances_
indices = np.argsort(importances)[::-1]plt.bar(range(data_X.shape[1]), importances[indices], color='lightblue',align='center')
plt.xticks(range(data_X.shape[1]), labels[indices], rotation=70)plt.xlim([-1,data_X.shape[1]])
plt.tight_layout()
plt.show()


Extra-Trees

        随机森林的一个扩展变体。

        随机森林是在随机选取的特征子集选取最优的特征和阈值上进行节点划分,而Extra-trees使用随机的特征和随机的闯值进行节点划分。

        进一步提高模型随机性,有效抑制过拟合。

        不需额外计算,训练速度更快。

from sklearn.ensemble import ExtraTreesClassifieret_clf = ExtraTreesClassifier(n_estimators=100, max_samples=500,bootstrap=True, oob_score=True,  n_jobs=-1,random_state=20)
et_clf.fit(x,y)
et_clf.oob_score_
0.834


3、串行策略 Boosting

         

        每个子模型在训练过程中更加关注上一个模型中表现不好的样本点,以此来提高模型效果。

3.1、 Adaboost

         

        

代码实现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
x, y = make_moons(n_samples=1000, noise=0.4, random_state=20
)
plt.scatter(x[:, 0], x[:, 1], c = y, s = 10)
plt.show()

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state = 0)

AdaBoost

from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifierada_clf = AdaBoostClassifier(base_estimator=DecisionTreeClassifier(max_leaf_nodes=16), n_estimators=100)
ada_clf.fit(x_train, y_train)

AdaBoostClassifier

AdaBoostClassifier(base_estimator=DecisionTreeClassifier(max_leaf_nodes=16),n_estimators=100)

base_estimator: DecisionTreeClassifier

DecisionTreeClassifier(max_leaf_nodes=16)

DecisionTreeClassifier

DecisionTreeClassifier(max_leaf_nodes=16)
ada_clf.score(x_test, y_test)
0.808


3.2、Gradient Boosting

         

       

from sklearn.ensemble import GradientBoostingClassifiergb_clf = GradientBoostingClassifier(n_estimators=100)
gb_clf.fit(x_train,y_train)

注意:GradientBoostingClassifier 已经指定了基学习器就是决策树。

GradientBoostingClassifier

GradientBoostingClassifier()
gb_clf.score(x_test,y_test)
0.86


4、结合策略 Stacking

        先用第一份数据 训练这三个模型,

        再用第二份数据 经过这三个模型输出之后训练第二级的模型4。

        

        复杂,容易过拟合。

        


5、优缺点及适用条件

Voting方法

        优点

                少数服从多数,简单高效。

                通过模型集成,降低方差,提高鲁棒性。

        缺点

                软投票法(类别概率)与硬投票法(清晰类别标签)结果可能不一致。

                所有子模型对预测贡献均等。

 Bagging方法

        优点

                可以减少误差中的方差项。从而降低模型预测误差。(举例 早读)

        缺点

                增加了时间开销。

                需要模型具备多样性。

                并行训练需要较大计算资源。

随机森林

        优点

                准确率高。

                不容易过拟合,抗噪能力强。

                能够处理高维数据,并且不用做特征选择,既能处理离散数据也能处理连续数据。

                数据集无需归一化,还可以得到变量重要性的排序。容易实现并行化。

        缺点

                噪声较大时容易过拟合

                取值划分较多的属性影响大,在这种数据上产出的权值不可信。

                黑盒模型。

Boosting方法

        优点

                更加巧妙鲁棒。

                减少偏差bias。

        缺点

                容易过拟合。

Adaboost方法

        优点

                二分类或多分类场景。

                灵活、简单,不易过拟合。

                精度高,无需调参。

        缺点

                弱分类器数目不太好设定,可以使用交叉验证。

                数据不平衡分类精度下降。

                训练比较耗时,易受干扰。

Stacking方法

        优点

                效果好、鲁棒性高。

                有可能讲集成的知识迁移。

                有效对抗过拟合。
        缺点

                二次学习更加复杂。

                注意leak情况。
 


参考

Machine-Learning: 《机器学习必修课:经典算法与Python实战》配套代码 - Gitee.com

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

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

相关文章

使用Gensim训练Word2vec模型

1、训练Gensim模型 import gensim # gensim 4.3.2 import jieba import re import warnings import logging warnings.filterwarnings(ignore)with open("dataset/sanguo.txt", r,encodingutf-8)as f: # 读入文本&#xff0c;此处使用的是三国演义&#xff0c;可自…

飞天使-k8s-知识点1-kubernetes架构简述

文章目录 名词功能要点 k8s核心要素CNCF 云原生框架简介k8s组建介绍 名词 CI 持续集成, 自动化构建和测试&#xff1a;通过使用自动化构建工具和自动化测试套件&#xff0c;持续集成可以帮助开发人员自动构建和测试他们的代码。这样可以快速检测到潜在的问题&#xff0c;并及早…

maven仓库导入jar和mvn命令汇总

目录 导入远程仓库 命令结构 命令解释 项目pom 输入执行 本地仓库导入 命令格式 命令解释 Maven命令汇总 mvn 参数 mvn常用命令 web项目相关命令 导入远程仓库 命令结构 mvn deploy:deploy-file -Dfilejar包完整名称 -DgroupIdpom文件中引用的groupId名 -Dartifa…

uniapp-安卓APP开发时使用手机调试

调试 1. 手机打开开发者模式: 华为手机举列-->设置-->关于手机-->版本号&#xff0c;多次连续点击“版本号”&#xff0c;就会提示已打开开发者模式 2. 华为手机举列-->设置-->系统和更新-->开发人员选项-->打开 USB调试&#xff0c;进入调试模式 3. 先…

Next.js 学习笔记(四)——数据获取

数据获取 数据获取、缓存和重新验证 数据获取是任何应用程序的核心部分。本页介绍如何在 React 和 Next.js 中获取、缓存和重新验证数据。 有四种方法可以获取数据&#xff1a; 在服务器上&#xff0c;使用 fetch在服务器上&#xff0c;使用第三方库在客户端上&#xff0c;…

人工智能中不可预测的潜在错误可能是灾难性的——数学解释

一、说明 有没有人研究评估AI的错误产生的后果有多么严重&#xff0c;是否存在AI分险评估机制&#xff1f;更高维度上&#xff0c;人工智能的未来是反乌托邦还是乌托邦&#xff1f;这个问题一直是争论的话题&#xff0c;各大阵营都支持。我相信我们无法准确预测这两种结果。这是…

el-form与el-upload结合上传带附件的表单数据(前端篇)

1.写在之前 本文前端采用Vue element-plus技术栈&#xff0c;前端项目参考yudao-ui-admin-vue3项目与Geeker-Admin项目。 这篇文章是el-form与el-upload结合上传带附件的表单数据&#xff08;后端篇&#xff09;-CSDN博客姐妹篇&#xff0c;后端篇文章主要讲的是后端的实现逻…

ROS学习笔记(七)---参数服务器

ROS学习笔记文章目录 01. ROS学习笔记(一)—Linux安装VScode 02. ROS学习笔记(二)—使用 VScode 开发 ROS 的Python程序&#xff08;简例&#xff09; 03. ROS学习笔记(三)—好用的终端Terminator 04. ROS学习笔记(四)—使用 VScode 启动launch文件运行多个节点 05. ROS学习笔…

vscode颜色主题插件one dark Pro安装

1.点击扩展图标→搜索“one dark Pro”→第一个点击安装 2.安装成功后&#xff0c;不要忘了点击设置颜色主题 3.看下效果&#xff1a;

MySQL数据库:表的约束

目录 一. 空属性null 二. 默认值default 三. 列描述comment 四. 填充零zerofill 五. 主键primary key 六. 自增长auto_increment 七. 唯一键unique 八. 外键foreign key 一. 空属性null 对于表中的数据&#xff0c;如果在进行插入的时候不显示地给定值&#xff0c;那么…

vp与vs联合开发-通过FrameGrabber连接相机

添加控件 1.CogRecordDisplay 控件 用于显示图像 初始化相机对象方法 //启动窗体时 调用初始化相机方法 //封装相机关闭方法 //窗体关闭时 调用相机关闭方法 拍照 设置采图事件 // 保存图像 设置曝光按钮事件 1.可变参数

css实现0.5px宽度/高度显——属性: transform: scale

在大多数设备上&#xff0c;实际上无法直接使用 CSS 来精确地创建 0.5 像素的边框。因为大多数屏幕的最小渲染单位是一个物理像素&#xff0c;所以通常只能以整数像素单位渲染边框。但是&#xff0c;有一些技巧可以模拟出看起来像是 0.5 像素的边框。 这里介绍使用&#xff1a…

云原生系列2-GitLab和Jenkins

1、GitLab类似github&#xff0c;是个私有仓库 1、GitLab安装&#xff0c;至少8G内存4核cpu # 查找Gitlab镜像 docker search gitlab/gitlab-ce # gitlab镜像拉取 docker pull gitlab/gitlab-ce # 查看镜像 docker images # 本机先建3个目录&#xff0c;为了gitlab容器通过挂…

新增工具箱管理功能、重构网站证书管理功能,1Panel开源面板v1.9.0发布

2023年12月18日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.9.0版本。 在这一版本中&#xff0c;1Panel引入了新的工具箱管理功能&#xff0c;包含Swap分区管理、Fail2Ban管理等功能。此外&#xff0c;1Panel针对网站证书管理功能进行了全面重构&…

【数据结构】迷宫问题报告+源码C/C++

之前帮别人写的一个报告&#xff0c;是关于栈的迷宫问题。内容不多&#xff0c;代码在最后。分享给大家&#xff0c;喜欢可以点赞关注。原创无偿分享&#xff0c;勿商用。 迷宫求解 设计目的 仅认识到栈是一种特殊的线性表是远远不够的&#xff0c;本次实习的目的在于使学生…

【Linux基础】3. 文件基本属性

文章目录 【 1. 文件的属主和属组 】【 2. 显示文件的类型、权限 】2.1 文件类型2.2 文件权限 【 3. 更改文件属性 】3.1 chgrp 更改文件属组3.2 chown 更改文件所有者3.3 更改文件权限3.3.1 数字法更改文件权限3.3.2 符号法更改文件权限 【 1. 文件的属主和属组 】 Linux 系统…

Vue的脚手架

脚手架配置 脚手架文档&#xff1a;Vue CLI npm config set registry https://registry.npm.taobao.org vue.config.js配置选项&#xff1a; 配置参考 | Vue CLI ref选项 ref和id类似&#xff0c;给标签打标识。 document.getElementById(btn); this.$ref.btn; 父子组…

Kafka 分级存储在腾讯云的实践与演进

导语 腾讯云消息队列 Kafka 内核负责人鲁仕林为大家带来了《Kafka 分级存储在腾讯云的实践与演进》的精彩分享&#xff0c;从 Kafka 架构遇到的问题与挑战、Kafka 弹性架构方案类比、Kafka 分级存储架构及原理以及腾讯云的落地与实践四个方面详细分享了 Kafka 分级存储在腾讯云…

基于JAVA的海南旅游景点推荐系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

STM32 RTC总结

RTC入侵检测Tamper RTC Tamper功能就是&#xff0c;MCU在Tamper管脚检测到一个指定边缘信号&#xff08;可配置&#xff09;时&#xff0c;就主动清除所有备份寄存器数据的功能。如果需要&#xff0c;可以使能Tamper中断&#xff0c;在每次检测到Tamper信号后执行指定代码。 在…