机器学习-机器学习之集成学习(ensemble learning)
前面我们说了很多算法模型,当然有的时候我们为了让模型能有更好的泛化效果,我们会采用模型融合的方式来进行对模型的融合。先来讲讲基础:
什么是集成学习?集成学习就是通过多个个体学习器集合起来通过某种策略来达到一个更好的结果。(例如随机森林)什么是个体学习器(我也喜欢叫他基类学习器)?就是一个个体。比如说随机森林里的一颗树叫个体学习器。
集成学习的分类:Voting,Stacking,Bagging。
Voting
voting是一个很常见的策略,就是投票少数服从多数。不仅仅是在今天讲的集成学习里面存在着voting这种策略,其实在大数据领域里面也存在着这样的策略。这个很简单啊,简单解释一下就是(在以前班长选举的时候很多的时候都是两个候选人,然后班主任老师让我们剩下的人来投票,你支持A或者B,然后去统计各个候选人的得票数为多少,然后少数服从多数)。就个就是voting的策略。
同理,我们在机器学习里面也可以使用这样的策略,例如有三个个体学习器,我们对五个数据进行预测。
对于ABC三个个体学习器来讲他们的预测准确率是:80%,60%,60%。
然后我们对ABC三个个体学习器来进行voting操作那么他们得到的预测结果为:
这就是对ABC三个进行voting后的结果,预测结果为100%。(当然我这里100%只是为了证明voting的可行性,大家应该能理解吧。)这不是就是印证了那句老话:三个臭皮匠赛过诸葛亮吗?当然对于80%的个体学习器也不算是臭皮匠,hhhhh。
OK,原理我们都懂了 我们上代码看看实际效果。
from sklearn import datasets
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import VotingClassifier
import warnings
warnings.filterwarnings("ignore")
# 载入数据集
iris = datasets.load_iris()
x_data, y_data = iris.data, iris.target
knn = KNeighborsClassifier(n_neighbors=1)
dt = DecisionTreeClassifier()
lr = LogisticRegression()
sclf = VotingClassifier([('knn', knn), ('dtree', dt), ('lr', lr)])
for clf, label in zip([knn, dt, lr, sclf],['KNN', 'Decision Tree', 'LogisticRegression', 'VotingClassifier']):scores = model_selection.cross_val_score(clf, x_data, y_data, cv=5, scoring='accuracy')print("Accuracy: %0.2f [%s]" % (scores.mean(), label))
最后得到的结果是
[KNN] [Decision Tree] [LogisticRegression] [VotingClassifier]
0.96
0.97
0.97
0.97
其实这不是我想要的结果:
其实我们想一想就单独这三个模型其实不是"臭皮匠"而是"诸葛亮",三个诸葛亮其实他们的结果应该是差不多的。所以对于效果好的个体学习器来讲,投票得到的提升并不是很大。因为他们个体的泛化能力就很好了。
总结一下:对于voting来讲适合于分类任务。比如回归任务就不太好处理了,回归任务最好是用Average。Average(对不同模型得出的结果取平均或加权平均)比如:三个个体学习器对于五支股票价格的预测:
这就完成了一个简单的结果取值平均,而加权平均呢?就是给与每个个体学习器不同的权重。比如A 4/9 B 2/9 C 3/9 。这样的权重。
Stacking
对于Stacking而言,我自己对stacking的认知是:Stacking的策略是把训练样本集分为两部分,一部分用来训练初级学习器,通过初级分类器预测的结果和另外一部分样本一起用来训练次级学习器。由此得到最终的的预测结果。还是来个例子比较好:
还是用莺尾花数据来讲:我们先定义两个初级学习器
knn = KNeighborsClassifier(n_neighbors=1)
dt = DecisionTreeClassifier()
然后去定义一个次级分类器(一般用lr)做回归和一个StackingClassifier
lr = LogisticRegression()
sclf = StackingClassifier(classifiers=[clf1, clf2], meta_classifier=lr)然后开始测试:for clf, label in zip([clf1, clf2, sclf],['KNN', 'Decision Tree', 'StackingClassifier']):scores = model_selection.cross_val_score(clf, x_data, y_data, cv=3, scoring='accuracy')print("Accuracy: %0.2f [%s]" % (scores.mean(), label))
最后得到结果:
Bagging
bagging全称bootstrap aggregating。这种方法,把个体预测器当做黑盒子处理,不进行进一步修改,所以,它的个体预测器可以是任何机器学习算法。它对训练数据集进行随机取样,并使用取样后的数据子集,训练每一个个体预测器。在预测时,每一个预测器都会做出预测,整体结果则是每个预测的平均。(例如随机森林做回归任务)
from sklearn import datasets
from sklearn.ensemble import BaggingClassifier
from sklearn import tree
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
x_data = iris.data[:,:2]
y_data = iris.target
x_train,x_test,y_train,y_test = train_test_split(x_data, y_data,train_size=0.75,random_state=1)
dtree = tree.DecisionTreeClassifier()
dtree.fit(x_train, y_train)
print(dtree.score(x_test,y_test))
bagging_tree = BaggingClassifier(dtree, n_estimators=800)#使用bagging算法训练100组决策树分类器
# 输入数据建立模型
bagging_tree.fit(x_train, y_train)
print(bagging_tree.score(x_test,y_test))
最后得到结果:
0.631578947368421
0.6842105263157895
**
AdaBoost
**
AdaBoost:会因为一个基本分类器被错误分类的样本的权值会增大,而正确分类的样本的权值会减小,并再次用来训练下一个基本分类器。同时,在每一轮迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数才确定最终的强分类器。简单来说,给你随机出题,你做对了的题会降低出现的权重,而你做错的题会增加出现的权重。然后你每次都考试的时候,给你上次做错的题就会多(因为权重大),直到考到95分为止。(对照下上文)
代码:
from sklearn import datasets
x, y =datasets.make_moons(n_samples=500, noise=0.3, random_state=666)
from sklearn.model_selection import train_test_split
# 这里由于不在采用随机抽样,因此需要分割数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.75,random_state=88)
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
# 这里根据决策树的调参方式进行调参。tree = DecisionTreeClassifier()
tree.fit(x_train,y_train)
print(tree.score(x_test,y_test))
ada_clf = AdaBoostClassifier(base_estimator=DecisionTreeClassifier(max_depth=2),n_estimators=500)
ada_clf.fit(x_train, y_train)
print(ada_clf.score(x_test, y_test))
得到的结果是:
0.832
0.88
好了基本上集成学习就差不多了,但是在最后说一句(集成学习不一定能使你的模型的泛化能力马上提高)。
机器学习-机器学习之集成学习(ensemble learning)相关推荐
- 机器学习-集成学习(ensemble learning)
集成学习ensemble learning:本身不是一个单独的机器学习算法,而是通过构建并结合多个机器学习器来完成学习任务. 可以用两句话形容: 1."三个臭皮匠顶个诸葛亮":一堆 ...
- 集成学习(Ensemble Learning)
在机器学习的有监督学习算法中,我们的目标是学习出一个稳定的且在各个方面表现都较好的模型,但实际情况往往不这么理想,有时我们只能得到多个有偏好的模型(弱监督模型,在某些方面表现的比较好).集成学习就是组 ...
- RDKit |基于集成学习(Ensemble learning)预测溶解度
Ensemble learning 集成学习 集成学习(Ensemble learning)是这样一个过程,按照某种算法生成多个模型,如分类器或者称为专家,再将这些模型按照某种方法组合在一起来解决某个 ...
- EL:集成学习(Ensemble Learning)的概念讲解、问题应用、算法分类、关键步骤、代码实现等相关配图详细攻略
EL:集成学习(Ensemble Learning)的概念讲解.算法分类.问题应用.关键步骤.代码实现等相关配图详细攻略 目录 集成学习Ensemble Learning 1.集成学习中弱分类器选择 ...
- 集成学习(ensemble learning)(四)
文章目录 一.GBDT概述 二.GDBT原理 1.负梯度拟合 2.GBDT回归算法 3.GBDT分类算法 (1)二元GBDT分类算法 (2)多元GBDT分类算法 4.GBDT常用损失函数 (1)分类任 ...
- 集成学习(ensemble learning)(一)
文章目录 一.集成学习概述 二.个体学习器 三.Boosting 四.Bagging 五.结合策略 1.平均法 2.投票法 3.学习法 (1)核心图解 a.构建新的训练集 b.构建新的测试集 c.最终 ...
- 集成学习(ensemble learning)干货系列(3)——Boosting方法详解
集成学习(ensemble learning)干货系列(1)--集成学习概述 集成学习(ensemble learning)干货系列(2)--随机森林(Bagging) Boosting基本原理 提升 ...
- 集成学习+ensemble learning
集成学习+ensemble learning Blending is a word introduced by the Netflix winners. It is very close to sta ...
- 集成学习(ensemble learning)(三)
集成学习系列第三篇(Boosting相关方法),传送前两篇: 集成学习(ensemble learning)(一) 集成学习(ensemble learning)(二) 文章目录 一.Boosting ...
- 集成学习(ensemble learning)(二)
文章目录 一.Bagging原理 1.随机采样(BootStrap) 2.弱分类器和结合决策 二.Bagging算法流程 三.随机森林(Random Forest,RF) 1.特点 2.两个" ...
最新文章
- ubuntu deb package install
- zabbix在windows服务器下监控
- 内部结构透视XRAY
- OpenCV4.0+VS2017完整安装配置过程(详细!)
- python字典的常见操作_Python 字典(Dictionary) 基本操作
- 【洛谷4001】 [ICPC-Beijing 2006]狼抓兔子(最小割)
- 二进制全排列 java_排列组合算法真厉害,傻瓜都能学会
- 苹果cmsv10自适应卡通动漫番剧模板
- cd40系列芯片_IC集成电路型号大全及40系列芯片功能大全
- 51nod1185威佐夫博弈+大数乘法模拟
- 15、ADS使用记录之耦合器设计
- 清华天才王垠受邀面试阿里P9,被P10面跪后网上怒发文,惨打325的P10赵海平回应了!...
- DIY 简单又好吃的香果魔芋
- 2021.11.17 关于一元二次方程组求根
- 对数据库中的数据(用户名/密码)加密解密
- 最佳实践 | 用腾讯云AI人像变换给自己一次“跨越年龄的体验”
- 教师资格证报名-ie浏览器-不兼容
- 使用计算机翻译的是,利用计算机进行中英文翻译的探讨
- 基于ADuC848的智能电压监视仪
- 支付宝微信等第三方支付机构备付金下月上交央行
热门文章
- HTTP 协议相关入门
- 霍尼韦尔宣布并购领先的仓储自动化解决方案提供商Transnorm
- java 线程起名字_java多线程学习三::::为什么要给线程起名字并且知道守护作用?...
- python无法定位到table_爬虫无法定位到tbody下的tr求助!!!!
- 云和恩墨大讲堂 X openGauss Meetup X 鲲鹏生态孵化营(上海站)完美落幕!
- 有赞产品经理一面面试
- 在生活之中,要活在生活之上
- AndroidEmojiDemo 支持emoji的表情解析
- RSD 教程 —— 2 开始运行RSD
- hashmap中的key是有序的么_hashmap 是无序的但是实际输出有序。