机器学习 | 集成学习

news2024/9/21 0:51:29

        团结就是力量!

        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.coloradmin.cn/o/1325818.html

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

相关文章

Gemini 1.0:Google推出的全新AI模型,改变生成式人工智能领域的游戏规则!

Gemini 1.0&#xff1a;Google推出的全新AI模型&#xff0c;将改变生成式人工智能领域的游戏规则&#xff01; &#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 …

C/C++与MySQL:多线程、大并发和异步操作的实践

C/C与MySQL&#xff1a;多线程、大并发和异步操作的实践 在前面的文章中&#xff0c;我们介绍了如何使用C/C调用MYSQL API进行基本的数据库操作。然而&#xff0c;在实际应用中&#xff0c;特别是面对大量用户请求和高并发场景时&#xff0c;单线程的数据库操作往往显得力不从…

降本不增“笑”的正确打开方式

引言: 在当前行业形势下&#xff0c;降本增效已经是公认的命题&#xff0c;粗放扩张的时代已经过去&#xff0c;接下来是在从业务到技术都需要精细化管理的时代。但在这个命题下&#xff0c;往往未被提及的一点是用户价值。如果为了降本增效&#xff0c;而牺牲了用户价值&…

GeoTrust SSL证书详细介绍

GeoTrust是著名的证书颁发CA机构DigiCert的品牌。GeoTrustSSL产品在Internet上提供从基本域名验证到扩展验证SSL标准支持的最高级验证的安全性。 GeoTrust OV&#xff08;组织验证&#xff09;证书验证域所有权和组织的存在。在颁发证书之前&#xff0c;会检查该组织在公共数据…

Linux学习(2)——基本命令

目录 1、pwd&#xff08;print work directory&#xff09;: 显示当前路径 2、cd&#xff08;change directory&#xff09; &#xff1a;切换目录 2.1路径的分类 2.1.1 绝对路径&#xff1a;以 根&#xff08;/&#xff09; 开头的路径 2.1.2 相对路径&#xff1a;…

CVE-2023-33246 RocketMQ RCE漏洞

一、RocketMQ简介 RocketMQ是一款纯java、分布式、队列模型的开源消息中间件&#xff0c;主要用于在分布式系统中进行异步消息传递&#xff0c;支持事务消息、顺序消息、批量消息、定时消息、消息回溯等功能。 RocketMQ有四个核心组成部分&#xff1a; NameServer&#xff1…

【UML】第8篇 用例图(3/3)

目录 一、用例的关系 1.1 泛化&#xff08;Generalization&#xff09;关系 1.2 包含&#xff08;include&#xff09;关系 1.3 扩展关系 二、用例表示例 不是非要把电影改成连续剧&#xff0c;给大家播&#xff0c;确实是时间和精力有限。 用例图&#xff0c;虽然简单&…

【Python/网络安全】 Git漏洞之Githack工具基本安装及使用详析

[Python/网络安全] Git漏洞之Githack工具基本安装及使用详析 前言安装步骤工具使用实战总结 前言 Git是一个非常流行的开源分布式版本控制系统&#xff0c;它被广泛用于协同开发和代码管理。许多网站和应用程序都使用Git作为其代码管理系统&#xff0c;并将其部署到生产环境中…

Stable-diffusion-webui本地部署和简要介绍

Stable Diffusion 是一款基于人工智能技术开发的绘画软件&#xff0c;它可以帮助艺术家和设计师快速创建高品质的数字艺术作品。是2022年发布的深度学习文本到图像生成模型。它主要用于根据文本的描述产生详细图像&#xff0c;同时也可以应用于其他任务&#xff0c;如内补绘制、…

WPF Halcon机器视觉和运动控制软件通用框架,插件式开发,开箱即用 仅供学习!

点我下载&#xff0c;仅供个人学习使用 参考easyvision开发&#xff0c;集成几十个软件算子此版本以添加ui设计器。具体功能如上所示&#xff0c;可以自定义变量&#xff0c;写c#脚本&#xff0c;自定义流程&#xff0c;包含了halcon脚本和封装的算子&#xff0c;可自定义ui&a…

