集成学习:聚合一组预测器的预测结果,比最好的单个预测器要好。
随机森林:训练一组决策树分类器,每一棵树都基于训练集不同的随机子集进行训练,将所有预测树的结果中最多的类别作为预测结果。
硬投票分类器:聚合每个分类器的预测,将得票最多的结果作为预测类别。
集成学习的效果好于单个弱分类器的原因:大数定理。
假设创建了一个包含1000个分类器的集成,每个分类器都只有51%的几率是正确的(弱分类器),如果你以大多数投票的类别作为预测结果,你可以期待的准确率是75%。
其前提是:所有的分类器都是完全独立的,彼此的错误毫不相关。
当预测器尽可能互相独立时,集成方法的效果最优。获得多种分类器的方法之一是使用不同的算法训练分类器,这会增加他们犯不同类型的错误的机会,从而提升集成的准确率。
训练一个投票分类器,由三种不同的分类器组成:

#聚合一组预测器的预测结果,得到的最终结果好于单个预测器。
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
log_clf=LogisticRegression()
rnd_clf=RandomForestClassifier()
svm_clf=SVC()
voting_clf=VotingClassifier(
estimators=[('lr',log_clf),('rf',rnd_clf),('svc',svm_clf)],voting='hard'
)
from sklearn.datasets import make_moons
x,y=make_moons(n_samples=1000,noise=0.3)
voting_clf.fit(x,y)

数据集可视化:

import matplotlib.pyplot as plt
plt.plot(x[:,0],x[:,1],'b.')


查看各个分类器的预测正确率:

from sklearn.metrics import accuracy_score
x_test,y_test=make_moons(n_samples=1000)
for clf in (log_clf,rnd_clf,svm_clf,voting_clf):clf.fit(x,y)y_pred=clf.predict(x_test)print(clf.__class__.__name__,accuracy_score(y_test,y_pred))

输出为:

LogisticRegression 0.867
RandomForestClassifier 0.988
SVC 0.978
VotingClassifier 0.974

软投票法:如果所有分类器都可以估算出类别的概率,那么可以将概率在所有单个分类器上平均,然后将平均概率最高的类别作为预测结果。

bagging和pasting

前面提到,获得不同种类的分类器的方法之一是使用不同的训练算法,另一种方法是每个预测器使用的算法相同,但是在不同的训练集随机子集上进行训练。
采样时如果将样本放回,则是bagging(bootstrap aggregating的缩写),采样时不放回叫作pasting.
与单个弱分类器相比,集成的偏差和方差都更低。
以下代码训练一个包含500个决策树分类器的集成,每次随机从数据集中采样100个训练实例进行训练,然后放回(bagging示例,如果想用pasting,只需要设置bootstrap=False.)

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bag_clf=BaggingClassifier(
DecisionTreeClassifier(),n_estimators=500,max_samples=100,bootstrap=True,n_jobs=-1
)
bag_clf.fit(x,y)
y_pred=bag_clf.predict(x_test)
print(clf.__class__.__name__,accuracy_score(y_test,y_pred))

输出:

VotingClassifier 0.971

注:如果基础分类器可以估算类别概率,则BaggingClassifier自动执行的是软投票法。

包外评估

由于bagging算法采用有放回的抽样方式(自助采样法),假设训练集有m个样本,每次抽取一个后放回,直到抽到m个样本,那么样本始终没有被抽到的概率为(1−1m)m(1-\frac{1}{m})^m(1−m1​)m,取极限得:37%
  这意味着对于每一个分类器大约有36.8%的样本没有用于训练,这样的样本称为包外(oob)实例,可以使用这些实例进行评估,而不单独的验证集或交叉验证。在Scikit-learn中只需要设置参数oob_score=True即可使用这种方法估计。

#包外评估
bag_clf=BaggingClassifier(
DecisionTreeClassifier(),n_estimators=500,bootstrap=True,n_jobs=-1,oob_score=True
)
bag_clf.fit(x,y)
bag_clf.oob_score_

输出:

0.908

这个集成的包外评估结果为90.8%,计算其在测试集上的表现:

from sklearn.metrics import accuracy_score
y_pred=bag_clf.predict(x_test)
accuracy_score(y_test,y_pred)

输出:

0.8666666666666667

随机子空间法

抽样对象不是实例,而是特征。每个预测器使用输入特征的随机子集进行训练,保留所有实例。

Random Patches

对训练实例和特征都进行抽样。

随机森林

随机森林是决策树的集成。可以使用RandomForestClassifier或者BaggingClassifier类生成随机森林。
训练一个拥有500棵树的随机森林分类器,每棵树限制为最多16个叶节点。

