随机森林算法通俗易懂(改进的随机森林算法)

    1)决策树    2)随机森林    4)OutofBag评价    3)随机森林的应用计算特征重要性异常值检测——IsolationForest计算样本的相似度 …

大家好,又见面了,我是你们的朋友全栈君。

        前面几篇我们探讨了决策树算法集成学习方法,今天我们就来探讨下基于bagging集成的决策树算法——随机森林(Random Forest)。随机森林虽然简单,但它是最强大的机器学习算法之一,也是实际应用中非常常用的算法之一,是我们必须要掌握的算法。
        首先让我们简单的回顾下决策树算法,因为它是随机森林的基础。
       

1)决策树

        决策树最大的特点就是直观,易解释。大家生活中在某一个时刻也在无意或有意的使用它,比如我们之前举的借钱的栗子。
        决策树算法根据特征选择的方式不同,可以分为ID3算法,C4.5算法,CART算法。在CART算法中,使用Gini指数做特征选择,选择Gini指数最小的特征以及其对应的切分点作为最优特征与最优的切分点,循环反复直到满足停止条件。
        由于决策树几乎不对训练数据做任何的假设,在不添加任务约束,树结构将会根据训练数据的特性自由生长,达到百分百的正确率。为了提高决策树的泛化能力,决策树使用了剪枝的方法。但是剪枝在减少模型方差的同时,也减小了模型的偏差(准确度)。那么有没有其他方法,在降低模型方差的同时,又不降低显著降低模型偏差?非常巧,上一篇我们提到的bagging集成方法正好有这个特性。
        使用bagging集成多颗决策树(CART树)就叫做随机森林。
       

2)随机森林

        我们在上篇在探讨bagging集成学习方法时,提到bagging集成方法有效的前提条件是,基模型之间必须保持低相关性,低相关性才能保证基模型之间的差异性,有差异性的基模型组合在一起才能成为一个更强大模型。
        为了让CART树有更大差异性,随机森林除了对样本进行随机过采样,增加训练集的随机性之外,还在树的生成时引入了额外的随机,即特征随机。在树的生成时,选择随机采样的特征中的最好的特征作为分裂节点,这样使得每棵树有更大的差异性。

        下面我们总结下随机森林的算法过程:
        输入:数据量为 m m m的训练集 D D D T T T颗CART树
        输出:最终的随机森林 f ( x ) f(x) f(x)
1)对训练集 D D D进行 m m m次随机过采样,得到样本量为 m m m的采样集 D s a m p l e D_{sample} Dsample
2)在所有属性特征中随机选择 k k k个属性特征,选择最佳分割属性特征作为节点构建CART树 T ( x ) T(x) T(x)
3)重复以上两步 T T T次,即建立了 T T T颗决策树;
4)这 T T T颗决策树组成随机森林。如果是分类算法预测,则通过投票表决数据最终属于哪一个类别;如果是回归预测,则 通过平均作为最终模型的输出。
       

4)Out of Bag评价

        对于Bagging,采用有放回的采样,那么一些样本可能被多次重复采样,有一些可能不会被采样。对于一个大小为 m m m的训练集进行随机采样,样本每一次被采样的概率为 1 m \frac{1}{m} m1,没有被采样到的概率为 1 − 1 m 1-\frac{1}{m} 1m1 m m m次都没有被采样到的样本的概率为 ( 1 − 1 m ) m {(1-\frac{1}{m})}^m (1m1)m,当 m → ∞ m\rightarrow \infty m时,
                                                                        lim ⁡ m → + ∞ = 1 e ≈ 0.368 {\lim_{m \to +\infty}}=\frac{1}{e}\approx0.368 limm+=e10.368
        也就是说,对于大小为 m m m的训练集,平均只有63.2%的样本被每个分类器采样,剩余的36.8%没有被采样到,没有被采样的样本被称为Out of Bag。
        注意,每个分类器的36.8%的样本是不一样的。由于分类器在训练的时候没有使用到Out of Bag的样本数据,因此这部分可以用来评估分类器,进而不需要另外划分验证集或者做交叉验证了。在sklearn随机森林库类中,你可以通过oob_score=True来自动评估,评估结果通过oob_score_查看,具体我们下篇再探讨。
       

3)随机森林的其他应用

        随机森林除了做正常的分类与回归预测,还可以使用到其他的一些场景。

  • 计算特征重要性
            使用随机森林计算特征的重要性应该是我们使用的最多的一个场景了。计算特征重要性的指标有很多,可以使用经过特征节点的样本比例、特征节点的纯度减少、特征在随机森林所有的树中的平均深度、或者随机更换一些特征,重新建立决策树,计算新模型的正确率的变化。scikit-learn中随机森林库类通过将特征贡献的样本比例与纯度减少相结合得到特征的重要性。

  • 异常值检测——Isolation Forest
           使用随机森林也可以做异常值检测。原理为,计算所有树中每一个样本从根到叶子的距离总和 D ( x ) D(x) D(x),如果样本为异常值,它应该在大多数树中很快就能从根到达叶子,即D(x)较小。

  • 计算样本的相似度
           使用随机森林还可以计算样本的相似度。原理为,如果两个样本同时出现在相同的叶节点的次数越多,则二者越相似。
           

4)总结

        下面我们对随机森林算法的优缺点做一个总结。

        随机森林的主要优点:

  • 支持并行处理;
  • 不需要对特征进行标准化处理;
  • 不需要对特征缺失值进行处理;
  • 模型较稳定,泛化能力强;
  • 模型可以输出特征重要性;
  • 使用Out of Bag,不需要单独划分测试集;

随机森林的主要缺点:

  • 由于有多个基模型组合而成,模型不易解释;
  • 树较多时,训练时间比较久;

       
        随机森林是非常强大的算法,可以作为我们做分类任务首要尝试的算法。

(欢迎大家在评论区探讨交流,也欢迎大家转载,转载请注明出处!)
       
上篇:集成学习方法之Bagging,Boosting,Stacking
下篇:Scikit-learn随机森林算法库总结与调参实践

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128947.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 皮尔逊相似度计算的例子(R语言)

    皮尔逊相似度计算的例子(R语言)

    2022年1月13日
    39
  • 项目运行指标:micrometer自定义metrics

    项目运行指标:micrometer自定义metricsmicrometer 自定义 metricsmicro 提供了基于 Java 的 monitorfacad 其与 springboot 应用和 prometheus 的集成方式如下图展示上图中展示的很清楚 应用通过 micrometer 采集和暴露监控端点给 prometheus prometheus 通过 pull 模式来采集监控时序数据信息 之后作为数据源提供给 grafana 进行展示 micrometer 支持的度量方式及在 springboot 中的应用示例 CounterCount 计数器 简单理解

    2025年7月17日
    3
  • ios系统软件迁移到安卓_苹果一键换机到安卓(苹果安卓一键迁移的软件)

    ios系统软件迁移到安卓_苹果一键换机到安卓(苹果安卓一键迁移的软件)去年开始,以iPhone为首的苹果系列产品,在中国销量出现严重下滑。2018年第四季度,苹果出货量下降约300万台,同比下降约22%。全年,iPhone出货量从2017年的3670万台,下降至2018年3420万台。苹果在中国市场销量跌跌不休已是不争事实。产品缺乏创新,价格屡创新高,消费者升级欲望随之降低。虽然整个手机大环境由增量市场转为存量市场,但每年换机的用户量依然庞大。这个现象现已逐步由国内…

    2022年5月26日
    132
  • 电脑安装winpe_北京科兴中维新冠疫苗最新消息

    电脑安装winpe_北京科兴中维新冠疫苗最新消息在WinPE安装操作系统,最好用虚拟光驱打开安装镜像文件,或者把镜像文件解压后直接安装。最好不要用工具盘里所带的一键安装,复制等等功能,因为这些功能往往会安装一些其他的附带功能,不是清洁版的。转载于:https://www.cnblogs.com/cuihongyu3503319/p/4657993.html…

    2025年5月28日
    2
  • Linux 下查看java进程

    Linux 下查看java进程Linux下查看和停止所有java进程1.ps-ef|grepjava在Linux下查看所有java进程命令:ps-ef|grepjava停止特定java进程命令:kill-9java进程序号停止所有java进程命令:pkill-9java2.jpsjps-l-v比较常用的参数:-q只显示pid,不显示class名称,jar文件名和传递给main方…

    2022年8月24日
    9
  • java字符串分割split你用对了吗「建议收藏」

    java字符串分割split你用对了吗「建议收藏」一、split介绍split()方法根据匹配给定的正则表达式来拆分字符串。注意:.、$、|和*等转义字符,必须得加\\。注意:多个分隔符,可以用|作为连字符。语法publicString[]split(Stringregex,intlimit)参数 regex–正则表达式分隔符。 limit–分割的份数。 返回值字符串数组。二、测试一如下示例,猜猜答案吧privatestaticvoid…

    2022年9月28日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号