基于scikit-learn的随机森林调参实战

写在前面

在之前一篇机器学习算法总结之Bagging与随机森林中对随机森林的原理进行了介绍。还是老套路,学习完理论知识需要实践来加深印象。在scikit-learn中,RF的分类类是RandomForestClassifier,回归类是RandomForestRegressor。当然RF的变种Extra Trees也有, 分类类ExtraTreesClassifier,回归类ExtraTreesRegressor。由于RF和Extra Trees的区别较小,调参方法基本相同,本文只关注于RF的调参。

和GBDT的调参类似,RF需要调参的参数也包括两部分,第一部分是Bagging框架的参数,第二部分是CART决策树的参数。下面我们就对这些参数做一个介绍。

1. Bagging框架参数

首先我们关注于RF的Bagging框架的参数。这里可以和GBDT对比来学习。在scikit-learn 梯度提升树(GBDT)调参小结中我们对GBDT的框架参数做了介绍。GBDT的框架参数比较多,重要的有最大迭代器个数,步长和子采样比例,调参起来比较费力。但是RF则比较简单,这是因为bagging框架里的各个弱学习器之间是没有依赖关系的,这减小的调参的难度。换句话说,达到同样的调参效果,RF调参时间要比GBDT少一些。

    下面我来看看RF重要的Bagging框架的参数,由于RandomForestClassifier和RandomForestRegressor参数绝大部分相同,这里会将它们一起讲,不同点会指出。

    1) n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,计算量会太大,并且n_estimators到一定的数量后,再增大n_estimators获得的模型提升会很小,所以一般选择一个适中的数值。默认是100。

    2) oob_score:即是否采用袋外样本来评估模型的好坏。默认为False。个人推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力。

    3) criterion: 即CART树做划分时对特征的评价标准。分类模型和回归模型的损失函数是不一样的。分类RF对应的CART分类树默认是基尼系数gini,另一个可选择的标准是信息增益。回归RF对应的CART回归树默认是均方差mse,另一个可以选择的标准是绝对值差mae。一般来说选择默认的标准就已经很好的。

    从上面可以看出, RF重要的框架参数比较少,主要需要关注的是 n_estimators,即RF最大的决策树个数。

2. RF决策树参数

下面我们再来看RF的决策树参数,它要调参的参数基本和GBDT相同,如下:

    1) RF划分时考虑的最大特征数max_features: 可以使用很多种类型的值,默认是"auto",意味着划分时最多考虑N−−√个特征;如果是"log2"意味着划分时最多考虑log2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般我们用默认的"auto"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

    2) 决策树最大深度max_depth: 默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

    3) 内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

    4) 叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

    5)叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

    6) 最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

    7) 节点划分最小不纯度min_impurity_split:  这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。

    上面决策树参数中最重要的包括最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。

3. RF常用方法

  •  apply(X)

用构造好的森林中的树对数据集X进行预测,返回每棵树预测的叶子节点。所以结果应该是二维矩阵,
行为样本第几个样本,列为每棵树预测的叶子节点。 

  •    decision_path(X):

返回森林中的决策路径

  •    fit(X, y[, sample_weight]):

用训练数据集(x, y)来构造森林

  •     get_params([deep]):

获得分类器的参数

  •     predict(X):

预测X的类别

  •     predict_log_proba(X):

预测X的类的对数概率,和predict_proba类似,只是取了对数

  •     predict_proba(X):

预测X的类别的概率。输入样本的预测类别概率被计算为森林中树木的平均预测类别概率。
单个树的类概率是叶中同一类的样本的比率。因为叶子节点并不是完全纯净的,它也有杂质,
不同种类所占恶比率是不一样的,但肯定有一类纯度很高。返回值是array of shape = [n_samples, n_classes]

  •     score(X, y[,sample_weight]):

返回给定的数据集(数据集指定了类别)的预测准确度

4. RF常用属性

  •    estimators_:决策树列表

        拟合好的字分类器列表,也就是单个决策树

  •     classes_:array of shape = [n_features]

        类别标签列表

  •     n_classes_:int or list

        类别数量

  •     n_features:int

        拟合过程中使用的特征的数量

  •     n_outputs:int 

        拟合过程中输出的数量

  •     featrue_importances:

             特征重要程度列表。值越大,说明越重要

  •     oob_score:array of shape = [n_features]

        使用oob数据集测试得到的得分数

  •     oob_decision_funtion_:array of shape = [n_features, n_classes]

        oob样本预测结果,每一个样本及相应结果对列表

5.RF调参实例

这里调参数据库仍使用于GBDT调参同样的

具体调参过程及代码实现已上传至Github:随机森林实战Titanic生存

以上~

2018.05.03

 

你可能感兴趣的:(ML算法总结)