from sklearn.ensemble import RandomForestClassifier
rnd_clf=RandomForestClassifier(n_estimators=500,max_leaf_nodes=16,n_jobs=-1)
rnd_clf.fit(x,y)
y_pred_rf=rnd_clf.predict(x_test)
accuracy_score(y_test,y_pred)

输出:

0.8666666666666667

特征重要性

重要的特征更可能出现在靠近根节点的位置,而不重要的特征通常出现在靠近叶节点的位置,甚至根本不出现。因此,可以通过计算一个特征在森林中所有书上的平均深度,来估算其重要程度。

rnd_clf.feature_importances_  #查看特征重要性

输出:

array([0.43920445, 0.56079555])

提升法:boosting

循环训练预测器,每一次都对其前序做出一些改正。

AdaBoost

新预测期对其前序进行纠正的办法之一,就是更多地关注前序拟合不足的训练实例,从而使新的预测器不断地越来越关注于难缠的问题。
首先训练一个基础分类器(比如决策树),用它对训练集进行预测,然后对错误分类的训练实例增加其相对权重,接着,使用这个最新的权重对第二个分类器进行训练,然后再次对训练集进行预测,继续更新权重,不断循环向前,并且把所有的基础分类器组合在一起就是AdaBoost集成。
梯度下降旨在逐渐调整单个预测期的参数使得成本函数最小化,AdaBoost集成在于不断往集成中加入预测器,使模型越来越好。
缺点:无法并行计算,扩展性不如bagging和pasting。

#adaboost分类器
from sklearn.ensemble import AdaBoostClassifier
ada_clf=AdaBoostClassifier(
DecisionTreeClassifier(max_depth=1),n_estimators=200,algorithm='SAMME.R',learning_rate=0.5
)
ada_clf.fit(x,y)
y_pred=ada_clf.predict(x_test)
accuracy_score(y_test,y_pred)

输出:

0.86

梯度提升

和AdaBoost类似,也是逐步在集成中添加预测器,每一个预测器都对其前序做出改正。不同之处在于,它不是在每个迭代中调整实例权重,而是让新的预测器针对前一个预测器的残差进行拟合

#梯度提升
from sklearn.ensemble import GradientBoostingClassifier
gbrt=GradientBoostingClassifier(max_depth=2,n_estimators=3,learning_rate=1.0)
gbrt.fit(x,y)
y_pred=gbrt.predict(x_test)
accuracy_score(y_test,y_pred)

输出:

0.86

如何确定决策树的最佳数量?

早期停止法。

#寻找最优基础预测期个数:早期停止法
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
x_train,x_val,y_train,y_val=train_test_split(x,y)
gbrt=GradientBoostingClassifier(max_depth=2,n_estimators=120)
gbrt.fit(x_train,y_train)
errors=[mean_squared_error(y_val,y_pred) for y_pred in gbrt.staged_predict(x_val)]
bst_n_estimators=np.argmin(errors)
gbrt_best=GradientBoostingClassifier(max_depth=2,n_estimators=bst_n_estimators)
gbrt_best.fit(x_train,y_train)
y_pred=gbrt.predict(x_test)
accuracy_score(y_test,y_pred)

输出:

0.88

早期停止法的其他实现方法:连续5次迭代验证误差未改善时,直接停止训练。

#早期停止法的其他实现:验证误差连续5次迭代未改善时,直接停止训练
gbrt=GradientBoostingClassifier(max_depth=2,warm_start=True)
min_val_error=float('inf')
error_going_up=0
for n_estimators in range(1,120):gbrt.n_estimators=n_estimatorsgbrt.fit(x_train,y_train)y_pred=gbrt.predict(x_val)val_error=mean_squared_error(y_val,y_pred)if val_error<min_val_error:min_val_error=val_errorerror_going_up=0else:error_going_up+=1if error_going_up==5:break
y_pred=gbrt.predict(x_test)
accuracy_score(y_test,y_pred)

输出:

0.8667

堆叠法:stacking

与其使用一些简单的函数(硬投票、软投票)来聚合集成中所有预测器的预测,为什么不训练一个模型来执行这一步的聚合呢?堆叠法就是对基础预测器的预测结果进行机器学习获得最后结果。
sklearn暂不支持堆叠法。

