热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

机器学习基础12.集成学习

一、集成学习1.概念集成学习的思想就是综合考虑多个算法的结果,通过投票机制,少数服从多数,将得票最多的结果设为最终的结果。impor

一、集成学习


1.概念

集成学习的思想就是综合考虑多个算法的结果,通过投票机制,少数服从多数,将得票最多的结果设为最终的结果。

import numpy as np
import matplotlib.pyplot as pltfrom sklearn import datasets
x,y = datasets.make_moons(n_samples=500,noise=0.3,random_state=42)
plt.scatter(x[y==0,0],x[y==0,1])
plt.scatter(x[y==1,0],x[y==1,1])
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=42)
from sklearn.linear_model import LogisticRegression
log= LogisticRegression()
log.fit(x_train,y_train)
log.score(x_test,y_test) #0.864

from sklearn.svm import SVC
svm = SVC()
svm.fit(x_train,y_train)
svm.score(x_test,y_test) #0.888

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(x_train,y_train)
dt.score(x_test,y_test) #0.872

现在对上面的预测值进行投票,如果将所有的预测值进行相加,那么如果对应的元素大于等于2,就说明有2个以上的算法认为该分类属于1,那么可以投票定分类结果为1。

predictlog = log.predict(x_test)
predictsvm = svm.predict(x_test)
predictdt = dt.predict(x_test)
y_predict = np.array((predictdt+predictlog+predictsvm)>=2,dtype='int')
from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_predict) #0.94大于之前三个算法的预测结果

sklearn封装了集成学习的架构。

from sklearn.ensemble import VotingClassifier
voting_clf = VotingClassifier(estimators=[('log',LogisticRegression()),('svm',SVC()),('dt',DecisionTreeClassifier())
],voting='hard')voting_clf.fit(x_train,y_train)
voting_clf.score(x_test,y_test)

最终的结果和之前一致。


2.soft voting

之前的例子中,使用的是hard voting,这个投票机制中,算法的权重都一样,而实际上,不同算法应该区分不同的权重,某个算法的预测准确,就该分配高权重,而某些算法的预测准确度相对较低就该分配较低的权重。这就是soft voting的思想,soft voting要求算法都能够得到一个概率值,也就是说在soft voting中,模型都必须基于概率 ,例如逻辑回归。knn和决策树也可以支持概率运算,在knn中,最后计算属于哪个类别时,其实也是考虑在k个最近样本哪个类别的比重大,而决策树在叶子节点中,样本可能不唯一,也是通过投票机制,确定比重大的那一类为该类别。SVC也能够计算出概率值,但是实现比较复杂,这里不展开,只需要传入参数probability=True。

from sklearn.ensemble import VotingClassifier
voting_clf = VotingClassifier(estimators=[('log',LogisticRegression()),('svm',SVC(probability=True)),('dt',DecisionTreeClassifier(random_state=666))
],voting='soft')voting_clf.fit(x_train,y_train)
voting_clf.score(x_test,y_test)

二、Bagging和Pasting


1.子模型

对于集成学习,在考虑多个模型预测的结果同时,必须要使投票数足够的多,投票越多结果就越置信。所以单单用几个模型得到的投票结果还是不够的,那么如何在有限个模型的情况下,得到成百上千的投票结果?集成学习的方法是用模型产生多个子模型,每个模型之间有所差异,如果子模型没有差异,那么投票的结果就会相同,这其实考虑的还是同一个投票意见。实现的方法是每个子模型传入不一样的样本数据。例如,现在只有一个逻辑回归模型,样本有3000个,可以将样本分成300份,每份10个样本,这样就训练出300个逻辑回归的子模型,而子模型之间又有所差异。这时候,容易理解,由于样本数据量很少,模型将会欠拟合,预测的结果也不够准确。但是在集成学习中,如果每个子模型只有60%的准确率,如果保证超过一半的预测是正确的,这个结果的准确性将会达到99.9%。这个是理论值,目的是为了让读者对集成学习的威力能够有所认识。


对于每个子模型只看样本数据的一部分,而这种实现方式有2种,分别为bagging和pasting。bagging为返回取样,pasting为不放回取样,相比较而言,bagging使用的比较多。

from sklearn.tree import DecisionTreeClassifier #要形成成百上千的子模型,首选决策树,决策树非参数学习更能产生出不一样的子模型
from sklearn.ensemble import BaggingClassifier
bagging = BaggingClassifier(DecisionTreeClassifier(),n_estimators=5000,max_samples=100,bootstrap=True)
bagging.fit(x_train,y_train)
bagging.score(x_test,y_test)

这里只使用决策树模型,样本数据同上。n_estimators指定子模型个数,max_sample指定每次训练传入的样本个数,最后指定是否用boostrap,即是否采用有放回的方式。



