随机森林_随机森林算法 - CSDN
随机森林 订阅
随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。该分类器最早由Leo Breiman和Adele Cutler提出,并被注册成了商标。 展开全文
随机森林指的是利用多棵树对样本进行训练并预测的一种分类器。该分类器最早由Leo Breiman和Adele Cutler提出,并被注册成了商标。
信息
提出时间
1995年
领    域
数理科学
相关人物
Leo Breiman;Adele Cutler
中文名
随机森林
应    用
机器学习
外文名
Random forest
随机森林定义
在机器学习中,随机森林是一个包含多个决策树的分类器, 并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法。 而 "Random Forests" 是他们的商标。 这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合 Breimans 的 "Bootstrap aggregating" 想法和 Ho 的"random subspace method"以建造决策树的集合。
收起全文
精华内容
参与话题
  • Bootstrap aggregating 简称**Bagging**,其中bootstrap是指基学习器的训练样本是对原始训练数据的**自助采样...本文主要介绍基本的bagging原理和随机森林原理,并说明了bagging和随机森林在成熟的scikit-learn的实现。

    这里是集成学习干货系列第二谈,本篇文章我们来浅谈随机森林,它是一种多决策树的bagging。
    其他干货:
    集成学习(ensemble learning)干货系列(1)——集成学习概述

    Bagging

    Bootstrap aggregating 简称Bagging,其中bootstrap是指基学习器的训练样本是对原始训练数据的自助采样(bootstrap sampling) 得到,aggregating 是指集成学习器的预测结果为多个训练好的基学习器的预测结果的总和。

    给定公NN个样本的数据集DD, bootstrap sampling步骤如下:

    1. 先随机取出一个样本放入采样集中,再把该样本放回原始数据集
    2. 不断重复N1N-1次,得到包含NN个样本的采样集。

    显然,初始训练集中某个样本在采样集中可能出现多次,也有 可能不出现。⼀个样本不在采样集中出现的概率是:
    (11N)N (1 - \frac{1}{N})^N
    limN(11N)N=0.368\lim\limits_{N\to\infty} (1 - \frac{1}{N})^N = 0.368,所以原始训练集中约有63.2%63.2\%的样本出现在采样集中。
    Bagging的基本流程:

    • 经过MM轮自助采样,可以得到MM个,每个包含NN个训练样本的采样集D(m),m=1,2,,MD^{(m)}, m=1,2,\dots,M
    • 基于每个训练采样集D(m)D^{(m)}, 训练一个基学习器fmf^m
    • 最后将这MM个模型进行组合,得到集成模型。分类任务一般采用简单的投票法,取多个基学习器的预测类别的众数。 回归任务通常使⽤简单平均法,取多个基学习器的预测值的平均:f=1Mmfm(x)f = \frac{1}{M} \sum_m f^m(x)
      在这里插入图片描述
      由于Bagging算法每次都进行采样来训练模型,因此泛化能力很强,可以显著的 降低模型的方差,但均值不变 。当然对于训练集的拟合程度就会差一些,也就是模型的偏差会大一些。
      证明:
      若Bagging中每个模型都相互独立,那么有:
      在这里插入图片描述
      但是由于bootstrap sampling的存在,每个训练采样集可能有一部分数据集相同,所以每个数据集不完全独立,设单个模型两两之间的相关系数为ρ0<ρ1\rho, 0 < \rho \le 1,则方差为:
      Var(i=1NXi)=i=1Nj=1Ncov(Xi,Xj)=i=1Nvar(Xi)+21i<jNcov(Xi,Xj) Var(\sum_{i=1}^NX_i) = \sum_{i=1}^N\sum_{j=1}^N cov(X_i,X_j) = \sum_{i=1}^N var(X_i) + 2\sum_{1 \le i < j \le N} cov(X_i, X_j)
      于是可以得到:
      var(X)=1N2Var(i=1NXi)=σ2N+N1Nρσ2 var(\overline X) = \frac{1}{N^2} Var(\sum_{i=1}^NX_i) = \frac{\sigma^2}{N} + \frac{N-1}{N} \rho\cdot\sigma^2

    方差部分详细推到可见:维基百科

    NN逐渐增大时,第一项趋于0,第二项趋于ρσ20<ρ1\rho\cdot\sigma^2, 0 < \rho \le 1,所以方差会减少。
    证毕。

    也就是说,从偏差-方差分解的角度看,Bagging通过取多个基学习器的平均,集成模型的方差比基学习器的方差小。偏差保持不变,从而集成模型总的性能比单个基学习器好。因此Bagging对⾮剪枝决策树、神经⽹络等容易受到样本扰动的学习器上(方差大的学习器)效果更为明显。

    此外,由于每个基学习器的训练样本来⾃于对原始训练集的随机采样,每个基学习器也会稍有不同,即Bagging中基学习器的“多样性”源于样本扰动。另外每个基学习器的训练集为⼀个⾃助采样集,只⽤到初始训练集中约 63.2% 的样本,这部分样本称为包内数据;剩下的约 36.8% 的样本称为包外数据,可当成验证集,⽤于对泛化性能进行包外估计。

    scikit-learn for bagging

    在这里插入图片描述
    在这里插入图片描述
    在Scikit-Learn中,Bagging的实现为:BaggingClassifier/BaggingRegressor,基学习器可为任意学习器,默认为决策树,既⽀持从原始样本中随机采样,也⽀持从所有原始特征中随机采样部分特征,构成基学习器的训练样本。在Bagging中,通常基学习器的数目越多,效果越好,所以参数基学习器数⽬不是模型复杂度参数,⽆需通过交叉验证来确定。但随着基学习器数⽬的增多,测试与训练的计算时间也会随之增加。且当基学习器的数量超过⼀个临界值之后,算法的效果并不会很显著变好。⼀个典型的曲线下图所示:
    在这里插入图片描述
    可以看出,基学习器的数⽬在10到40之间时,交叉验证得到的模型正确率显著增大,超过40后增加缓慢,因此我们可以取40个基学习器。
    实际应⽤中,也可以根据特征维数简单的设置基学习器数目:

    • 对分类问题,可设置基学习器数目为D\sqrt D ,其中DD为特征数目;
    • 对回归问题,可设置基学习器数目为D3\frac{D}{3}

    随机森林

    由于只是训练数据有一些不同,对决策树算法进行Bagging得到的多棵树高度相关,因此带来的方差减少有限。随机森林(Random Forest)是bagging的扩展,其本质思想仍是bagging,随机森林在很多应用案例上被证明有效,但牺牲了可解释性。下面让我们看一下它到底做了哪些改进。

    基本原理

    • 随机森林是多决策树的bagging,每个基学习器是决策树。
    • 更随机: 每个基学习器的多样性不仅来自样本的扰动,还来自属性的扰动,即随机采样一部分原始样本的属性构成基学习器的训练数据(Scikit-Learn实现的Bagging也⽀持属性扰动)。对于普通的决策树,我们会在节点上所有的NN个样本特征中选择一个最优的特征来做决策树的左右子树划分,但是随机森林通过随机选择节点上的一部分样本特征,这个数字小于NN,假设为NN',然后在这些随机选择的NN'个样本特征中,选择一个最优的特征来做决策树的左右子树划分。 这使得集成学习器的泛化性能可以通过基学习器之间差异度的增加而进⼀步提升。如果N=NN' = N,则此时随机森林的CART决策树和普通的CART决策树没有区别。NN'越小,则模型约健壮,当然此时对于训练集的拟合程度会变差。在实际案例中,一般会通过交叉验证调参获取一个合适的NN'的值。

    随机森林的优点:

    • 随机森林简单,容易实现
    • 训练效率较高。因为随机森林使⽤的决策树只需要考虑所有属性的⼦集和所有样本的⼦集。
    • 随机森林的多棵决策树可并⾏训练。
    • 随机森林在很多现实任务中性能不错,被称作 “代表集成学习技术水平的方法”
    • 随着树的数量的增加,随机森林可以有效缓解过拟合。因为随着树的数量增加,模型的方差会显著降低。但是树的数量增加并不会纠正偏差,因此随机森林还是会有过拟合。
      随机森林的主要缺点有:
    • 在某些噪音比较大的样本集上,随机森林模型容易陷入过拟合。
    • 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。

    算法流程:
    在这里插入图片描述

    Scikit-Learn

    在这里插入图片描述
    在这里插入图片描述

    例子

    在这里插入图片描述
    随机森林一般比bagging效果要好。
    在这里插入图片描述

    随机森林的推广

    致谢

    • 卿来云,中国科学院大学《模式识别与机器学习》第七章
    • 周晓飞,中国科学院大学《机器学习》 第六章
    • 刘建平
    展开全文
  • 随机森林算法学习(RandomForest)

    万次阅读 多人点赞 2017-10-21 16:25:38
    随机森林算法学习最近在做kaggle的时候,发现随机森林这个算法在分类问题上效果十分的好,大多数情况下效果远要比svm,log回归,knn等算法效果好。因此想琢磨琢磨这个算法的原理。要学随机森林,首先先简单介绍一下...

    随机森林算法学习

    最近在做kaggle的时候,发现随机森林这个算法在分类问题上效果十分的好,大多数情况下效果远要比svm,log回归,knn等算法效果好。因此想琢磨琢磨这个算法的原理。

    要学随机森林,首先先简单介绍一下集成学习方法和决策树算法。下文仅对该两种方法做简单介绍(具体学习推荐看统计学习方法的第5章和第8章)。


    Bagging和Boosting的概念与区别

    该部分主要学习自:http://www.cnblogs.com/liuwu265/p/4690486.html

    随机森林属于集成学习(Ensemble Learning)中的bagging算法。在集成学习中,主要分为bagging算法和boosting算法。我们先看看这两种方法的特点和区别。

    Bagging(套袋法)

    bagging的算法过程如下:

    1. 从原始样本集中使用Bootstraping方法随机抽取n个训练样本,共进行k轮抽取,得到k个训练集。(k个训练集之间相互独立,元素可以有重复)
    2. 对于k个训练集,我们训练k个模型(这k个模型可以根据具体问题而定,比如决策树,knn等)
    3. 对于分类问题:由投票表决产生分类结果;对于回归问题:由k个模型预测结果的均值作为最后预测结果。(所有模型的重要性相同)

    Boosting(提升法)

    boosting的算法过程如下:

    1. 对于训练集中的每个样本建立权值wi,表示对每个样本的关注度。当某个样本被误分类的概率很高时,需要加大对该样本的权值。
    2. 进行迭代的过程中,每一步迭代都是一个弱分类器。我们需要用某种策略将其组合,作为最终模型。(例如AdaBoost给每个弱分类器一个权值,将其线性组合最为最终分类器。误差越小的弱分类器,权值越大)

    Bagging,Boosting的主要区别

    1. 样本选择上:Bagging采用的是Bootstrap随机有放回抽样;而Boosting每一轮的训练集是不变的,改变的只是每一个样本的权重。
    2. 样本权重:Bagging使用的是均匀取样,每个样本权重相等;Boosting根据错误率调整样本权重,错误率越大的样本权重越大。
    3. 预测函数:Bagging所有的预测函数的权重相等;Boosting中误差越小的预测函数其权重越大。
    4. 并行计算:Bagging各个预测函数可以并行生成;Boosting各个预测函数必须按顺序迭代生成。

    下面是将决策树与这些算法框架进行结合所得到的新的算法:

    1)Bagging + 决策树 = 随机森林

    2)AdaBoost + 决策树 = 提升树

    3)Gradient Boosting + 决策树 = GBDT


    决策树

    常用的决策树算法有ID3,C4.5,CART三种。3种算法的模型构建思想都十分类似,只是采用了不同的指标。决策树模型的构建过程大致如下:

    ID3,C4.5决策树的生成

    输入:训练集D,特征集A,阈值eps 输出:决策树T

    1. 若D中所有样本属于同一类Ck,则T为单节点树,将类Ck作为该结点的类标记,返回T
    2. 若A为空集,即没有特征作为划分依据,则T为单节点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T
    3. 否则,计算A中各特征对D的信息增益(ID3)/信息增益比(C4.5),选择信息增益最大的特征Ag
    4. 若Ag的信息增益(比)小于阈值eps,则置T为单节点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T
    5. 否则,依照特征Ag将D划分为若干非空子集Di,将Di中实例数最大的类作为标记,构建子节点,由结点及其子节点构成树T,返回T
    6. 对第i个子节点,以Di为训练集,以A-{Ag}为特征集,递归地调用1~5,得到子树Ti,返回Ti

    CART决策树的生成

    这里只简单介绍下CART与ID3和C4.5的区别。

    1. CART树是二叉树,而ID3和C4.5可以是多叉树
    2. CART在生成子树时,是选择一个特征一个取值作为切分点,生成两个子树
    3. 选择特征和切分点的依据是基尼指数,选择基尼指数最小的特征及切分点生成子树

    决策树的剪枝

    决策树的剪枝主要是为了预防过拟合,过程就不详细介绍了。

    主要思路是从叶节点向上回溯,尝试对某个节点进行剪枝,比较剪枝前后的决策树的损失函数值。最后我们通过动态规划(树形dp,acmer应该懂)就可以得到全局最优的剪枝方案。


    随机森林(Random Forests)

    随机森林是一种重要的基于Bagging的集成学习方法,可以用来做分类、回归等问题。

    随机森林有许多优点:

    • 具有极高的准确率
    • 随机性的引入,使得随机森林不容易过拟合
    • 随机性的引入,使得随机森林有很好的抗噪声能力
    • 能处理很高维度的数据,并且不用做特征选择
    • 既能处理离散型数据,也能处理连续型数据,数据集无需规范化
    • 训练速度快,可以得到变量重要性排序
    • 容易实现并行化

    随机森林的缺点:

    • 当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大
    • 随机森林模型还有许多不好解释的地方,有点算个黑盒模型

    与上面介绍的Bagging过程相似,随机森林的构建过程大致如下:

    1. 从原始训练集中使用Bootstraping方法随机有放回采样选出m个样本,共进行n_tree次采样,生成n_tree个训练集
    2. 对于n_tree个训练集,我们分别训练n_tree个决策树模型
    3. 对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数选择最好的特征进行分裂
    4. 每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
    5. 将生成的多棵决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果
    展开全文
  • 随机森林(Random Forest)算法原理

    万次阅读 多人点赞 2020-04-24 15:35:00
    随机森林(Random Forest)算法原理 集成学习(Ensemble)思想、自助法(bootstrap)与bagging 集成学习(ensemble)思想是为了解决单个模型或者某一组参数的模型所固有的缺陷,从而整合起更多的模型,取长补短...

    随机森林(Random Forest)算法原理

    集成学习(Ensemble)思想、自助法(bootstrap)与bagging

    **集成学习(ensemble)**思想是为了解决单个模型或者某一组参数的模型所固有的缺陷,从而整合起更多的模型,取长补短,避免局限性。随机森林就是集成学习思想下的产物,将许多棵决策树整合成森林,并合起来用来预测最终结果。

    这里写图片描述

    首先,介绍自助法(bootstrap),这个奇怪的名字来源于文学作品 The Adventures of Baron Munchausen(吹牛大王历险记),这个作品中的一个角色用提着自己鞋带的方法把自己从湖底下提了上来。因此采用意译的方式,叫做自助法。自助法顾名思义,是这样一种方法:即从样本自身中再生成很多可用的同等规模的新样本,从自己中产生和自己类似的,所以叫做自助,即不借助其他样本数据。自助法的具体含义如下:

    如果我们有个大小为N的样本,我们希望从中得到m个大小为N的样本用来训练。那么我们可以这样做:首先,在N个样本里随机抽出一个样本x1,然后记下来,放回去,再抽出一个x2,… ,这样重复N次,即可得到N的新样本,这个新样本里可能有重复的。重复m次,就得到了m个这样的样本。实际上就是一个有放回的随机抽样问题。每一个样本在每一次抽的时候有同样的概率(1/N)被抽中。

    这个方法在样本比较小的时候很有用,比如我们的样本很小,但是我们希望留出一部分用来做验证,那如果传统方法做train-validation的分割的话,样本就更小了,bias会更大,这是不希望的。而自助法不会降低训练样本的规模,又能留出验证集(因为训练集有重复的,但是这种重复又是随机的),因此有一定的优势。

    至于自助法能留出多少验证,或者说,m个样本的每个新样本里比原来的样本少了多少?可以这样计算:每抽一次,任何一个样本没抽中的概率为 (1-1/N),一共抽了N次,所以任何一个样本没进入新样本的概率为(1-1/N)N。那么从统计意义上来说,就意味着大概有(1-1/N)N这么大比例的样本作为验证集。当N→inf时,这个值大概是1/e,36.8%。以这些为验证集的方式叫做包外估计(out of bag estimate)

    bagging的名称来源于 ( Bootstrap AGGregatING ),意思是自助抽样集成,这种方法将训练集分成m个新的训练集,然后在每个新训练集上构建一个模型,各自不相干,最后预测时我们将这个m个模型的结果进行整合,得到最终结果。整合方式就是:分类问题用majority voting,回归用均值。

    这里写图片描述

    bagging和boosting是集成学习两大阵营,之后在总结两者的异同。

    决策树(Decision Tree)与随机森林(Random Forest)

    决策树是用树的结构来构建分类模型,每个节点代表着一个属性,根据这个属性的划分,进入这个节点的儿子节点,直至叶子节点,每个叶子节点都表征着一定的类别,从而达到分类的目的。

    常用的决策树有ID4,C4.5,CART等。在生成树的过程中,需要选择用那个特征进行剖分,一般来说,选取的原则是,分开后能尽可能地提升纯度,可以用信息增益,增益率,以及基尼系数等指标来衡量。如果是一棵树的话,为了避免过拟合,还要进行剪枝(prunning),取消那些可能会导致验证集误差上升的节点。

    随机森林实际上是一种特殊的bagging方法,它将决策树用作bagging中的模型。首先,用bootstrap方法生成m个训练集,然后,对于每个训练集,构造一颗决策树,在节点找特征进行分裂的时候,并不是对所有特征找到能使得指标(如信息增益)最大的,而是在特征中随机抽取一部分特征,在抽到的特征中间找到最优解,应用于节点,进行分裂。随机森林的方法由于有了bagging,也就是集成的思想在,实际上相当于对于样本和特征都进行了采样(如果把训练数据看成矩阵,就像实际中常见的那样,那么就是一个行和列都进行采样的过程),所以可以避免过拟合。

    prediction阶段的方法就是bagging的策略,分类投票,回归均值。

    2018年02月23日23:47:44

    reference:

    http://www.scholarpedia.org/article/Ensemble_learning

    展开全文
  • 随机森林的原理分析及Python代码实现

    万次阅读 多人点赞 2020-05-28 10:29:32
    在讲随机森林前,我先讲一下什么是集成学习。集成学习通过构建并结合多个分类器来完成学习任务。集成学习通过将多个学习器进行结合,常可获得比单一学习器更好的泛化性能。 考虑一个简单例子:在二分类任务中,假定...

    2020.3.23添加:

    哈哈,迟来的源码,我把它放到GitHub上了:包含详细注释的随机森林源码;欢迎取用,欢迎讨论,欢迎star;

    我才发现CSDN的资源下载自动要求这么多积分,我之前上传的时候是限定0积分的。。

    ###################正文分割线######################

    在讲随机森林前,我先讲一下什么是集成学习。集成学习通过构建并结合多个分类器来完成学习任务。集成学习通过将多个学习器进行结合,常可获得比单一学习器更好的泛化性能。

    考虑一个简单例子:在二分类任务中,假定三个分类器在三个测试样本上的表现如下图,其中√表示分类正确,×表示分类错误,集成学习的结果通过投票法产生,即“少数服从多数”。如下图,在(a)中,每个分类器都只有66.6%的精度,但集成学习却达到了100%;在(b)中,三个分类器没有差别,集成之后性能没有提高;在(c)中,每个分类器的精度都只有33.3%,集成学习的结果变得更糟。这个简单地例子显示出:要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定的“准确性”,即学习器不能太差,并且要有“多样性”,即学习器间具有差异。

     

     

    根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类,即个体学习器之间存在强依赖关系,必须串行生成的序列化方法,以及个体学习器间不存在强依赖关系,可同时生成的并行化方法;前者的代表是Boosting,后者的代表是Bagging和“随机森林”(Random Forest)

    Bagging与随机森林

    要得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立,虽然这在现实任务中很难做到,但我们可以设法使基学习器尽可能具有较大的差异。

    在我的实验中,使用“自助采样法”:给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过m次随机操作,我们得到含m个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。

    按照这种方法,我们可以采样出T个含m个训练样本的采样集,然后基于每个采样集训练处一个基学习器,再将这些基学习器进行结合,这就是Bagging的基本流程。在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法。

     

    随机森林是Bagging的一个扩展。随机森林在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择(即引入随机特征选择)。传统决策树在选择划分属性时时在当前节点的属性集合(假定有d个属性)中选择一个最优属性;而在随机森林中,对基决策树的每个节点,先从该节点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数k控制了随机性的引入程度:若令k=d,则基决策树的构建与传统决策树相同;若令k=1,则是随机选择一个属性进行划分。

    在这篇文章中,我们只讲随机森林的分类部分。随机森林用于分类时,即采用n个决策树分类,将分类结果用简单投票法得到最终分类,提高分类准确率。

    对于决策树不太了解的童鞋,可以看我的上一篇博客:决策树原理及Python代码实现

    简单来说,随机森林就是对决策树的集成,但有两点不同:

    (1)采样的差异性:从含m个样本的数据集中有放回的采样,得到含m个样本的采样集,用于训练。这样能保证每个决策树的训练样本不完全一样。

    (2)特征选取的差异性:每个决策树的n个分类特征是在所有特征中随机选择的(n是一个需要我们自己调整的参数)

    随机森林需要调整的参数有:

    (1)    决策树的个数

    (2)    特征属性的个数

    (3)    递归次数(即决策树的深度)

     

    下面,讲一下如何用代码实现随机森林。

    代码实现流程:

    (1)    导入文件并将所有特征转换为float形式

    (2)    将数据集分成n份,方便交叉验证

    (3)    构造数据子集(随机采样),并在指定特征个数(假设m个,手动调参)下选取最优特征

    (4)    构造决策树

    (5)    创建随机森林(多个决策树的结合)

    (6)    输入测试集并进行测试,输出预测结果

     

    (1)    导入文件并将所有特征转换为float形式

     

    #加载数据
    def loadCSV(filename):
        dataSet=[]
        with open(filename,'r') as file:
            csvReader=csv.reader(file)
            for line in csvReader:
                dataSet.append(line)
        return dataSet
    
    #除了判别列,其他列都转换为float类型
    def column_to_float(dataSet):
        featLen=len(dataSet[0])-1
        for data in dataSet:
            for column in range(featLen):
                data[column]=float(data[column].strip())

    (2)    将数据集分成n份,方便交叉验证

     

     

    #将数据集分成N块,方便交叉验证
    def spiltDataSet(dataSet,n_folds):
        fold_size=int(len(dataSet)/n_folds)
        dataSet_copy=list(dataSet)
        dataSet_spilt=[]
        for i in range(n_folds):
            fold=[]
            while len(fold) < fold_size:   #这里不能用if,if只是在第一次判断时起作用,while执行循环,直到条件不成立
                index=randrange(len(dataSet_copy))
                fold.append(dataSet_copy.pop(index))  #pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
            dataSet_spilt.append(fold)
        return dataSet_spilt
    


    (3)    构造数据子集(随机采样),并在指定特征个数(假设m个,手动调参)下选取最优特征

     

    #构造数据子集
    def get_subsample(dataSet,ratio):
        subdataSet=[]
        lenSubdata=round(len(dataSet)*ratio)
        while len(subdataSet) < lenSubdata:
            index=randrange(len(dataSet)-1)
            subdataSet.append(dataSet[index])
        #print len(subdataSet)
        return subdataSet
    
    #选取任意的n个特征,在这n个特征中,选取分割时的最优特征
    def get_best_spilt(dataSet,n_features):
        features=[]
        class_values=list(set(row[-1] for row in dataSet))
        b_index,b_value,b_loss,b_left,b_right=999,999,999,None,None
        while len(features) < n_features:
            index=randrange(len(dataSet[0])-1)
            if index not in features:
                features.append(index)
        #print 'features:',features
        for index in features:
            for row in dataSet:
                left,right=data_spilt(dataSet,index,row[index])
                loss=spilt_loss(left,right,class_values)
                if loss < b_loss:
                    b_index,b_value,b_loss,b_left,b_right=index,row[index],loss,left,right
        #print b_loss
        #print type(b_index)
        return {'index':b_index,'value':b_value,'left':b_left,'right':b_right}

     

     

     

    (4)    构造决策树

     

    #构造决策树
    def build_tree(dataSet,n_features,max_depth,min_size):
        root=get_best_spilt(dataSet,n_features)
        sub_spilt(root,n_features,max_depth,min_size,1) 
        return root
    

     

    (5)    创建随机森林(多个决策树的结合)

     

    #创建随机森林
    def random_forest(train,test,ratio,n_feature,max_depth,min_size,n_trees):
        trees=[]
        for i in range(n_trees):
            subTrain=get_subsample(train,ratio)
            tree=build_tree(subTrain,n_features,max_depth,min_size)
            #print 'tree %d: '%i,tree
            trees.append(tree)
        #predict_values = [predict(trees,row) for row in test]
        predict_values = [bagging_predict(trees, row) for row in test]
        return predict_values


    (6)    输入测试集并进行测试,输出预测结果

     

    #预测测试集结果
    def predict(tree,row):
        predictions=[]
        if row[tree['index']] < tree['value']:
            if isinstance(tree['left'],dict):
                return predict(tree['left'],row)
            else:
                return tree['left']
        else:
            if isinstance(tree['right'],dict):
                return predict(tree['right'],row)
            else:
                return tree['right']
       # predictions=set(predictions)

     

     

     

    对以上代码的一点总结:

    训练部分:假设我们取dataset中的m个feature来构造决策树,首先,我们遍历m个feature中的每一个feature,再遍历每一行,通过spilt_loss函数(计算分割代价)来选取最优的特征及特征值,根据是否大于这个特征值进行分类(分成left,right两类),循环执行上述步骤,直至不可分或者达到递归限值(用来防止过拟合),最后得到一个决策树tree。

    测试部分:对测试集的每一行进行判断,决策树tree是一个多层字典,每一层为一个二分类,将每一行按照决策树tree中的分类索引index一步一步向里层探索,直至不出现字典时探索结束,得到的值即为我们的预测值。

    附上:包含详细注释的随机森林源码

    参考:

    《机器学习》作者:周志华

    从头开始:用Python实现随机森林算法

    展开全文
  • 随机森林算法及其实现(Random Forest)

    万次阅读 多人点赞 2018-09-04 16:36:39
    1 什么是随机森林? 2 随机森林的特点 3 随机森林的相关基础知识 4 随机森林的生成 5 袋外错误率(oob error) 6 随机森林工作原理解释的一个简单例子 7 随机森林的Python实现 8 参考内容 回到顶部 1 什么是...
  • 集成学习:Bagging与随机森林

    千次阅读 2016-04-13 16:26:50
    集成学习:Bagging与随机森林
  • 博客原文:https://blog.csdn.net/qq547276542/article/details/78304454 ... 随机森林算法学习 最近在做kaggle的时候,发现随机森林这个算法在分类问题上效果十分的好,大多数情况下效果远要比svm,逻辑回归...
  • 集成学习至此我们已经了解了许多机器学习的方法~但是都是单枪匹马的作战,这节我们讨论的集成学习(ensemble learning)是通过构建并结合多个学习器来完成学习任务。 个体学习器可以是弱学习器,所谓弱学习器,就是...
  • 一,介绍 Bagging算法:假定有m个训练集,我们采用自助采样法,每次随机抽取一个放入采样集中,然后再把样本放回训练集,一共...随机森林随机森林是Bagging算法的扩展。在以决策树为基学习器构建bagging集成的基...
  • 随机森林

    千次阅读 2019-08-07 20:48:11
    集成学习与个体学习器 集成学习 (ensemble learning)通过构建并结合多个学习器来完成学习任务。先产生一组"个体学习器" (individual learner),再用某种策略将它们结合起来。 个体学习器通常由一个现有的学习算法从...
  • 【机器学习】 随机森林(Random Forest)

    万次阅读 多人点赞 2018-08-24 13:12:25
     作为新兴起的、高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的...
  • 用通俗易懂的方式剖析随机森林

    万次阅读 多人点赞 2018-11-07 23:01:48
    用通俗易懂的方式剖析随机森林 0.引言 随机森林是现在比较流行的一个算法。对于回归和分类问题有很好的效果。大家有可能有过这样的经历,辛辛苦苦搭好神经网络,最后预测的准确率还不如随机森林。既然随机森林这么...
  • 随机森林的优缺点

    万次阅读 2015-08-06 19:50:11
    网上有很多关于随机森林优缺点的总结,但是都只是抄来抄去,并没有对这些优缺点作说明,导致有些看不懂。本人根据自己的理解,对某些优缺点做一下说明,如果理解有不对的地方,欢迎大家指正。  随机森林是一个用...
  • 我需要用R语言实现随机森林的分类 R语言以前没学过 但是需要用 所以我想看看 别人是怎么使用 R语言实现随机森林的分类
  • 随机森林的随机性体现在哪里?

    千次阅读 2018-04-19 21:46:09
    随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。随机森林的随机性体现在每颗树的训练样本是随机的,树中每个节点的分裂属性集合也是随机选择确定的。有了这2个随机的保证...
  • 在前面一节,你学习了如何利用L1正则将不相干...sklearn中已经实现了用随机森林评估特征重要性,在训练好随机森林模型后,直接调用feature_importances属性就能得到每个特征的重要性。下面用Wine数据集为例,我们训...
  • 随机森林(Random forest,RF)的生成方法以及优缺点

    万次阅读 多人点赞 2018-03-13 20:20:25
    随机森林(Random Forest)是属于集成学习的一种组合分类算法(确切说是属于bagging),集成学习的核心思想就是将若干个弱(基)分类器组合起来,得到一个分类性能显著优越的强分类器。如果各弱分类器之前没有强依赖...
  • 随机森林做特征选择

    万次阅读 2017-05-14 15:18:27
    关于随机森林的介绍,...对于随机森林中的一颗决策树,其训练数据集是使用Bagging方法得到的,即套袋法,还有大约1/3的袋外数据我们可以用它进行特征重要性的度量,假设针对某个特征X,我们利用套袋法建立了一颗决策
  • 随机森林的特征重要性原理

    千次阅读 2018-05-25 17:04:39
    1、随机森林得到的feature importance的原理?答:在随机森林中某个特征X的重要性的计算方法如下:1:对于随机森林中的每一颗决策树,使用相应的OOB(袋外数据)数据来计算它的袋外数据误差,记为errOOB1.2: 随机地对袋...
  • 随机森林和GBDT的区别

    万次阅读 2017-09-16 18:16:17
    一,随机森林随机森林是一个用随机方式建立的,包含多个决策树的集成分类器。其输出的类别由各个树投票而定(如果是回归树则取平均)。假设样本总数为n,每个样本的特征数为a,则随机森林的生成过程如下: 从原始...
1 2 3 4 5 ... 20
收藏数 39,913
精华内容 15,965
关键字:

随机森林