决策树可能会受到高度变异的影响,使得结果对所使用的特定测试数据而言变得脆弱。
根据您的测试数据样本构建多个模型(称为套袋)可以减少这种差异,但是树本身是高度相关的。
随机森林是套袋(方法)的延伸,除了基于多个测试数据样本构建树木之外,它还限制了可用于构建树木的特征,使得树木间具有差异。这反过来可以提升算法的表现。
在本教程中,您将了解如何在Python中从头开始实现随机森林算法。
完成本教程后,您将知道:
- 套袋决策树和随机森林算法的区别。
- 如何构造更多方差的袋装决策树。
- 如何将随机森林算法应用于预测建模问题。
让我们开始吧。
2017年1月更新:将cross_validation_split()中fold_size的计算更改为始终为整数。修复了Python 3的问题。
2017年2月更新:修复了build_tree中的错误。
2017年8月更新:修正了基尼计算机中的一个错误,增加了群组大小(基于迈克尔!)。
如何在Python中从头开始实现随机森林
随机森林算法
决策树涉及从数据集中(利用)贪婪选择选取最佳分割点过程中的每一步。
如果不精简(该算法),此算法容易使决策树出现高方差。这种高方差(结果)可以通过创建包含测试数据集中(多个)不同的实例(问题的不同观点)的多重树,接着将实例所有的可能结果结合,这种方法简称为bootstrap聚合或套袋。
套袋的局限性在于,它使用相同的贪婪算法来创建每棵树,这意味着在每棵树中可能会选择相同或非常相似的分割点,使得不同的树非常相似(树将被关联)。这反过来又使他们的预测相似,从而缩减了最初寻求的差异。
我们可以通过贪婪算法在创建树时在每个分割点评估的特征(行)来限制决策树不同。这被称为随机森林算法。
像装袋一样,测试数据集的多个样本在被采集后,接着在每个样本上训练不同的树。不同之处在于在每一点上,拆分是在数据中进行并添加到树中的,且只考虑固定的属性子集。
对于分类问题,我们将在本教程中讨论的问题的类型——分割中输入特点数的平方根值对为分割操作考虑的属性个数的限制。
num_features_for_split = sqrt(total_input_features)
这一小变化的结果是树之间变得更加不同(不关联),作为结果会有更加多样化的预测,这样的结果往往好于一个单独的树或者单独套袋得到的结果。
声纳数据集
我们将在本教程中使用的数据集是Sonar数据集。
这是一个描述声纳声音从不同曲面反弹后返回(数据)的数据集。输入的60个变量是声呐从不同角度返回的力度值。这是一个二元分类问题,需要一个模型来区分金属圆柱中的岩石。这里有208个观察对象。
这是一个很好理解的数据集。所有变量都是连续的且范围一般是0到1。输出变量是“Mine”字符串中的“M”和“rock”中的“R”,需要转换为整数1和0。
通过预测在数据集(“M”或“mines”)中观测数最多的类,零规则算法可以达到53%的准确度。
您可以在UCI Machine Learning repository了解关于此数据集的更多信息。
下载免费的数据集,并将其放置在工作目录中,文件名为sonar.all-data.csv。
教程
本教程分为2个步骤。
- 计算分割。
- 声纳数据集案例研究。