2.OOB

OOB即out of bag,在放回取样中,可能导致一部分样本始终未被取到,通过概率统计,大约会有37%的样本从未被使用到,这些样本就是out of bag,这些样本可以作为测试样本,来验证模型。

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
bagging = BaggingClassifier(DecisionTreeClassifier(),n_estimators=5000,max_samples=100,bootstrap=True,oob_score=True)
bagging.fit(x,y)
bagging.oob_score_

依然用上面的数据,在bagging中传入参数oob_score,接着将所有的样本全部放进去,调用oob_score_就可以得到测试分数。


bagging的方式容易并行处理,可以在baggingclassifier中传入参数,n_jobs=-1,将所有的核用于计算。


3.针对特征取样

目前为止,bagging的随机取样是针对样本,在样本特征足够多,例如图像中,可以针对特征进行随机采样,称为random subspaces,既针对样本,又针对特征进行随机采样的方式称为random patches。

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=42)
bagging = BaggingClassifier(DecisionTreeClassifier(),n_estimators=5000,max_samples=100,bootstrap=True,oob_score=True,n_jobs=-1,max_features=1,bootstrap_features=True)
bagging.fit(x,y)
bagging.oob_score_

这里既针对样本,又针对特征进行取样(最大样本数小于实际样本数即可),因为样本只有2个特征,所以效果其实不明显,这里只是为了演示,max_features设置取的特征个数,bootstrap_features设置是否为有放回。


三、随机森林


1.概念

上面代码中生成子模型底层依赖的是决策树,这些随机生成的子决策树构成的整体叫做随机森林。sklearn中封装了随机森林,决策树将在节点上划分,在随机的特征子集上寻找最优划分特征。

from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=500,random_state=666,oob_score=True,n_jobs=-1)
rf.fit(x,y)


2.extra-trees

顾名思义,极其随机,决策树在节点划分上,使用随机的特征和随机得到阈值。这种方式提供额外的随机性,训练速度快,抑制了过拟合,但增大了偏差。

from sklearn.ensemble import ExtraTreesClassifier
rf =ExtraTreesClassifier(n_estimators=500,random_state=666,bootstrap=True,oob_score=True,n_jobs=-1)
rf.fit(x,y)


3.回归问题

决策树可以解决回归问题,因此集成森林也可以。

from sklearn.ensemble import BaggingRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import ExtraTreesRegressor

四、boosting


1.Ada boosting

除了上述的集成学习外,还有另外一种集成学习方式boosting,同样也是集成多个模型,但是每个模型都在尝试增强整体的模型效果。例如在Ada boosting 中,对于未被使用的样本点将会增大其权重,在下次训练中将会优先考虑这些点,如此反复下去,知道训练出足够多的子模型。


from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=42)
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
ada = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2),n_estimators=500)
ada.fit(x_train,y_train)

2.gradient boosting

梯度boosting的思想是训练一个模型m1,该模型产生错误e1,针对e1训练出第二个模型m2,产生错误e2,依次类推,最终预测结果是将所有的模型进行相加。由于每个模型都是上一个模型的修正,因此模型的预测效果将会不断增强。


from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=42)
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.tree import DecisionTreeClassifier
gra= GradientBoostingClassifier(max_depth=2,n_estimators=30)
gra.fit(x_train,y_train)




五、stacking


1.思想

将子模型训练的预测结果再生成一个模型,通过该模型最终预测出一个结果。


stacking先将数据分成2份,其中第一份用于生成底层的模型,第二份用于生成顶层的模型。方法:在生成底层的模型后,将第二份数据输入到生成的模型中,并产生结果,这些结果和第二份数据作为输入再训练出顶层的模型。


stacking还可以继续构建更复杂的结构,这种方式就类似神经网络。



推荐阅读
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
  • 机器学习算法:SVM(支持向量机)
    SVM算法(SupportVectorMachine,支持向量机)的核心思想有2点:1、如果数据线性可分,那么基于最大间隔的方式来确定超平面,以确保全局最优, ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 本文详细介绍了如何使用 Python 进行主成分分析(PCA),包括数据导入、预处理、模型训练和结果可视化等步骤。通过具体的代码示例,帮助读者理解和应用 PCA 技术。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 每年,意甲、德甲、英超和西甲等各大足球联赛的赛程表都是球迷们关注的焦点。本文通过 Python 编程实现了一种生成赛程表的方法,该方法基于蛇形环算法。具体而言,将所有球队排列成两列的环形结构,左侧球队对阵右侧球队,首支队伍固定不动,其余队伍按顺时针方向循环移动,从而确保每场比赛不重复。此算法不仅高效,而且易于实现,为赛程安排提供了可靠的解决方案。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
author-avatar
卜土杠烟2502932477
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有