机器学习 | 集成学习

        团结就是力量!

        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 DecisionTreeClassifier

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

Random Forest Trees

from sklearn.ensemble import RandomForestClassifier

rf_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 datasets

iris = 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 ExtraTreesClassifier

et_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 DecisionTreeClassifier

ada_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 GradientBoostingClassifier

gb_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.mfbz.cn/a/261969.html

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

相关文章

本地运行vue脚手架 从下载node开始到创建vue

vue2node 1.安装node vue2版本我node一般使用的是14版本左右 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f886442c20114e62aef8113425e34ad2.pngnode官网 假如我node版本过低 你就找到控制面板 找到node卸载掉 我一般下载两个版本 安装vue cli vuecl…

element下拉框背景/选中/鼠标移入样式设置

问题在页面内写穿透无效 <style lang"scss" scoped> // 这个有效::v-deep .el-input--mini .el-input__inner {background: transparent;color: #fff;border: 1px solid #093B9E;} </style>直接在标签内写 <style> .el-select-dropdown__list {b…

【uniapp】uniapp中本地存储sqlite数据库保姆级使用教程(附完整代码和注释)

数据库请求接口封装 uniapp中提供了plus.sqlite接口&#xff0c;在这里我们对常用的数据库请求操作进行了二次封装 这里的dbName、dbPath、recordsTable 可以根据你的需求自己命名 module.exports {/** * type {String} 数据库名称*/dbName: salary,/*** 数据库地址* type {…

3842充电器电路图大全

3842充电器电路图&#xff08;一&#xff09; UC3842组成的充电器电路 图1中C1、V1&#xff5e;V4、C2组成滤波整流电路&#xff0c;变压器T为高频变压器&#xff0c;V5、R2、C11组成功率开关管V7的保护电路&#xff0c;NF为供给IC电源的绕组。单端输出IC为UC3842&#xff0c;…

在Linux安装的Docker中开启IPv6

先在Linux中安装docker&#xff0c;然后在docker中开启IPv6。 安装docker 第一步&#xff0c;卸载旧版本docker。 若系统中已安装旧版本docker&#xff0c;则需要卸载旧版本docker以及与旧版本docker相关的依赖项。 命令&#xff1a;yum -y remove docker docker-client do…

Sirius:一款功能强大的通用漏洞扫描工具

关于Sirius Sirius是一款功能强大的通用漏洞扫描工具&#xff0c;该工具可以帮助广大研究人员在大多数场景下识别和验证应用程序中存在的安全漏洞。 现如今&#xff0c;信息安全社区仍然是收集网络安全情报数据最佳且最有利的来源&#xff0c;而且社区本身的表现经常会优于商…

SparkSQL的编程模型(DataFrame和DataSet)

1.2 SparkSQL的编程模型(DataFrame和DataSet) 1.2.1 编程模型简介 主要通过两种方式操作SparkSQL&#xff0c;一种就是SQL&#xff0c;另一种为DataFrame和Dataset。 SQL SQL不用多说&#xff0c;就和Hive操作一样&#xff0c;但是需要清楚一点的时候&#xff0c;SQL操作的是…

C#联合halcon开发,连接相机颜色不对,无法连接相机

相机可以在海康软件MVS中打开&#xff08;颜色正常&#xff09;&#xff0c;但是在C#开发的程式中无法打开&#xff08;彩色相机颜色显示异常&#xff09;。 1.异常处理 1.查看相机和MVS软件是否连接成功&#xff1b; 2.如果成功&#xff0c;连接C#程序&#xff1b; 3.程序连接…

usb端口管理软件有哪些(usb端口管理软件)

USB端口管理软件在当今的计算机使用中扮演着越来越重要的角色。随着USB设备的普及&#xff0c;如U盘、移动硬盘、数码相机等&#xff0c;相应的管理软件也变得越来越受欢迎。 1、USB端口管理软件可以帮助用户更好地管理和控制U盘的使用。 在插入U盘时&#xff0c;软件可以自动…

GEE:基于MCD64A1的GlobFire火灾斑块检测数据集

