http://blog.csdn.net/songzitea/article/details/10035757

http://blog.csdn.net/holybin/article/details/25653597

在机器学习中,随机森林由许多的决策树组成,因为这些决策树的形成采用了随机的方法,所以叫做随机森林。随机森林中的决策树之间是没有关联的,当测试数据进入随机森林时,其实就是让每一颗决策树进行分类看看这个样本应该属于哪一类,最后取所有决策树中分类结果最多的那类为最终的结果(每棵树的权重要考虑进来)。

随机森林的建立

基本就是两个步骤:随机采样与完全分裂。

(1)随机采样

首先是两个随机采样的过程,random forest对输入的数据要进行行、列的采样。

对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个,这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本,同时使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。

对于列采样,从M个feature中,选择m个(m << M),即:当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m << M。

(2)完全分裂

对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。分裂的办法是:采用上面说的列采样的过程从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。(停止分裂条件:结点中所有样本属于同一类,或者没有特征可供使用)

决策树形成过程中每个节点都要按完全分裂的方式来分裂,一直到不能够再分裂为止(如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。

我们用LearnUnprunedTree(X,Y)表示生成一棵未剪枝的决策树的过程,以下简写LUT (X,Y):

LearnUnprunedTree(X,Y)
输入:
      X是RxM的矩阵,Xij表示第i个样本的第j个特征。
      Y是Rx1的向量,Yi表示第i个样本的类别标签。
输出:
      一棵未剪枝的树
如果X的所有样本值都相同,或Y的所有类别标签相同,或者R<2,则产生一个叶结点,该结点的类别即是X中最多数的类别。
否则
      从M个特征中随机挑选m个
      这m个特征中,信息增益最大的记为p。(信息增益的计算方法见下文)
      如果特征p的取值是非连续的(如性别:“男”,“女”)(ID3、C4.5算法,生成的是多叉树)
             则对p的任一取值v
                    用Xv表示特征p取值为v的样本,Yv为其对应类别
                    Childv =LUT(Xv,Yv)
             返回一个树结点,在特征p处分裂,孩子的数量与特征p的不同取值数量相同。第v’个孩子即是Childv = LUT(Xv,Yv)
      如果特征p的取值是连续的(如温度,长度等),设t为最佳分裂阈值(cart算法,生成的是二叉树)
             XLO 表示 特征p的值<t的样本集合,YLO为其对应类别
             ChildLO = LUT(XLO, YLO)
             XHI 表示  特征p的值>=t的样本集合,YHI为其对应类别
             ChildLO = LUT(XHI , YHI)
             返回一个树结点,在特征p处分裂,有2个孩子,分别是ChildLO = LUT(XLO, YLO) 和ChildLO = LUT(XHI , YHI)。

首先,以上是未剪枝决策树的生成过程,一般很多的决策树算法都会包含剪枝过程来避免over-fitting。但是由于随机森林的两个随机采样的过程保证了随机性,所以就算不剪枝也不容易出现over-fitting,这也是随机森林的优势之一。

其次,按上述办法生成的每一棵决策树的分类能力很有限(从M个feature中选择m让每一棵决策树进行学习),但是组合在一起形成森林之后分类能力就大大加强了,这点很像adaboost里面的弱分类器组合成强分类器的思想,并且最后都是通过带权重的方式组合起来。<=如何得到权重?

最后,随机森林有2个参数需要人为控制,一个是森林中树的数量,一般建议取很大。另一个是m的大小,推荐m的值为M的均方根。

随机森林的优点
总结如下:
(1)比较适合做多分类问题,训练和预测速度快,在数据集上表现良好;
(2)对训练数据的容错能力强,是一种有效地估计缺失数据的一种方法,当数据集中有大比例的数据缺失时仍然可以保持精度不变和能够有效地处理大的数据集;
(3)能够处理很高维度的数据,并且不用做特征选择(列采样),即:可以处理没有删减的成千上万的变量;
(4)能够在分类的过程中可以生成一个泛化误差的内部无偏估计;
(5)能够在训练过程中检测到特征之间的相互影响以及特征的重要性程度;
(6)不易出现过拟合;
(7)实现简单并且容易实现并行化。

 备注:看下sklearn中如何实现随机森林的


boosting (提升)方法:学习多个弱分类器,线性组合得到一个强分类器

提升方法其实是一个比adaboost概念更大的算法,因为adaboost(通过改变样本的权重,得到多个弱(基本)分类器和对应的系数,最后再线性组合)可以表示为boosting的前向分布算法(Forward stagewise additive modeling)的一个特例,boosting最终可以表示为:

其中的w是权重,Φ是弱分类器(回归器)的集合,其实就是一个加法模型(即基函数的线性组合)

前向分布算法实际上是一个贪心的算法,也就是在每一步求解弱分类器Φm和其系数wm的时候不去修改之前已经求好的分类器和系数(即每一步得到一个基本分类器):

(图自《统计学习方法》)

为了表示方便,我们以后用$β$代替$w$进行描述了,图中的b是之前说的Φ弱分类器

GBDT(梯度上升决策树模型):

对于决策树(回归树),其实可以把它表示为下式,即是把特征空间划分为多个区域,每个区域返回某个值作为决策树的预测值

其中$R_j$是区域,γ是返回值,I()在其中的条件成立情况下为1,否则为0.

回归问题的前向分步算法: 
 
在前向分步算法的第m步,给定当前模型fm-1(x),需求解 
 
得到第m棵数的参数。

当采用平方平方误差损失函数时, 
 
其损失变为: 
 
其中: 
 
是当前模型的残差(residual),所以,对回归问题的提升树算法来说,只需简单地拟合当前模型的残差。下述用梯度来拟合残差是基于梯度的gdbt版本,暂时记住吧

 
 

原始的Boost算法是在算法开始的时候,为每一个样本赋上一个权重值,初始的时候,大家都是一样重要的。在每一步训练中得到的模型,会使得数据点的估计有对有错,我们就在每一步结束后,增加分错的点的权重,减少分对的点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就被赋上一个很高的权重。然后等进行了N次迭代(由用户指定),将会得到N个简单的分类器(basic learner),然后我们将它们组合起来(比如说可以对它们进行加权、或者让它们进行投票等),得到一个最终的模型。=>关键在于改变样本点的权重来学习多个弱分类器

而Gradient Boost与传统的Boost的区别是,每一次的计算是为了减少上一次的残差(提升树算法的原理),而为了消除残差,我们可以在残差减少的梯度(Gradient)方向上建立一个新的模型(基于梯度下降法)。所以说,在Gradient Boost中,每个新的模型的建立是为了使得之前模型的残差往梯度方向减少,与传统Boost对正确、错误的样本进行加权有着很大的区别。


机器学习中的学习算法的目标是为了优化或者说最小化loss Function, Gradient boosting的思想是迭代生多个(M个)弱的模型,然后将每个弱模型的预测结果相加,后面的模型Fm+1(x)基于前面学习模型的Fm(x)的效果生成的,关系如下:

     

GB算法的思想很简单,关键是怎么生成h(x)?

如果目标函数是回归问题的均方误差,很容易想到最理想的h(x)应该是能够完全拟合 ,这就是常说基于残差的学习。残差学习在回归问题中可以很好的使用,但是为了一般性(分类,排序问题),实际中往往是基于loss Function 在函数空间的的负梯度学习,对于回归问题残差和负梯度也是相同的。中的f,不要理解为传统意义上的函数,而是一个函数向量,向量中元素的个数与训练样本的个数相同,因此基于Loss Function函数空间的负梯度的学习也称为“伪残差”。

基于梯度的gbdt版本: http://blog.csdn.net/puqutogether/article/details/44781035

原始论文: Greedy function approximation: A gradient boosting machine.

随机森林、gbdt算法的更多相关文章

  1. Bagging与随机森林(RF)算法原理总结

    Bagging与随机森林算法原理总结 在集成学习原理小结中,我们学习到了两个流派,一个是Boosting,它的特点是各个弱学习器之间存在依赖和关系,另一个是Bagging,它的特点是各个弱学习器之间没 ...

  2. 机器学习:集成学习:随机森林.GBDT

    集成学习(Ensemble Learning) 集成学习的思想是将若干个学习器(分类器&回归器)组合之后产生一个新学习器.弱分类器(weak learner)指那些分类准确率只稍微好于随机猜测 ...

  3. 决策树与随机森林Adaboost算法

    一. 决策树 决策树(Decision Tree)及其变种是另一类将输入空间分成不同的区域,每个区域有独立参数的算法.决策树分类算法是一种基于实例的归纳学习方法,它能从给定的无序的训练样本中,提炼出树 ...

  4. Python机器学习笔记——随机森林算法

    随机森林算法的理论知识 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法.随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代 ...

  5. 机器学习-树模型理论(GDBT,xgboost,lightBoost,随机森林)

    tree based ensemble algorithms 主要介绍以下几种ensemble的分类器(tree based algorithms) xgboost lightGBM: 基于决策树算法 ...

  6. GBDT算法简述

    提升决策树GBDT 梯度提升决策树算法是近年来被提及较多的一个算法,这主要得益于其算法的性能,以及该算法在各类数据挖掘以及机器学习比赛中的卓越表现,有很多人对GBDT算法进行了开源代码的开发,比较火的 ...

  7. 随机森林(Random Forests)

    简单地看了一些入门的资料. 随机森林似乎和CART有些联系. 随机森林的算法步骤: 1. 利用自助法(Bootstrap)从原始训练集中生成k个自助样本集,每个自助样本集是每棵分类树的全部训练数据.自 ...

  8. SIGAI机器学习第十九集 随机森林

    讲授集成学习的概念,Bootstrap抽样,Bagging算法,随机森林的原理,训练算法,包外误差,计算变量的重要性,实际应用 大纲: 集成学习简介 Boostrap抽样 Bagging算法 随机森林 ...

  9. 机器学习中的算法(1)-决策树模型组合之随机森林与GBDT

    版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...

  10. 机器学习中的算法——决策树模型组合之随机森林与GBDT

    前言: 决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等.但是同时,单决策树又有一些不好的地方,比如说容易over- ...

随机推荐

  1. window.onload和DOMContentLoaded的区别

    一.何时触发这两个事件? 1.当 onload 事件触发时,页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成了. 2.当 DOMContentLoaded 事件触发时,仅当DOM加载完 ...

  2. vue :class 可以接收 字符串 数组 和 对象 对象里面的key值 根据true或false 显示不显示

    vue :class 可以接收 字符串 数组 和 对象 对象里面的key值 根据true或false 显示不显示 https://cn.vuejs.org/v2/guide/class-and-sty ...

  3. axios 里面 then 默认写的function里面没有this,改成箭头函数后就可以用this了

    ,methods:{ loadJson:function(){ //this.jsonTest = "jjj" this.$http.get('http://localhost:3 ...

  4. 批量下载ts视频文件

    第一步 使用chrome 按F12进入开发模式,拖动视频进度条到视频结束: 然后找到.m3u8以结尾的文件并保存为文本文件. 第二步 点开查看里面是否存在如下以ts结尾的文件内容 ...... /20 ...

  5. hibernate 入门配置

    转自: https://segmentfault.com/a/1190000013568216

  6. Java 对象的创建以及类加载

    1. 对象的创建的过程: 类加载检查—>分配内存—>初始化零值—>设置对象头—>执行 init . 1.类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数 ...

  7. [模板] 动态ST表

    ST表本身是不可修改的. 如果考虑增加一个数,可以把ST表反过来写,即f[i][j]表示i往前1<<j个数,一个数最多影响logn个数,常数非常小. #include<iostrea ...

  8. Linux下安装Redis5.0.2

    1.下载redis 地址 http://download.redis.io/releases/redis-5.0.2.tar.gz 2.解压tar -zxf redis-5.0.2.tar.gz 3. ...

  9. <Spring Cloud>入门三 Ribbon

    1.Ribbon 客户端软负载均衡组件 1.1配置 搭建了三个消费者供客户端调用: 1.修改yml eureka: client: service-url: defaultZone: http://e ...

  10. 21. SCHEMATA

    21. SCHEMATA 在MySQL中,SCHEMA是数据库,因此SCHEMATA表提供有关数据库的信息. SCHEMATA表有以下列: CATALOG_NAME :SCHEMA所属目录的名称.该值 ...