Bagging决策树:Random Forests
1. 前言
随机森林 Random Forests (RF) 是由Breiman [1]提出的一类基于决策树CART的集成学习(ensemble learning)。论文 [5] 在121数据集上比较了179个分类器,效果最好的是RF,准确率要优于基于高斯核SVM和多项式LR。RF自适应非线性数据,不易过拟合,所以在Kaggle竞赛大放异彩,大多数的wining solution都用到了RF。
集成学习主要分为两大流派:Bagging与Boosting,两者在训练基分类器的思路截然不同:
- Bagging通过bootstrap sampling(有放回地取样)方式训练基分类器,每一个基分类器互不影响,但并不相互独立;
- Boosting则是通过重赋权(re-weighting)法迭代地训练基分类器,当前的样本权值的分布依赖于上一轮基分类器的分类结果;对于无法接受带权样本的基分类算法,则采用“重采样法”(re-sampling)来处理,即分错的样本在下一轮学习出现的次数会增加。
RF属于集成学习中的Bagging流派。若Bagging算法直接采用CART做基分类器,存在着一个问题:如果某些feature具有很强的预测性,则会被许多基分类器CART所选择,这样就增加了基分类器之间的相关性。而Bagging的泛化误差:
\]
上式(具体含义及证明请参看论文 [1])表明:随着基分类器的相关性\(\overline{\rho}\)增加,则RF的泛化误差的上界也随之增加。为了降低基分类器的相关性,RF加入了Feature Bagging,对特征集合进行取样。
2. 详解
本小节详细介绍RF算法的细节,将从Data Bagging与Feature Bagging两个方面展开。
Data Bagging
RF对样本集bootstrap取样,与其他的Bagging算法并无二致。RF算法的整体流程如下(图来自于ESL [2]):
Feature Bagging
所谓Feature Bagging是对特征集合取样\(K\)个特征。每一棵策树的每一个结点分裂,RF都从特征集合中取样,并且每一次取样都互不影响。RF的的决策树生成算法如下(图来自于 [3]):
如果特征集合的基较小,即特征数量不足,则很难采样出相互独立的特征集合。RF采取了线性加权的方式组合(Linear Combinations of Inputs)成新feature,形成新的特征集合。Breiman把这一类RF称为Forest-RC。Breiman在论文 [1]中建议分类RF的\(K\)值应取特征总数\(p\)的对数值,而ESL [2]则建议取平方根值:
\]
kjw0612整理了awesome-random-forest,给出了RF在各个领域应用的最新进展。scikit-learn包的RandomForestClassifier实现了RF,既可用来做分类也可用来做回归,其中几个重要参数的说明:
n_estimators: RF的决策树的棵数,默认10;
max_features: 决策树分裂时的K值,默认为"auto"即sqrt(n_features),亦可选择"log2"即og2(n_features),或者直接指定为int值或float值;
bootstrap: 样本是否做bootstrap取样,默认为True;
3. 参考资料
[1] Breiman, Leo. "Random forests." Machine learning 45.1 (2001): 5-32.
[2] Trevor Hastie, Robert Tibshirani, Jerome H. Friedman. The elements of statistical learning. Springer, Berlin: Springer series in statistics, 2009.
[3] Zhou, Zhi-Hua. Ensemble methods: foundations and algorithms. CRC press, 2012.
[4] Leo Breiman and Adele Cutler, Random Forests.
[5] Fernández-Delgado, Manuel, et al. "Do we need hundreds of classifiers to solve real world classification problems." J. Mach. Learn. Res 15.1 (2014): 3133-3181.
Bagging决策树:Random Forests的更多相关文章
- Bootstrap,Bagging and Random Forest Algorithm
Bootstrap Method:在统计学中,Bootstrap从原始数据中抽取子集,然后分别求取各个子集的统计特征,最终将统计特征合并.例如求取某国人民的平均身高,不可能测量每一个人的身高,但却可以 ...
- 以Random Forests和AdaBoost为例介绍下bagging和boosting方法
我们学过决策树.朴素贝叶斯.SVM.K近邻等分类器算法,他们各有优缺点:自然的,我们可以将这些分类器组合起来成为一个性能更好的分类器,这种组合结果被称为 集成方法 (ensemble method)或 ...
- 随机森林——Random Forests
[基础算法] Random Forests 2011 年 8 月 9 日 Random Forest(s),随机森林,又叫Random Trees[2][3],是一种由多棵决策树组合而成的联合预测模型 ...
- 第七章——集成学习和随机森林(Ensemble Learning and Random Forests)
俗话说,三个臭皮匠顶个诸葛亮.类似的,如果集成一系列分类器的预测结果,也将会得到由于单个预测期的预测结果.一组预测期称为一个集合(ensemble),因此这一技术被称为集成学习(Ensemble Le ...
- 壁虎书7 Ensemble Learning and Random Forests
if you aggregate the predictions of a group of predictors,you will often get better predictions than ...
- CF Gym 102028G Shortest Paths on Random Forests
CF Gym 102028G Shortest Paths on Random Forests 抄题解×1 蒯板子真jir舒服. 构造生成函数,\(F(n)\)表示\(n\)个点的森林数量(本题都用E ...
- Ensemble Learning 之 Bagging 与 Random Forest
Bagging 全称是 Boostrap Aggregation,是除 Boosting 之外另一种集成学习的方式,之前在已经介绍过关与 Ensemble Learning 的内容与评价标准,其中“多 ...
- Aggregation(1):Blending、Bagging、Random Forest
假设我们有很多机器学习算法(可以是前面学过的任何一个),我们能不能同时使用它们来提高算法的性能?也即:三个臭皮匠赛过诸葛亮. 有这么几种aggregation的方式: 一些性能不太好的机器学习算法(弱 ...
- bootstrap && bagging && 决策树 && 随机森林
看了一篇介绍这几个概念的文章,整理一点点笔记在这里,原文链接: https://machinelearningmastery.com/bagging-and-random-forest-ensembl ...
随机推荐
- Codeforces Round #367 (Div. 2)D. Vasiliy's Multiset (字典树)
D. Vasiliy's Multiset time limit per test 4 seconds memory limit per test 256 megabytes input standa ...
- $(srctree) is not clean, please run 'make mrproper'
在使用make menuconfig重新配置后,再编译kernel时常会遇到这样的问题: Using /home/likewise-open/BJS/lisa.liu/code/sprdroid4.0 ...
- linux usb installer
其实很简单,手册上有,cp debian....iso /dev/sdc,但是要把sdc上的分区删掉了先. This will only work if it is a hybrid ISO cont ...
- 制作win10 usb 启动盘
Rufus 是一个开源的USB启动盘制作程序.其特点就是快速,且支持各种系统,包括各种windows系统,linux系统,使用也很简单. Rufus主页: http://rufus.akeo.ie/ ...
- CodeForces 618C CodeForces 618C
第一反应是在凸包上随便找一条边,然后找剩下n-2个点里面距离这条边最短的一个点,这三点就构成了符合要求的三角形..然而..精度被卡死. 换种思路,随便找两个点P1,P2,找剩下n-2个点中哪一个点与P ...
- (简单) POJ 3984 迷宫问题,BFS。
Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, ...
- mustache.js使用基本(三)
作者:zccst 本节要点是子模块(partials)和分隔符(delimiter)等 1,子模块(partials) /* {{>partials}}以>开始表示子模块,如{{> ...
- ue4访问php接口
继上一篇介绍ue4打开web url窗口,这篇就来介绍下怎么访问php接口. 要做的两步: 1.c++自己写个接受请求的方法 f Post lhc-URL Request就是自定义的c++方法, /* ...
- iOS 为label添加删除线
UILabel *testLabel = [[ UILabel alloc] initWithFrame:CGRectMake(, , , )]; testLabel.numberOfLines = ...
- python web开发基本概念
参考了廖雪峰的Python博客. web请求顺序: 浏览器发送一个http请求 服务器收到请求后,生成一个html文档. 服务器将html文档作为http相应的body发送给浏览器 浏览器收到http ...