交叉熵损失(Cross-Entropy loss)

在处理机器学习或深度学习问题时&#xff0c;损失/成本函数用于在训练期间优化模型。目标几乎总是最小化损失函数。损失越低&#xff0c;模型越好。交叉熵损失是最重要的成本函数。它用于优化分类。对交叉熵的理解取决于对 Softmax 激活函数的理解。 一、softmax激活函数 激活…

手机上怎么合成gif?手机图片合成gif分享

手机上的功能越来越丰富&#xff0c;很多电脑上能制作的东西手机上也能制作。那么当我们想要在手机上制作gif动画的时候要怎么操作呢&#xff1f;非常的简单&#xff0c;使用在线制作动画gif&#xff08;https://www.gif.cn/&#xff09;网站-GIF中文网&#xff0c;手机自带浏览…

分析某款go扫描器之四

一、概述 上文提到实现IP的探测存活以及tcp扫描的实现&#xff0c;这部分来分析实现本机网卡信息获取&#xff0c;以及维护一张mac地址表以及ip扫描端口状态表&#xff0c;同时实现syn扫描功能。 项目来源&#xff1a;https://github.com/XinRoom/go-portScan/blob/main/util…

K8S(十一)—Service详解

目录 Service发布服务&#xff08;服务类型&#xff09;type: ClusterIP选择自己的 IP 地址例子 type: NodePort选择你自己的端口为 type: NodePort 服务自定义 IP 地址配置例子 type: LoadBalancer混合协议类型的负载均衡器禁用负载均衡器节点端口分配设置负载均衡器实现的类别…

互动破千万!冰雪营销两大玩法,小红书数据分析!

2022年冬奥会带火了冰雪运动&#xff0c;到如今“冰雪热”仍在持续。通过千瓜数据&#xff0c;查看小红书平台“冰雪”这一关键词的数据&#xff0c;近30天互动总量超过1300万&#xff0c;官方连续发布的几场活动&#xff0c;皆与冰雪相关&#xff0c;#东北精神上的快乐老家 #追…

js中async和await高级用法

文章目录 一、介绍二、async/await与高阶函数三、控制并发数四、使用async/await优化递归五、异步初始化类实例六、在async函数中使用await链式调用七、结合async/await和事件循环八、使用async/await简化错误处理九、最后 一、介绍 JavaScript的异步编程已经从回调(callback)…

Vue前端设计模式

文章目录 一、什么是设计模式&#xff1f;二、设计几个原则三、常见的设计模式及实际案例3.1、单例模式3.1.1、Element UI3.1.2、Vuex 3.2、工厂模式3.2.1、VNode3.2.2、vue-route 3.3、策略模式3.3.1、表格 formatter3.3.2、表单验证 3.4、代理模式3.4.1、拦截器3.4.2、前端框…

考研小白助力宝典(2)

前言 考研&#xff0c;是一场耗时长久的脑力之战&#xff0c;刻苦勤奋的态度和披荆斩棘的精神外&#xff0c;往往取决于谁抓好了信息利剑&#xff01;合理得当利用好信息平台&#xff0c;就已经快人一步战胜了大部分的竞争对手了&#xff01; 目录 着重学习练习 考研相关简介 …

vscode开发python环境配置

前言 vscode作为一款好用的轻量级代码编辑器&#xff0c;不仅支持代码调试&#xff0c;而且还有丰富的插件库&#xff0c;可以说是免费好用&#xff0c;对于初学者来说用来写写python是再合适不过了。下面就推荐几款个人觉得还不错的插件&#xff0c;希望可以帮助大家更好地写…

visio绘制封闭图形并填充颜色

文章目录 一、绘制扇形二、填充颜色 一、绘制扇形 1.文件->选项->开发工具 2.使用圆形和直线绘制如图所示图形 3.选中该图形&#xff0c;选择开发工具->操作->修剪 4.拖动即为扇形。 二、填充颜色 选择开发工具-操作选项&#xff0c;并分别依次点击组合-连接-拆分…