cap7 集成学习和随机森林相关推荐

  1. 《Scikit-Learn与TensorFlow机器学习实用指南》第7章 集成学习和随机森林

    第7章 集成学习与随机森林 来源:ApacheCN<Sklearn 与 TensorFlow 机器学习实用指南>翻译项目 译者:@friedhelm739 校对:@飞龙 假设你去随机问很多 ...

  2. 大白话5分钟带你走进人工智能-第二十八节集成学习之随机森林概念介绍(1)

                                                          第二十八节集成学习之随机森林概念介绍(1) 从本系列开始,我们讲解一个新的算法系列集成学习. ...

  3. 集成学习和随机森林方法

    集成学习和随机森林方法 介绍 本次实验介绍了集成学习的概念及主要方法,包括 Bootstraping.Bagging.随机森林,随后计算随机森林中各个特征的重要性,找出对模型贡献较大的特征. 知识点 ...

  4. 机器学习——基于Bagging的集成学习:随机森林(Random Forest)及python实现

    基于Bagging的集成学习:随机森林的原理及其实现 引入 Bagging装袋 随机森林 随机森林分类 随机森林回归 python实现 随机森林分类 随机森林回归 引入 "三个臭皮匠赛过诸葛 ...

  5. 大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out of bag data及代码(2)

              大白话5分钟带你走进人工智能-第二十九节集成学习之随机森林随机方式 ,out  of  bag  data及代码(2) 上一节中我们讲解了随机森林的基本概念,本节的话我们讲解随机森 ...

  6. sklearn综合示例7:集成学习与随机森林

    假设你创建了一个包含1000个分类器的集成,每个分类器都只有51%的概率是正确的(几乎不比随机猜测强多少).如果你以大多数投票的类别作为预测结果,可以期待的准确率高达75%.但是,这基于的前提是所有的 ...

  7. 机器学习-集成学习:随机森林(Random Forest)

    内容参考:https://github.com/NLP-LOVE/ML-NLP/tree/master/Machine%20Learning/3.1%20Random%20Forest​​​​​ 略做 ...

  8. 机器学习实战7-sklearn集成学习和随机森林

    集成方法:聚合一组预测器(比如分类器或回归器)的预测,得到的预测结果也比最好的单个预测器要好. 例如,你可以训练一组决策树分类器,每一棵树都基于训练集不同的随机子集进行训练.做出预测时,你只需要获得所 ...

  9. 第13章 集成学习和随机森林

    1.什么是集成学习? kNN,逻辑回归,SVM,决策树,神经网络,贝叶斯->>用多数算法最终给出的结果当做最终的决策依据,投票:少数服从多数 Voting Classifier(sciki ...

  10. [Hands On ML] 7. 集成学习和随机森林

    文章目录 1. 投票分类 2. Bagging.Pasting 3. Out of Bag 评价 4. 随机贴片与随机子空间 5. 随机森林 6. 极端随机树 Extra-Trees 7. 特征重要程 ...

最新文章

  1. CTO怒了:“如果中台不省钱,我建个屁中台啊!”
  2. 数据关系模式设计的标准化
  3. 一、select查询
  4. input限制输入小数点后两位(vue版本)
  5. bootstrap 解决弹出窗口(modal) 常见问题
  6. 拓端tecdat|R语言GARCH模型对股市sp500收益率bootstrap、滚动估计预测VaR、拟合诊断和蒙特卡罗模拟可视化
  7. LINUX下载编译LanguageTool
  8. 单片机r6/r7c语言怎么用,第5章MCU混合编程与C语言和汇编语言
  9. 远程桌面由于以下原因之一无法连接到远程计算机解决方法(亲测)
  10. 有关微信小程序云数据库修改数据的坑
  11. android 中拦截home键
  12. 王彦霖艾佳妮婚纱大片,校园牵手漫步,女方秀心形婚戒
  13. 目录_网易微专业C++系统工程师
  14. 怎么把跑男里面的图片保存下来
  15. vim 录制宏,自动循环执行组合操作
  16. 基于Android开发的手持扫码枪APP(附带参考源码)
  17. 信息系统项目管理师-项目范围管理
  18. 外贸客户电话和邮件地址的收集
  19. 语音识别ASR - HTK(HResults)计算字错率WER、句错率SER
  20. cmd命令之Xcopy介绍_复制文件夹里所有文件到另一个文件夹操作方式

热门文章

  1. 存储 - emmc ufs nvme
  2. oracle里的ols机制,[Oracle] 数据库安全之 - Oracle标签安全(OLS)
  3. 哪个品牌台灯护眼效果好?分享被央视315表扬的护眼灯
  4. JSP报错 At least one JAR was scanned for TLDs yet contained no TLDs
  5. python 计算走势角度
  6. educoder Git进阶之合并远程分支、rebase、储藏
  7. 笔记本 GTX1050ti 安装win10 Ubuntu18.04 显卡问题
  8. 计算机毕业设计ssm社区疫情防控管理系统nt4k1系统+程序+源码+lw+远程部署
  9. linux Fedora安装桌面,在Fedora Linux上安装Elementary OS桌面的方法
  10. 我国三大常用坐标系:北京54、西安80和WGS-84