在 CART 分类回归树的基础之上,我们可以很容易的掌握随机森林算法,它们之间的区别在于,CART 决策树较容易过拟合,而随机森林可以在一定程度上解决该问题。
随机森林的主要思想是:使用随机性产生出一系列简单的决策树,并组合它们的预测结果为最终的结果,可谓三个臭皮匠赛过一个诸葛亮,下面我们就来具体了解一下。
产生随机森林的具体步骤
产生随机森林的步骤大致为三步
- 准备样本
- 产生决策树
- 循环第 1 、2 步,直到产生足够的决策树,一般为上百个
在第 1 步,它是一个可放回抽样,即所产生的样本是允许重复的,这种抽样又被称为 Bootstrap,例如我们有以下 dummy 数据
胸口疼痛 | 血液循环正常 | 血管堵塞 | 体重 | 患心脏病 |
---|---|---|---|---|
No | No | No | 125 | No |
Yes | Yes | Yes | 180 | Yes |
Yes | Yes | No | 210 | No |
Yes | No | Yes | 167 | Yes |
在做完 Bootstrap 之后,可能的样本数据如下
胸口疼痛 | 血液循环正常 | 血管堵塞 | 体重 | 患心脏病 |
---|---|---|---|---|
Yes | Yes | Yes | 180 | Yes |
No | No | No | 125 | No |
Yes | No | Yes | 167 | Yes |
Yes | No | Yes | 167 | Yes |
可见,样本数据中,第 3 条和第 4 条样本是一样的,都对应的是原始数据中的第 4 条。
接下来,就是要使用上面的样本数据来产生决策树了,产生决策树的方法和 CART 基本一致,唯一的不同地方在于,节点的构建不是来自于全部的候选特征,而是先从中随机的选择 n 个特征,在这 n 个特征中找出一个作为最佳节点。
举个例子,假设 n = 2,且我们随机选择了「血液循环正常」和「血管堵塞」这两个特征来产生根节点,如下:
血液循环正常 | 血管堵塞 | 患心脏病 |
---|---|---|
Yes | Yes | Yes |
No | No | No |
No | Yes | Yes |
No | Yes | Yes |
我们将在上述两个特征中选择一个合适的特征作为根节点,假设在计算完 Gini 不纯度之后,「血液循环正常」这个特征胜出,那么我们的根节点便是「血液循环正常」,如下图所示
接下来我们还需要构建根节点下面的节点,下一个节点将会在剩下的「胸口疼痛」、「血管堵塞」和「体重」三个特征中产生,但我们依然不会计算所有这 3 个特征的 Gini 不纯度,而是从中随机选择 2 个特征,取这 2 个特征中的 Gini 不纯度较低者作为节点。
例如我们随机选到了「胸口疼痛」和「体重」这两列,如下:
胸口疼痛 | 体重 | 患心脏病 |
---|---|---|
Yes | 180 | Yes |
No | 125 | No |
Yes | 167 | Yes |
Yes | 167 | Yes |
假设此时「体重」的 Gini 不纯度更低,那么第 2 个节点便是「体重」,如下图:
继续下去,我们便产生了一棵决策树。
随机森林是多棵决策树,在产生完一棵决策树后,接着会循环执行上述过程:Bootstrap 出训练样本,训练决策树,直到树的数量达到设置值——通常为几百棵树。
随机森林的预测
现在我们产生了几百棵树的随机森林,当我们要预测一条数据时,该怎么做呢?我们会聚合这些树的结果,选择预测结果最多的那个分类作为最终的预测结果。
例如我们现在有一条数据:
胸口疼痛 | 血液循环正常 | 血管堵塞 | 体重 | 患心脏病 |
---|---|---|---|---|
Yes | No | No | 168 |
该条数据被所有树预测的结果如下:
第几颗树 | 预测结果 |
---|---|
1 | Yes |
2 | Yes |
... | ... |
100 | No |
上述结果聚合后为:
预测结果 | 次数 |
---|---|
Yes | 82 |
No | 18 |
取最多的那项为最终的预测结果,即 Yes——该病人被诊断为患有心脏病。
以上,随机森林的两个过程:Bootstrap 和 Aggregate 又被称为 Bagging。
总结
本文我们一起学习了随机森林的算法,和 CART 决策树比起来,它主要被用来解决过拟合问题,其主要的思想为 Bagging,即随机性有助于增强模型的泛化(Variance) 能力。
参考:
相关文章: