https://www.toutiao.com/a6702220605514580493/

机器学习的一个重要部分是分类,我们想知道一个观察结果属于哪个分类(也就是组)。对观察结果进行精确分类的能力对于各种业务应用程序都非常有价值,比如预测特定用户是否会购买产品,或者预测给定贷款是否会违约。

数据科学提供了大量的分类算法,如逻辑回归、支持向量机、朴素贝叶斯分类器和决策树。

在这篇文章中,我们将研究基本决策树是如何工作的,如何将个体决策树组合成一个随机森林,并最终发现为什么随机森林在它自己的领域十分如鱼得水。

决策树

让我们快速回顾一下决策树,因为它们是随机森林模型的构建块。幸运的是,它们非常直观。我敢打赌,大多数人在生活的某个时刻,都有意无意地使用过这个决策树。

简单决策树示例

我们通过一个例子来理解决策树的工作原理可能要容易得多。

假设我们的数据集由左上方的数字组成。我们有两个1和5个0(1和0是我们的类),并且希望使用它们的特性来分隔类。主要的特征是颜色(红色和蓝色)以及观察是否加下划线。那么我们怎么做呢?

颜色似乎是一个非常明显的特征,因为除了一个0以外,所有的0都是蓝色的。所以我们可以用"是不是红色"来分隔第一个节点。你可以将树中的节点视为路径分成两个部分的点,从而使满足条件的观察值沿着Yes分支向下,而不沿着No分支向下。

No分支(蓝色)现在都是0,所以我们已经完成了,但是Yes分支仍然可以被进一步分隔。现在我们可以使用第二个特性并询问:"它是否带下划线?"可第二次分隔。

带下划线的两个1向下到Yes子分支上,而没有下划线的0向下到右边的子分支上,这些我们都做完了。我们的决策树能够使用这两个特性来完美地分割数据。

显然,在现实生活中,我们的数据不会这么干净,但是决策树所使用的逻辑是相同的。在每个节点,它会问

什么特征将允许我以一种方式分割手头的观察结果,使得结果组尽可能彼此不同(并且每个结果子组的成员尽可能彼此相似)?

随机森林分类器

随机森林,顾名思义,由大量独立的决策树组成,它们作为一个整体运行。随机森林中的每棵树都有一个类预测,投票最多的类将成为我们模型的预测(见下图)。

预测随机森林模型的可视化

模型之间的低相关性是关键。就像低相关性的投资(如股票和债券)如何组合在一起形成一个大于各部分之和的投资组合一样,不相关模型也可以产生比任何单个预测更准确的总体预测。产生这种奇妙效果的原因是,树木可以互相保护,避免各自的错误(只要它们不总是在同一个方向出错)。虽然有些树可能是错的,但是很多其他的树是对的,所以作为一个群体,这些树能够朝着正确的方向移动。因此,随机森林要想表现良好,其先决条件是:

  1. 我们的特性中需要有一些实际的信号,这样使用这些特性构建的模型才能比随机猜测做得更好。
  2. 单个树做出的预测(以及由此产生的误差)需要彼此之间具有较低的相关性。

这就是为什么不相关的结果如此之好

拥有许多不相关的模型的奇妙效果是一个非常重要的概念,因此我想向你展示一个示例来帮助你真正的理解它。想象一下,我们正在玩以下游戏:

  • 我用一个均匀分布的随机数发生器来产生一个数字。
  • 如果我生成的数大于或等于40,你赢了(所以你就有60%的机会赢),我付给你一些钱。如果低于40,我赢,你付给我同样的金额。

现在我为你提供以下的选择。 我们可以:

  • 游戏1: 玩100次,每次下注1美元。
  • 游戏2: 玩10次,每次下注10美元。
  • 游戏3: 玩一次,下注100美元。

你会选哪一个?每款游戏的期望值相同:

  • 第一场期望值= (0.60*1 + 0.40*-1)*100 = 20
  • 第二场期望值= (0.60*10 + 0.40*-10)*10 = 20
  • 第三场期望值= 0.60*100 + 0.40*-100 = 20

每个游戏10000个模拟结果的分布

那分布呢?让我们用蒙特卡洛模拟可视化结果(我们将对每种游戏类型运行10,000个模拟;例如,我们将模拟10000次游戏1)的100个玩法。尽管期望值是相同的,但结果分布从正的和窄的(蓝色)到二进制(粉红色)大不相同。

游戏1(我们玩100次)提供了赚钱的最佳机会,在我运行的10,000个模拟中,97%的模拟都是赚钱的!对于游戏2(我们玩了10次),你在63%的模拟中赚钱,大幅下降(并且你的赔钱概率急剧增加)。而我们只玩了一次游戏3,你在60%的模拟中赚钱,正如预期的那样。

因此,即使游戏具有相同的期望值,它们的结果分布也完全不同。我们把100美元的赌注分成不同的部分越多,我们就越有信心赚到钱。如前所述,这是因为每个剧本都是独立于其他剧本的。

随机森林是一样的,每棵树就像我们之前游戏中的一棵树。我们发现我们玩的次数越多,赚钱的机会就越多。同样,对于随机森林模型,我们做出正确预测的机会随着模型中不相关树的数量增加而增加。

如果你想自己运行模拟游戏的代码,你可以在我的GitHub上找到它。GitHub - yiuhyuk/coin_flip_game: Used to illustrate why bagging is effective

确保模型之间的多样化

那么,随机森林如何确保每棵树的行为与模型中其他树的行为不太相关呢?它使用了以下两种方法:

Bagging (Bootstrap Aggregation)——决策树对它们所训练的数据非常敏感,且对训练集的微小更改可以导致明显不同的树结构。随机森林利用了这一点,允许每棵单独的树从数据集中随机抽取样本,并进行替换,从而生成不同的树。这个过程被称为bagging。

注意,使用bagging时,我们没有将训练数据细分为更小的块,而是在不同的块上训练每棵树。相反,如果我们有一个大小为N的样本,我们仍然向每棵树提供一个大小为N的训练集(除非另有说明)。但是我们没有使用原始的训练数据,而是随机抽取一个N大小的样本进行替换。例如,如果我们的训练数据是[1、2、3、4、5、6],那么我们可以给我们的树中的一个列表[1、2、2、3、6、6]。注意,这两个列表的长度都是6,并且"2"和"6"都在随机选择的训练数据中重复出现,我们将这些数据提供给我们的树(因为我们使用替换抽样)。

随机森林模型中的节点分裂基于每棵树的随机特征子集

特征随机性——在一个普通的决策树中,当需要分割一个节点时,我们考虑每一个可能的特征,并选择一个在左节点和右节点的观察结果之间产生最大分离的特征。相反,随机森林中的每棵树只能从特征的随机子集中选取。这使得模型中的树之间的差异更大,最终导致树之间的相关性更低,多样性更强。

让我们来看一个可视化的例子,在上面的图中,传统的决策树(蓝色)在决定如何分割节点时可以从所有四个特性中进行选择。它决定使用Feature 1(黑色和下划线),因为它将数据分割成尽可能分离的组。

现在我们来看看随机森林。在本例中,我们将只研究森林中的两棵树。当我们检验随机森林树1时,我们发现它只能考虑feature 2和feature 3(随机选择)来进行节点分割决策。我们从传统的决策树(蓝色)中知道,Feature 1是用于分割的最佳特性,但是树 1不能看到Feature 1,因此它只能选择Feature 2(黑色,下划线)。另一方面,树2只能看到特性1和特性3,因此它能够选择Feature 1。

因此,在我们的随机森林中,我们得到的树不仅针对不同的数据集进行训练(多亏了bagging),而且还使用不同的特性来做出决策。

所以,这就创建了不相关的树来缓冲和保护彼此不受错误的影响。

结论

随机森林是我个人的最爱。因为来自金融和投资领域的圣杯,总是建立一堆不相关的模型,每个模型都有正的预期回报,然后把它们放在一个投资组合中,获得巨大的alpha(alpha =市场跳动回报)。说起来容易做起来难!

随机森林是数据科学的等价物。让我们最后复习一次,什么是随机森林分类器?

随机森林是一种由许多决策树组成的分类算法。在构建每棵单独的树时,它使用bagging和特征随机性,试图创建一个不相关的树的森林,委员会的预测比任何单独的树都准确。

为了让我们的随机森林做出准确的类预测,我们需要什么?

  1. 我们需要至少具有一定预测能力的特性。毕竟,如果我们把垃圾放进去,我们就会把垃圾拿出来。
  2. 森林中的树木以及更重要的是,它们的预测需要不相关(或者至少彼此之间的相关性较低)。虽然算法本身通过特征随机性试图为我们设计这些低相关性,但是我们选择的特征和我们选择的超参数也会影响最终的相关性。