作者&#xff1a;CSDN _养乐多_ 本文将介绍 Google Earth Engine&#xff08;GEE&#xff09;上存档的 JRC/GWIS/GlobFire/v2/FinalPerimeters 数据集。 文章目录 一、背景介绍1.1 MCD64A1数据集1.2 GlobFire1.3 参考文献1.4 GEE上存档 二、案例代码2.1 查看所有数据ID2.2 可…

Python---TCP 网络应用程序开发流程

1. TCP 网络应用程序开发流程的介绍 TCP 网络应用程序开发分为: TCP 客户端程序开发TCP 服务端程序开发 说明: 客户端程序是指运行在用户设备上的程序 服务端程序是指运行在服务器设备上的程序&#xff0c;专门为客户端提供数据服务。 2. TCP 客户端程序开发流程的介绍 步…

java并发编程三 共享内存的问题和synchronized解决方案

文章目录 共享带来的问题synchronized 解决方案方法上的 synchronized 共享带来的问题 小故事 老王&#xff08;操作系统&#xff09;有一个功能强大的算盘&#xff08;CPU&#xff09;&#xff0c;现在想把它租出去&#xff0c;赚一点外快 小南、小女&#xff08;线程&…

世微 AP5186 3.6-100V 三功能降压恒流LED驱动IC

产品描述 AP5186 是一款集成三功能的开关降压型 LED 恒流驱动器。通过电源的接通与关断可实现 功能之间的切换&#xff1a;100%全亮→25%暗亮→爆闪。 AP5186 内部还集成了 VDD 稳压管&#xff0c;过温保护电路&#xff0c;短路保护电路等&#xff0c;用少量的元器 件即可提供…

Pip:基本命令和使用的指南,实现有效的包管理

目录 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 学习产出&#xff1a; 介绍 Pip 工具&#xff1a;Pip 是 Python 包管理工具&#xff0c;可以帮助用户方便地安装、管理和升级 Python 包&#xff1a; 安装 Pip 工具&#xff1a;学习如何在不同操作系统上…

国产系统-银河麒麟桌面版系统进入root用户

系统版本 :::warning 银河麒麟桌面版操作系统V10 ::: 方式1 :::warning sudo suroot即便设置了密码,这种方式也可以进入 ::: demodemo-pc:~/桌面$ sudo su 输入密码 rootdemo-pc:/home/demo/桌面#方式2 :::warning root用户设置了密码,直接su root进入 ::: root设置密码 …

用模型预测测试数据

Hi, I’m Shendi 2、用模型预测测试数据 在之前已经训练好了一个模型&#xff0c;可以通过 model.save("path") 来保存模型到硬盘&#xff0c;下次直接使用。 这个模型使用的 mnist 数据集训练&#xff0c;这个数据集包含6万训练样本和一万测试样本&#xff0c;28*28…

12 Vue3中使用v-if指令实现条件渲染

概述 v-if指令主要用来实现条件渲染&#xff0c;在实际项目中使用得也非常多。 v-if通常会配合v-else-if、v-else指令一起使用&#xff0c;可以达到多个条件执行一个&#xff0c;两个条件执行一个&#xff0c;满足一个条件执行等多种场景。 下面&#xff0c;我们分别演示这三…

SAP ABAP SCREEN日期字段添加搜索帮助

文章目录 前言 前言 有时我们在自定义屏幕中添加了日期的输入框没有带出F4搜索帮助&#xff0c;如下设置 为字段手动添加一个搜索帮助BU_DATE_CHAR

mybatis-plus-枚举处理

properties文件的配置 //加载处理枚举类型处理的包路径 mybatis-plus.typeEnumsPackagecom.common.base.enums.** yaml配置文件的配置 # MP 配置 mybatis-plus: # type-enums-package: com.baomidou.mybatisplus.samples.enums.enumsconfiguration:# 3.0.8之前版本问题默认将…

DC-磁盘管理

2023年全国网络系统管理赛项真题 模块B-Windows解析 题目 在DC2上安装及配置软RAID 5。在安装好的DC2虚拟机中添加三块10G虚拟磁盘。组成RAID 5,磁盘分区命名为卷标H盘:Raid5。手动测试破坏一块磁盘,做RAID磁盘修复,确认RAID 5配置完毕。配置步骤 关闭虚拟机,添加3块10G磁…
最新文章