随机森林 n_jobs

在上一篇文章中,笔者介绍了常见集成模型的主要思想,并且还提到随机森林是使用最为广泛的集成模型之一。因此在本篇文章中,笔者将会再次就随机森林的其它应用以及其在sklearn中的具体用法进行介绍。

1 API介绍

在上一篇文章中,我们介绍了随机森林的基本原理,但并没有对其的具体用法做出详细的示例。接下来,我们就对其在sklearn[1]中的具体用法进行介绍。

打开sklearn中关于随机森林的定义可以发现:

A random forest classifier.
A random forest is a meta estimator that fits a number of decision tree classifiers on various sub-samples of the dataset and uses averaging to improve the predictive accuracy and control over-fitting.

随机森林是一个元估计器,它是由一系列的决策树分类器所构成;并且每个决策树都是通过原始训练集中的部分数据样本训练得来,最后通过’平均‘的方式来提升分类准确率和控制过拟合现象。

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

以上代码为sklearn中对于随机森林分类器中常用的参数,其中相关含义如下:

  • n_estimators=100:设定采用多少棵决策树来构造随机森林,默认值为100棵。
  • criterion='gini':决策树生成中的划分标准,默认值为基尼系数。
  • max_depth=None:生成决策树时的最大深度,越深的决策树就越可能出现过拟合情况;默认值为None,其表示当所有叶节点中的样本都为同一个类别或者数量小于min_samples_split时停止继续划分。
  • min_samples_split=2:划分节点时的最少样本数,默认值为2,即表示当某个节点中的样本数小于等于2时不再继续划分,直接作为叶节点;如果min_samples_split设定为浮点型,则将取值为min_samples_split * n_samples
  • min_samples_leaf=1:构成叶节点的最少样本数,默认值为1;如果为浮点型,同上。
  • bootstrap=True:是否仅使用原始训练样本中的部分抽样数据来拟合决策树,默认值为True,否在使用整个训练集来拟合每一棵决策树。
  • n_jobs=None:并行训练决策树时指定的cpu线程数,默认值为None,表示1;设为-1表示使用所有线程。
  • random_state=None:设置一个状态值,这样可以使得每次生成的随机森林都是一样的;默认值为None,可为任意整数。
  • max_samples=None:拟合决策树时随机抽样的最大样本数量(当bootstrap=True时),默认值为None,等价于bootstrap=Flase

2 特征评估

我们知道在决策树的构建过程中,采用不同的特征来对数据进行划分能够得到不同的决策树。并且,不同的决策树生成算法都是优先考虑能够使得划分后数据集纯度更高的特征作为划分标准,所以通过生成后的决策树我们就能够间接性的获得数据集中特征的重要性程度。因此,在sklearn实现的随机森林(决策树)中也直接提供了这一方法来获取特征的重要性排序。

def rfc1(x_train, x_test, y_train, y_test):
    forest = RandomForestClassifier(n_estimators=10, n_jobs=-1, random_state=9)
    forest.fit(x_train, y_train)
    print("包含所有维度时的准确率:", forest.score(x_test, y_test))
    importances = forest.feature_importances_
    print('每个维度对应的重要性:', importances)
    indices = np.argsort(importances)[::-1]  # a[::-1]让a逆序输出
    print('按维度重要性排序的维度的序号:', indices)
    
#结果:
包含所有维度时的准确率 0.8888888888888888
每个维度对应的重要性 [0.07245267 0.00930779 0.37054307 0.54769647]
按维度重要性排序的维度的序号 [3 2 0 1]

如上代码所示,我们可以通过调用feature_importances_方法来获得特征重要性排名。从最后的结果可以看出,在数据集iris中对分类起决定性作用的为最后两个特征维度。同时,我们也可以进行一个对比,仅用最后两个维度来进行分类:

def load_data(indices=False):
    data = load_iris()

    x, y = data.data, data.target
    if indices:
        x = x[:, 2:4]
    x_train, x_test, y_train, y_test = \
        train_test_split(x, y, test_size=0.3,
                         shuffle=True, random_state=20)
    return x_train, x_test, y_train, y_test

def frc2(x_train, x_test, y_train, y_test):
    forest = RandomForestClassifier(n_estimators=10, n_jobs=-1, random_state=9)
    forest.fit(x_train, y_train)
    print("仅包含两个维度时的准确率:", forest.score(x_test, y_test))
#结果:
仅包含两个维度时的准确率: 0.8888888888888888

从分类结果来看,两者没有任何差别。因此,当遇到包含有较多特征的数据集时,可以通过随机森林来进行特征的筛选。

3 总结

在这篇文章中,笔者首先介绍了sklearn中随机森林的API接口,对里面常用的一些参数含义进行了说明;然后介绍了如何通过sklearn中实现的方法来进行数据集特征维度重要性的评估,并通过示例展示了起具体的用法。本次内容就到此结束,感谢阅读!

若有任何疑问与见解,请发邮件至并附上文章链接,青山不改,绿水长流,月来客栈见!

引用

[1]RandomForestClassifier https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier

[2]示例代码 : https://github.com/moon-hotel/MachineLearningWithMe

随机森林 n_jobs