查看原文
其他

第8.10节 随机森林

空字符 月来客栈 2024-01-21

各位朋友大家好,欢迎来到月来客栈,我是掌柜空字符。

本期推送内容目录如下,如果本期内容对你有所帮助,欢迎点赞、转发支持掌柜!

  • 8.10 随机森林
    • 8.10.1 随机森林原理
    • 8.10.2 随机森林示例代码
    • 8.10.3 特征重要性评估
    • 8.10.4 小结
    • 引用

8.10 随机森林

8.10.1 随机森林原理

正如我们在第8.9.3节中所介绍的那样,随机森林本质上是基于决策树的Bagging集成学习模型,因此,随机森林的建模过程总体上可以分为3步[1]:

第1步,对原始数据集进行随机采样,得到多个训练子集。

第2步,在各个训练子集上训练得到不同的决策树模型。

第3步,将训练得到的多个决策树模型进行组合,然后得到最后的输出结果。

如图8-43所示为随机对样本点和特征采样后训练得到的若干决策树模型组成的随机森林。从图8-43中可以看出,即使同一个样本在不同树中所归属的叶子节点也不尽相同,甚至连类别也可能不同,但是这也充分体现了Bagging集成模型的优点,通过“平均”来提高模型的泛化能力。

图 8-43 随机森林原理示意图
在图8-43中,多个不同结构的决策树模型构成了随机森林,并且在模型输出时将会以投票的方式决策出最终的输出类别。同时,随机森林与普通Bagging集成学习方法存在的一点差别就是,随机森林中每棵决策树在每次划分节点的过程中,还会有一个随机的过程,即只会从已有的特征中再随机选择部分特征参与节点划分,这一过程被称为Feature Bagging。之所以要这么做,是为了减小各个树模型之间的关联性。例如训练数据中如果存在着某些差异性较大的特征,则所有的决策树在节点划分时就会选择同样的特征,使最终得到的决策树之间具有较强的关联性,即每棵树都类似。

8.10.2 随机森林示例代码

介绍完随机森林的基本原理后,我们再来看一看如何通过sklearn完成随机森林的建模任务。在sklearn中,可以通过语句from sklearn.ensemble import RandomForestClassifier导入模块随机森林。下面先来介绍一下RandomForestClassifier类中常见的重要参数及其含义,代码如下:

def __init__(self,
                 n_estimators=100,
                 criterion="gini",
                 max_depth=None,
                 min_samples_split=2,
                 min_samples_leaf=1,
                 max_features="auto",
                 bootstrap=True,
                 max_samples=None):

上述代码是类RandomForestClassifier初始化方法中的部分参数,其中n_estimators表示在随机森林中决策树的数量;criterion用于指定构建决策树的算法;max_depth表示允许决策树的最大深度;min_samples_split表示节点允许继续划分的最少样本数,即如果划分后的节点中样本数少于该值,将不会进行划分;min_samples_leaf表示叶子节点所需要的最少样本数;max_features表示每次对节点进行划分时所选特征的最大数量,即节点每次在进行划分时会先在原始特征中随机选取max_features个候选特征,然后在候选特征中选择最佳特征;bootstrap表示是否对原始数据集进行采样,如果其值为False,则所有决策树在构造时均使用相同的样本;max_samples表示每个训练子集中样本数量的最大值(当bootstrap=True时),其默认值为None,即等于原始样本的数量。

注意:max_samples=None仅仅表示采样的样本数等于原始训练集的样本数,不代表抽样后的子训练集等同于原始训练集,因为采样时样本可以重复。

一般来讲,在sklearn的各个模型中,对于大多数参数来讲保持默认即可,对于少部分关键参数可采样交叉验证进行选择。

下面以iris数据集为例进行RandomForestClassifier的集成学习建模任务,完整代码见Book/Chapter08/08_ensemble_random_forest.py文件,代码如下:

if __name__ == '__main__':
    x_train, x_test, y_train, y_test = load_data()
    model = RandomForestClassifier(n_estimators=2, max_features=3
                                   random_state=2)
    model.fit(x_train, y_train)
    print(model.score(x_test, y_test)) # 0.95

可以看到,尽管随机森林这么复杂的一个模型,在sklearn中同样可以通过几行代码来完成建模。同时,在完成随机森林的训练后,可以通过model.estimators属性来得到所有的决策树对象,然后分别对其进行可视化就可以得到整个随机森林可视化结果。当然,最重要的是可以通过model.feature_importances属性来得到每个特征的重要性程度以进行特征筛选,以便去掉无关特征。

8.10.3 特征重要性评估

从决策树的构造原理便可以看出,越是靠近决策树顶端的特征维度越能对不同类别的样本进行区分,这就意味着越是接近于根节点的特征维度越重要,因此,在sklearn中的类DecisionTreeClassifier里面,同样也有feature_importances_属性,以便输出每个特征的重要性值。只是通过随机森林进行特征重要性评估更加准确,因此我们才将这部分内容放到了这里。不过想要弄清楚随机森林中的特征重要性评估过程,还得从决策树说起。

1. 决策树中的特征评估

在sklearn中,决策树通过基于基尼纯度的减少量来对特征进行重要性评估,当然基尼纯度也可以换成信息增益或者信息增益比。具体地,对于决策树中划分每个节点的特征来讲,其特征重要性计算公式为[2]

其中,表的样本数;表示当前节点的样本数;表示当前节点的纯度;表示当前节点左“孩子”中的样本数;表示当前节点左“孩子”的纯度;表示当前节点右“孩子”中的样本数;表示当前节点右“孩子”的纯度。

为你认可的知识付费,欢迎订阅本专栏阅读更多优质内容!

以第8.10.2节随机森林里的其中一棵决策树为例,其在每次进行节点划分时的各项信息如图8-44所示。

继续滑动看下一个

第8.10节 随机森林

空字符 月来客栈
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存