随机森林和决策树,本文是随机森林和决策树的权威指南。
在我看来,大多数机器学习教程对初学者不够友好。
上个月,我为初学者写了一篇关于神经网络的介绍。本文将采用相同的策略,这意味着它再次假定机器学习的先验知识为零。我们将学习什么是随机森林,以及它们是如何从头开始工作的。
准备好了吗?就让我们一探究竟吧。
决策树🌲
一个随机森林🌲🌲🌲实际上是一群决策树🌲捆绑在一起(啊这就是为什么它被称为森林)。在进入森林之前,我们需要谈谈树木。
看看下面的数据集:
如果我告诉你有一个新的点,它的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类。
本文到此结束,感谢你的阅读!