一篇文章教你搞定传说中的“随机森林”相关推荐

  1. java 不重启部署_一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

    一.通过配置文件控制静态资源的热部署 在配置文件 application.properties 中添加: #表示从这个默认不触发重启的目录中除去static目录 spring.devtools.res ...

  2. 一篇文章带你搞定 MongoDB 实现 REST

    文章目录 一.前期准备 二.SpringBoot 实现 MongoDB 的 REST 三.使用 Postman 测试使用 一.前期准备 首先使用 docker 搭建好 MongoDB:一篇文章带你搞定 ...

  3. 一篇文章带你搞定19年数学建模机场出租车优化问题示例讲解含代码

    文章目录 一.问题分析 二.数据介绍 三.模型的求解 四.结果分析 一.问题分析 收集国内某一机场及其所在城市出租车的相关数据,给出该机场出租车司机的选择方案,并分析模型的合理性和对相关因素的依赖性. ...

  4. 一篇文章帮你搞定JVM中的堆

    文章目录 一篇文章帮你搞定JVM中的堆 堆的核心概述 堆的内存细分 设置堆内存大小与OOM OOM(OutOfMemory)举例 年轻代与老年代 图解对象分配过程 MinorGC,MajorGC,Fu ...

  5. 如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 三分割据纡筹策,万古云霄一羽毛. ...

  6. 一篇文章带你搞定二维插值的 MATLAB 计算

    前面已经学习了二维插值的基本概念:一篇文章带你认识数学建模中的二维插值 本篇文章主要实现使用MATLAB进行二维插值计算 文章目录 一.网格节点的插值计算 二.散点数据的插值计算 1. 示例 1 2. ...

  7. 一篇文章带你搞定 SpringBoot 自定义欢迎页和网页图标 favicon

    文章目录 一.SpringBoot 自定义项目启动欢迎页 二.SpringBoot 自定义 favicon 一.SpringBoot 自定义项目启动欢迎页 已经分析过SpringBoot 的资源访问路 ...

  8. 随机森林c++_100天搞定机器学习|Day3334 随机森林

    点击上方"机器学习与统计学",选择"置顶"公众号 重磅干货,第一时间送达 前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性 ...

  9. mysql 帮助命令_一篇文章帮你搞定所有MySQL命令!

    MySQL的基本操作可以包括两个方面:MySQL常用语句如高频率使用的增删改查(CRUD)语句和MySQL高级功能,如存储过程,触发器,事务处理等.而这两个方面又可以细分如下: MySQL常用语句 表 ...

最新文章

  1. 济南python工资一般多少钱-济南python开发培训机构哪个好
  2. 从程序员的角度分析微信小程序
  3. 操作系统(二十)进程互斥的硬件实现方法
  4. 视频中的目标检测与跟踪综述
  5. 博士申请 | 美国布兰迪斯大学张初旭教授招收机器学习方向全奖博士生
  6. 驰骋表单设计器 设计表单案例演示
  7. BeanUtil使用例子:解析并转化HttpServletRequest到Bean的全面测试
  8. (王道408考研操作系统)第三章内存管理-第一节1:内存基础知识、程序编译运行原理
  9. 上过云么?一行代码秒上云体验过么?
  10. Spring+springmvc+hibernate+redis整合配置文件
  11. java web几百万分页_举例详解用Java实现web分页功能的方法
  12. qq空间显示手机型号android,手机qq空间发说说怎么修改/隐藏显示的手机型号?
  13. html5 预览dwg,哪个企业网盘可以实现dwg在线预览?
  14. android 输入法下一步,Android Edittext 软键盘输入法回车键改成下一步Next
  15. 美通社企业新闻汇总 | 2019.1.16 | 微软与药店巨头沃博联达成战略合作,科勒中国第13家工厂落成...
  16. 【Oracle】ngrok 映射数据库地址为外网
  17. Android-安卓Canvas画小黄人
  18. 计算机一级常用计算公式,软考网络工程师常用计算公式汇总1
  19. [高通SDM450][Android9.0]CTA认证--去掉彩信、短信、通话功能
  20. 没有公网IP,快速免费内网穿透

热门文章

  1. 索引块与数据块的区别
  2. ECLIPSE 调试F8-------运行到下一断点处 F5-------STEP INTO F6-------STEP OVER
  3. LIVE 预告 | CVPR 2021 预讲 · 美团专场,覆盖实例分割,图像分割,表情识别,特征选择和对齐...
  4. 人工智能助力北京冬奥会
  5. 作为程序员,你在编程中吃了哪些数学的亏?
  6. 什么是二进制数 为什么用二进制数表示计算机信息?
  7. 第一次全面揭示世界软件巨人微软致胜的技术奥秘
  8. 谷歌教机器人理解语义,像人一样学习复杂技能 | 附3篇论文
  9. 区块链项目实战 - 使用以太坊/智能合约solidity,全栈开发区块链借贷记账小应用,含完整源码
  10. 区块链相关论文研读2 - vChain,关于可验证的查询