集成学习:让算法和算法赛跑
文章目录
- 集成学习的基本概念
- 构建弱分类器:决策树
- 自助采样法
- bootstrapping
- bootstrapping的核心思想
- bootstrapping与permutation的区别
- bagging
- boosting
- 为何bagging会降低variance,boosting降低bias?
- 更多参考阅读:
集成学习的基本概念
集成学习的概念有点像竞争社会,让算法之间竞争,决出最好的结果。如果底层的算法(或者说个体学习器)是同样的只是初始化参数不同,就称为同质集成。如果底层算法的基因都不一样,来自不同的机器学习门派,就称为异质集成。
个体学习器经常设置为多个不同的机器学习算法,这样做保证了个体学习期相互独立性的要求。例如支持向量机(SVM)、线性回归、k近邻、二元决策树等。但是这样做的缺点是每个个体学习期都有不同的参数,需要分别调参,最要命的是,每个模型对输入数据的要求也不一样。这样一来,问题建模的过程反而又复杂了。
因此,在应用集成方法时候,关键是生成大量近似独立模型——这些个体学习器便于调参,输入参数要求一致,易于集成。这里,我们以二元决策树为个体学习器,上层算法以某种方式使得使得个体模型相对独立。具体来说,常见得上层算法有:投票(bagging)、提升(boosting)和随机森林(random forests)。
构建弱分类器:决策树
二元决策树可以看作是简单的条件选择,基于某个特性做“是”或者“否”的判断。每次决策后,可能会引出另外一个决策,或者,生成最终的结果。最上面的节点称为根节点(root node)。根节点通常是特别重要的性质(变量),决策树的深度定义为从上到下遍历树的最长路径。例如下面的例子中,这个决策树的深度就是5.
import numpy as np
from sklearn import tree
from sklearn.tree import DecisionTreeRegressor
from sklearn.externals.six import StringIO
# a simple data set with y = x + random
nPoints = 100
xPlot = np.linspace(-0.5, 0.5, 100, endpoint=False)
x = [[xi] for xi in xPlot]
# add random noise
np.random.seed(1)
y = [xi + np.random.normal(scale=0.1) for xi in xPlot]
plot.plot(xPlot,y)
plot.axis('tight')
plot.xlabel('x')
plot.ylabel('y')
plot.show()
# decision tree with 1 layer
simpleTree1 = DecisionTreeRegressor(max_depth=1)
simpleTree1.fit(x,y)
with open("simpleTree1.dot",'w') as f:f = tree.export_graphviz(simpleTree1, out_file=f)
# decision tree with 2 layers
simpleTree2 = DecisionTreeRegressor(max_depth=2)
simpleTree2.fit(x, y)
# draw the tree
with open("simpleTree2.dot",'w') as f:f = tree.export_graphviz(simpleTree2, out_file=f)# compare prediction with true
yHat1 = simpleTree1.predict(x)
yHat2 = simpleTree2.predict(x)
plot.figure()
plot.plot(xPlot, y, label='True_y')
plot.plot(xPlot, yHat1, label='Predict_y1', linestyle="--")
plot.plot(xPlot, yHat2, label='Predict_y2', linestyle=":")
plot.legend(bbox_to_anchor=(1, 0.3))
plot.axis('tight')
plot.xlabel('x')
plot.ylabel('y')
plot.show()
自助采样法
bootstrapping
在介绍Bagging和Boosting之前,首先介绍一下Bootstraping,即自助法:它是一种有放回的抽样方法(可能抽到重复的样本)。它是非参数统计中一种重要的通过估计统计量方差进而进行区间估计的统计方法。
bootstrapping的核心思想
Bootstrap的思想,是生成一系列bootstrap伪样本,每个样本是初始数据有放回抽样。通过对伪样本的计算,获得统计量的分布。例如,要进行1000次bootstrap,求平均值的置信区间,可以对每个伪样本计算平均值。这样就获得了1000个平均值。对着1000个平均值的分位数进行计算, 即可获得置信区间。已经证明,在初始样本足够大的情况下,bootstrap抽样能够无偏得接近总体的分布。
主要步骤:
1)根据抽出的样本计算统计量T。
2)重复上述N次(一般大于1000),得到统计量T。
3)计算上述N个统计量T的样本方差,得到统计量的方差。
Bootstrap实质上是一种再抽样过程,相对于其他方法,在小样本时也具有较好效果。
参见wiki百科关于bootstrapping方法的介绍:https://en.wikipedia.org/wiki/Bootstrapping_(statistics)
bootstrapping与permutation的区别
Permutation test 置换检验是Fisher于20世纪30年代提出的一种基于大量计算(computationally intensive),利用样本数据的全(或随机)排列,进行统计推断的方法,因其对总体分布自由,应用较为广泛,特别适用于总体分布未知的小样本资料,以及某些难以用常规方法分析资料的假设检验问题。在具体使用上它和Bootstrap Methods类似,通过对样本进行顺序上的置换,重新计算统计检验量,构造经验分布,然后在此基础上求出P-value进行推断。
具体看看这篇博客的例子就明白了:
置换检验:https://www.cnblogs.com/bnuvincent/p/6813785.html
bagging
bagging是并行式集成学习方法最著名的代表,从名字就可以看出,它基于自助采样法。给定包含m个样本的数据集,我们先随即取出一个样本放入采样集中,再把这个样本放回到初始数据集,使得下次采样时该样本仍可能被选,这样,经过m次随机采样操作,我们得到含有m个样本的采样集,初始训练集中有的样本在采样集中多次出现,有的没有出现,我们之前计算过这个比例,大概有63.2%的样本会出现在采样集中。
就这样,我们可以采样出T个样本集,每个样本集合中含m个训练样本,然后基于每个采样集训练出一个基学习器,再将这些学习器进行结合,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法/若分类预测时出现两个类收到的票数相同,那么最简单的做法是随机选出一个,也可以进一步考察学习器投票的置信度来确定最终胜者。
bagging方法的主要过程
i) 训练分类器:从整体样本集合中,抽样n* < N个样本 针对抽样的集合训练分类器Ci
ii) 分类器进行投票:最终的结果是分类器投票的优胜结果
boosting
boosting一种典型的基于Bootstrapping思想的应用,其特点是:每一次迭代时训练集的选择与前面各轮的学习结果有关,而且每次是通过更新各个样本权重的方式来改变数据分布。其中主要的是Adaboost (Adaptive boosting),即自适应助推法。
Boosting的算法过程如下:
对于训练集中的每个样本建立权值wi,表示对每个样本的权重, 其关键在与对于被错误分类的样本权重会在下一轮的分类中获得更大的权重(错误分类的样本的权重增加)。
加大分类误差概率小的弱分类器的权值,使其在表决中起到更大的作用,减小分类误差率较大弱分类器的权值,使其在表决中起到较小的作用。每一次迭代都得到一个弱分类器,需要使用某种策略将其组合,成为最终模型,(adaboost给每个迭代之后的弱分类器一个权值,将其线性组合作为最终的分类器,误差小的分类器权值越大。)
关于Boosting的两个核心问题:
1)在每一轮如何改变训练数据的权值或概率分布?
通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。
2)通过什么方式来组合弱分类器?
通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
为何bagging会降低variance,boosting降低bias?
什么是bias/variance tradeoff?引用下图来自coursera:
High variance 是model过于复杂overfit,记住太多细节noise,受outlier影响很大;high bias是underfit,model过于简单,cost function不够好。
2 A- bagging随机选取data的subset,outlier因为比例比较低,参与model training的几率也比较低,所以bagging降低了outliers和noise对model的影响,所以降低了variance。
2 B-boosting minimize loss function by definition minimize bias. 因此降低的是bias。
更多参考阅读:
Boosting的代表是AdaBoost,关于AdaBoost,参照以下帖子:
基本原理:http://www.jianshu.com/p/f2017cc696e6
误差分析:http://www.jianshu.com/p/bfba5a91ba15
AdaBoost与前向分步算法:http://www.jianshu.com/p/a712dff0f388
集成学习-Boosting和Bagging异同:https://blog.csdn.net/Mr_Robert/article/details/84448417
https://www.zhihu.com/question/26760839/answer/68915634
集成学习:让算法和算法赛跑相关推荐
- 周志华教授专著《集成学习:基础与算法》上市,破解AI实践难题
[ 摘要 ]<集成学习:基础与算法>上市一周,斩获京东IT新书销量榜第一名桂冠,并拿下京东IT图书销量总榜第二名的惊人成绩. 文中有数据派独家福利哦 本书共读活动已正式开启,文末加入读者交 ...
- 周志华教授专著《集成学习:基础与算法》上市,豆瓣满分森林书破解AI实践难题...
近年来,机器学习技术的快速发展推动了语音.自然语言处理.机器视觉等多个领域获得巨大进步,也带动了人工智能相关产业的蓬勃发展. 回顾机器学习最近30 年的发展历程,各种学习方法推陈出新.不断演进.但是, ...
- 【福利】周志华教授专著《集成学习:基础与算法》上市,豆瓣满分森林书破解AI实践难题...
近年来,机器学习技术的快速发展推动了语音.自然语言处理.机器视觉等多个领域获得巨大进步,也带动了人工智能相关产业的蓬勃发展. >>>> 回顾机器学习最近30 年的发展历程,各种 ...
- 集成学习Bagging和Boosting算法总结
一.集成学习综述 1.集成方法或元算法是对其他算法进行组合的一种方式,下面的博客中主要关注的是AdaBoost元算法.将不同的分类器组合起来,而这种组合结果被称为集成方法/元算法.使用集成算法时会有很 ...
- Datawhale集成学习笔记:XGBOOST算法
引用:Datawhale XGBoost算法 XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学 ...
- 集成学习05:XGBoost算法
XGBoost本质上还是一个GBDT,但是力争把速度和效率发挥到极致..XGBoost是一个优化的分布式梯度增强库,旨在实现高效,灵活和便携. 它在Gradient Boosting框架下实现机器学习 ...
- 集成学习-Bagging和Boosting算法
文章目录 集成学习 Bagging 随机森林 Bosting Adaboost GBDT XGBoost 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网 ...
- 集成学习2:Boosting算法:AdaboostGBDT
文章目录 一. Boosting算法原理 二. Adaboost算法 2.1 Adaboost算法原理 2.2 Adaboost算法举例 2.3 Adaboos代码举例 三. 前向分步算法 3.1加法 ...
- 主动学习与半监督算法结合在支付宝风控的应用
以下内容均来自互联网,系笔者汇总并总结 2018蚂蚁金服ATEC大赛 1 .赛题任务描述 在金融行业中,风控系统与黑产的攻防几乎是无时不刻的存在着,风控系统中用来实时识别风险的机器学习模型需要在黑产攻 ...
- 集成学习:机器学习兵器谱的“屠龙刀”
转载地址:http://www.csdn.net/article/2015-03-02/2824069 编者按:目前机器学习领域诞生的多种算法并不见得都有很好的实战效果.本文作者认为,集成学习是一种立 ...
最新文章
- android高德地图显示多点标记,高德地图多点标记自定义地图
- python怎么读文件里的某一行-python如何读取文件中的某几行
- Python中type()详解:动态创建类
- 在Angular单个的单元测试里,调用多次detectChange,会重复执行ngAfterViewInit hook吗
- 主流微型计算机,主流微型计算机硬件系统维护
- es springboot 不设置id_springboot整合ES_文档ID删除
- tomcat:sessionId生成机制导致tomcat启动过慢问题
- 0 full gc时cpu idle_Go语言中如何观察GC
- vSphere Replication:虚拟机的保护伞
- 【Java】soap协议发送webservice请求工具类
- matlab手动抠图,MATLAB可视化手动抠图
- 现身说法:37 岁老码农找工作
- 百度指数爬取+pyppeteer登录(解决旋转验证码)
- 树莓派智能家居homeassistant之homekit篇
- 小米电视/盒子 访问群晖 需要打开 设置“SMB1”
- [网鼎杯 2020 白虎组]PicDown(精讲)
- 2021年中国城市财力半年报 Top 30
- k-means算法简介
- jupyter中关于pandas的dataframe行列显示不全与复原
- 【luogu P7473】重力球
热门文章
- Blender 移动模型到世界中心
- 采用的并行计算机结构介绍,高性能并行计算机体系结构和典型的 DSM 系统-SPP1200/XA...
- ros wiki learning
- CTFHub(UA注入和Refer注入)
- 安装python3.7 + pytorch1.7.1 + torchvision0.8.2 + torchaudio0.7.2 + cudatoolkit110 + torchio0.18.17
- UI 智能化的原理和未来
- 学习 正则表达式 js java c# python 通用
- python转换字符_Python字符转换
- 精要主义:如何应对拥挤不堪的工作与生活
- PhysX物理引擎(编程入门)