随机森林算法是一种集成学习算法,它通过构建多个决策树来解决复杂的机器学习问题,并综合这些树的预测结果来得出最终答案。在机器学习项目和黑客马拉松中,无数次依赖随机森林算法。与其他集成算法不同,随机森林中的每棵树都是基于数据和特征的子集构建的。随机森林的一个缺点是它有许多超参数,这可能会让新手数据科学家感到不知所措。但不用担心!本文将探讨随机森林的各种超参数,并了解如何调整和优化它们。
随机森林超参数概览
假设已经对随机森林算法(和决策树)有基本的了解。如果没有,建议先阅读以下资源:《随机森林入门》和《决策树入门》(免费课程)。将要探讨的随机森林超参数包括:max_depth、min_sample_split、max_leaf_nodes、min_samples_leaf、n_estimators、max_samples(bootstrap sample)、max_features。
超参数 #1: max_depth
首先讨论关键的max_depth超参数。在随机森林中,一棵树的max_depth定义为从根节点到叶节点的最长路径。通过max_depth参数,可以限制每棵树在随机森林中生长的深度。在这个图中,可以清楚地看到,随着决策树的最大深度增加,模型在训练集上的性能持续提高。另一方面,随着max_depth值的增加,模型在测试集上的性能最初提高,但在某个点之后,开始迅速下降。能想到这是为什么吗?树开始过度拟合训练集,因此无法泛化到测试集中未见的点。在决策树的参数中,max_depth在宏观层面上通过大大减少决策树的生长来起作用。
超参数 #2: min_sample_split
min_sample_split是一个参数,它告诉随机森林中的决策树在任何给定节点中分裂所需的最小观察次数。min_sample_split的默认值被分配为2。这意味着如果任何终端节点有超过两个观察结果并且不是一个纯节点,可以将其进一步分裂为子节点。将默认值设置为2会导致问题,即树经常继续分裂,直到节点完全纯净。结果,树的大小增加,因此过度拟合数据。通过增加min_sample_split的值,可以减少决策树中发生的分裂次数,因此防止模型过度拟合。在上面的例子中,如果将min_sample_split的值从2增加到6,左侧的树将看起来像右侧的树。现在,让看看min_samples_split对模型性能的影响。下图绘制时考虑所有其他参数保持不变,只有min_samples_split的值发生变化:随着min_samples_split超参数值的增加,可以清楚地看到,对于参数的小值,训练分数和测试分数之间存在显著差异。但随着参数值的增加,训练分数和测试分数之间的差异减小。但有一件事应该记住。当参数值增加过多时,训练分数和测试分数总体上会下降。这是因为分裂节点的最小要求如此之高,以至于没有观察到显著的分裂。结果,随机森林开始欠拟合。
超参数 #3: max_leaf_nodes
接下来,来看另一个名为max_leaf_nodes的随机森林超参数。这个超参数设置了树中节点分裂的条件,因此限制了树的生长。如果分裂后拥有的终端节点超过了指定的终端节点数量,它将停止分裂,树将不再进一步生长。假设设置最大终端节点为2。由于这里只有一个节点,它将允许树进一步生长:现在,在第一次分裂后,可以看到这里有2个节点,已经将最大终端节点设置为2。因此,树将在这里终止,不再进一步生长。这就是设置最大终端节点或max_leaf_nodes如何帮助防止过度拟合。请注意,如果max_leaf_nodes的值非常小,随机森林可能会欠拟合。让看看这个参数如何影响随机森林模型的性能:可以看到,当参数值非常小的时候,树欠拟合,随着参数值的增加,树在测试和训练上的性能都提高了。根据这个图表,当参数值超过25时,树开始过度拟合。
超参数#4: min_samples_leaf
现在,让关注min_samples_leaf。这个随机森林超参数指定了在分裂节点后叶节点中应该存在的最小样本数量。让用一个例子来理解min_sample_leaf。假设将终端节点的最小样本设置为5:左侧的树代表一个无限制的树。这里,用绿色标记的节点满足条件,因为它们至少有5个样本。因此,它们将被视为叶或终端节点。然而,红色节点只有3个样本,因此它将不被视为叶节点。其父节点将成为叶节点。这就是为什么右侧的树代表设置终端节点的最小样本为5时的结果。因此,通过为终端节点设置最小样本标准来控制树的生长。正如可能已经猜到的,类似于上述两个超参数,这个超参数也有助于防止过度拟合,因为参数值增加。如果像以前一样绘制性能/参数值图:可以清楚地看到,当参数值非常低时(当参数值<100),随机森林模型过度拟合,但模型性能迅速上升并纠正了过度拟合的问题(100<参数值<400)。但是,当继续增加参数值(>500)时,模型慢慢转向欠拟合领域。
超参数 #5: n_estimators
知道随机森林算法不过是一组树。但是应该考虑多少棵树呢?这是新手数据科学家经常问的一个问题。这是一个有效的问题!可能会说,更多的树应该能够产生更泛化的结果,对吧?但是通过选择更多的树,随机森林模型的时间复杂度也会增加。在这个图中,可以清楚地看到模型的性能急剧增加,然后在某个水平上停滞不前:这意味着在随机森林模型中选择大量的估计器并不是最好的想法。尽管它不会降低模型性能,但它可以节省计算复杂度,并防止对CPU使用灭火器!