随机森林和决策树

随机森林和决策树,本文是随机森林和决策树的权威指南。

在我看来,大多数机器学习教程对初学者不够友好。
上个月,我为初学者写了一篇关于神经网络的介绍。本文将采用相同的策略,这意味着它再次假定机器学习的先验知识为零。我们将学习什么是随机森林,以及它们是如何从头开始工作的。
准备好了吗?就让我们一探究竟吧。

决策树🌲

一个随机森林🌲🌲🌲实际上是一群决策树🌲捆绑在一起(啊这就是为什么它被称为森林)。在进入森林之前,我们需要谈谈树木。
看看下面的数据集:
随机森林和决策树
如果我告诉你有一个新的点,它的x坐标是1,你认为它会是什么颜色?
蓝色的,对吗?
你只是在脑中评估了一个决策树:
随机森林和决策树

这是一个简单的决策树,其中一个决策节点测试x< 2。如果测试通过(x < 2),我们取左边的分支并选择蓝色。如果测试失败(x \geq 2),我们选择右边的分支并选择绿色。
随机森林和决策树
数据集,在x=2处分割

决策树通常用于回答这类问题:给定一个标记数据集,我们应该如何对新样本进行分类?

标记:我们的数据集被标记是因为每个点都有一个类(颜色):蓝色或绿色。

分类:对一个新的数据点进行分类就是给它分配一个类(颜色)。

这是一个数据集,现在有3类,而不是2:
随机森林和决策树
数据集v2

原来的决策树不再有效了。给定一个新的点(x,y):

  • 如果x \geq 2,我们仍然可以放心地将其归类为绿色。
  • 如果x< 2,我们不能立即将其归类为蓝色——它也可以是红色。

我们需要在决策树中添加另一个决策节点:
随机森林和决策树
随机森林和决策树
很简单,对吧?这就是决策树背后的基本思想。

训练决策树

让我们开始训练一个决策树!我们将再次使用3类数据集:
随机森林和决策树
数据集 v2

训练决策树:根节点

我们的第一个任务是确定树中的根决策节点。它将测试哪个特性(x或y),测试阈值是多少?例如,我们之前的树中的根节点使用了x特性,测试阈值为2:
随机森林和决策树

直观地说,我们希望决策节点进行“良好”拆分,其中“良好”可以松散地定义为尽可能地分离不同的类。上面的根节点做了一个“很好的”分割:所有的绿色在右边,没有绿色在左边。

因此,我们现在的目标是选择一个根节点,使我们能够进行“最佳”拆分。但我们如何量化分裂有多好呢?这还是比较复杂的。

希望你读了我的基尼杂质帖子。如果你没有,这里有一个很短的提示:我们可以用基尼杂质来计算任何分裂的基尼增益。更好的分割会带来更高的基尼系数。

回到确定根决策节点的问题。现在我们有了一种评估分割的方法,我们所要做的就是找到可能的最佳分割!为了简单起见,我们将尝试所有可能的分割,并使用最好的分割(基尼系数最高的分割)。这不是找到最佳分割的最快方法,但却是最容易理解的。

每一次尝试都意味着尝试:

  • 每个特性(x或y)。
  • 所有的“独特”的阈值。我们只需要尝试产生不同分裂的阈值。

例如,如果我们想使用x坐标,我们可以选择以下阈值:
随机森林和决策树
x阈值

让我们做一个例子来计算x=0.4的基尼系数。
随机森林和决策树
首先,我们计算整个数据集的Gini杂质:
随机森林和决策树
然后计算两个分支的基尼系数杂质:
随机森林和决策树
最后,我们从原始杂质中减去加权分支杂质,计算基尼系数增益:
随机森林和决策树
对刚刚发生的事情感到困惑吗?我说过你应该看看我的《基尼杂质》。它可以解释基尼系数。
我们可以用同样的方法计算每一个可能的分割的基尼系数:
随机森林和决策树
随机森林和决策树
所有的阈值

在尝试了x和y的所有阈值后,我们发现x= 2 split具有最高的基尼系数增益,因此我们将使根决策节点使用阈值为2的x特性。以下是我们目前的研究成果:
随机森林和决策树
取得进步了!

