首页 » python机器学习 » python机器学习全文在线阅读

《python机器学习》3.6.3 通过随机森林将弱分类器集成为强分类器

关灯直达底部

由于具备好的分类能力、可扩展性、易用性等特点,随机森林(random forest)过去十年间在机器学习应用领域获得了广泛的关注。直观上,随机森林可以视为多棵决策树的集成。集成学习的基本理念就是将弱分类器集成为鲁棒性更强的模型,即一个能力更强的分类器,集成后具备更好的泛化误差,不易产生过拟合现象。随机森林算法可以概括为四个简单的步骤:

1)使用bootstrap抽样方法随机选择n个样本用于训练(从训练集中随机可重复地选择n个样本)。

2)使用第1)步选定的样本构造一棵决策树。节点划分规则如下:

(1)不重复地随机选择d个特征;

(2)根据目标函数的要求,如最大化信息增益,使用选定的特征对节点进行划分。

3)重复上述过程1~2000次。

4)汇总每棵决策树的类标进行多数投票(majority vote)。多数投票将在第7章中详细介绍。

此处,步骤2)对单棵决策树的训练做了少许修改:在对节点进行最优划分的判定时,并未使用所有的特征,而只是随机选择了一个子集。

虽然随机森林没有决策树那样良好的可解释性,但其显著的优势在于不必担心超参值的选择。我们通常不需要对随机森林进行剪枝,因为相对于单棵决策树来说,集成模型对噪声的鲁棒性更好。在实践中,我们真正需要关心的参数是为构建随机森林所需的决策树数量(步骤3))。通常情况下,决策树的数量越多,但是随机森林整体的分类表现就越好,但这同时也相应地增加了计算成本。

尽管在实践中不常见,但是随机森林中可优化的其他超参分别是:bootstrap抽样的数量(步骤1))以及在节点划分中使用的特征数量(步骤(2)),它们所采用的技术将在第5章中讨论。通过选择bootstrap抽样中样本数量n,我们可以控制随机森林的偏差与方差权衡的问题。如果n的值较大,就降低了随机性,由此更可能导致随机森林的过拟合。反之,我们可以基于模型的性能,通过选择较小的n值来降低过拟合。包括scikit-learn中RandomForestClassifier在内的大多数对随机森林的实现中,bootstrap抽样的数量一般与原始训练集中样本的数量相同,因为这样在折中偏差与方差方面一般会有一个好的均衡结果。而对于在每次节点划分中用到的特征数量m,我们选择一个比训练集中特征总量小的值。在scikit-learn及其他程序实现中常用的默认值一般是,其中m是训练集中特征的总量。

为了方便起见,我们不是自己从决策树开始构造随机森林,而是使用scikit-learn中已有的实现来完成:

执行上述代码后,通过随机森林中决策树的组合形成的决策区域如下图所示:

在上述代码中,我们在节点划分中以熵为不纯度衡量标准,且通过参数n_estimators使用了10棵决策树进行随机森林的训练。虽然我们只是在一个很小的训练数据集上构建了一个非常小的随机森林,但是出于演示的要求,我们使用n_jobs参数来设定训练过程中所需的处理器内核的数量(在此使用了CPU的两个内核)。