训练决策树:第二个节点

是时候做出第二个决策节点了。我们(任意)到左边的分支。我们现在只使用将取左分支的数据点(即满足x< 2的数据点),特别是3个蓝色和3个红色。

要构建第二个决策节点,只需执行相同的操作!我们对现有的6个数据点尝试了所有可能的分割,并发现y= 2是最佳分割。我们把它变成一个决策节点:
随机森林和决策树

我们的决策树差不多完成了……

训练决策树:何时停止?

让我们继续,试着做第三个决策节点。这次我们将使用根节点的右分支。该分支中唯一的数据点是3个绿色点。
再一次,我们尝试了所有可能的分裂,但都失败了:

  • 也同样好。
  • Gini增益为0 (Gini杂质已经为0,不能再低了)

在这里添加决策节点没有意义,因为这样做不会改进我们的决策树。因此,我们将这个节点设置为叶子节点,并在上面贴上绿色标签。这意味着我们将把到达此节点的任何数据点分类为绿色。

如果我们继续处理剩下的两个节点,同样的事情也会发生:我们将左下角的节点设为蓝色叶子节点,右下角的节点设为红色叶子节点。这就引出了最终的结果:
随机森林和决策树

一旦决策树中所有可能的分支都以叶节点结束,我们就完成了。我们训练了一个决策树!

随机森林🌲🌳🌲🌳🌲

我们终于准备好讨论随机森林了。还记得我刚才说的吗?
随机森林实际上就是一堆捆绑在一起的决策树。
这是对的,但是有点简化了。

Bagging

考虑以下算法来训练给定n点数据集的一组决策树:

  • 从数据集中抽取样本,并替换n训练实例。
  • 在神经网络样本上训练决策树。
  • 对一些t重复t次数。

为了使用该模型对t树进行预测,我们将来自各个决策树的预测进行聚合:

  • 如果我们的树产生了类标签(比如颜色),请进行多数票。
  • 如果我们的树产生数值(例如预测温度、价格等),则取平均值。

这种技术称为bagging,或bootstrap聚合。我们所做的带有替换的抽样称为引导抽样(bootstrap sample)。
随机森林和决策树
bagging决策树预测颜色

bagging决策树非常接近随机森林-他们只是错过了一件事…

bagging→随机森林

bagging决策树只有一个参数:t,即树的数量。
随机森林有第二个参数,它控制在寻找最佳分割时要尝试多少特性。在本教程中,我们的简单数据集只有2个特性(x和y),但是大多数数据集的特性要多得多(成百上千)。

假设我们有一个具有p特性的数据集。我们不是每次都尝试所有的特性,而是只尝试一部分特性,通常大小为\sqrt{p}\frac{p}{3}。我们这样做主要是为了注入随机性,使单个树更加独特,减少树之间的相关性,从而提高森林的整体性能。这种技术有时被称为feature bagging。

现在怎么办呢?

这是对随机森林初学者的介绍!快速回顾一下我们所做的:

  • 引入决策树,构建随机森林的积木。
  • 学习如何通过迭代使最佳分割成为可能来训练决策树。
  • 定义基尼杂质,一个用来量化分裂的“好”程度的指标。
  • 看到一个随机森林=一堆决策树。
  • 了解如何将多个树的预测组合在一起。
  • 了解到特征bagging是bagged决策树和随机森林的区别。

你可以从这里做一些事情:

  • 阅读有关信息增益的文章,这是一个类似于基尼杂质的指标,也可以用来量化分裂的“好”程度。
  • 在真实数据集上使用scikit-learn的decision – treeclassifier和randomforest分类器类进行实验。
  • 尝试从头编写一个简单的决策树或随机森林实现。
  • 阅读关于梯度增强决策树和发挥XGBoost,一个强大的梯度增强库。
  • 阅读关于ExtraTrees(随机森林的扩展)的文章,或者玩玩scikit-learn的ExtraTreesClassifier类。

本文到此结束,感谢你的阅读!

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程