随机森林及其超参数调整(1)

文章目录

  • 随机森林知识点
    • 随机森林的算法流程
  • 随机森林的模型评估方法
  • 随机森林的参数:
    • 参数详解
      • 重要参数
      • 重要属性
      • 重要方法
    • 建议参数优化顺序
  • GridsearchCV
    • 基于GridsearchCV的随机森林超参数调整
  • 小结
  • 参考

随机森林知识点

随机森林的算法流程

随机森林及其超参数调整(1)_第1张图片

随机森林及其超参数调整(1)_第2张图片
随机森林及其超参数调整(1)_第3张图片

随机森林的随机体现在两个方面:

  • 随机有放回的抽样样本
  • 对每个训练集随机抽取特征

随机森林的模型评估方法

  • 袋外数据误差估计模型
  • 及爱茶验证率估计模型
    随机森林及其超参数调整(1)_第4张图片

随机森林的参数:

def __init__(
        self,
        n_estimators=100,
        *,
        criterion="gini",
        max_depth=None,
        min_samples_split=2,
        min_samples_leaf=1,
        min_weight_fraction_leaf=0.0,
        max_features="auto",
        max_leaf_nodes=None,
        min_impurity_decrease=0.0,
        bootstrap=True,
        oob_score=False,
        n_jobs=None,
        random_state=None,
        verbose=0,
        warm_start=False,
        class_weight=None,
        ccp_alpha=0.0,
        max_samples=None,
    ):

sklearn 随机森林(分类器、回归器)的重要参数、属性、方法理解

参数详解

重要参数

1,n_estimators
数值型参数,默认值为100,此参数指定了弱分类器的个数。设置的值越大,精确度越好,但是当 n_estimators 大于特定值之后,带来的提升效果非常有限。

推荐的参数值为:[120, 300, 500, 800, 1200]

2,criterion
字符串类型,默认值为 ‘gini’。这个参数指定划分子树的评估标准:

‘entropy’,使用基于信息熵的方法,即计算信息增益
‘gini’,使用基尼系数(Gini Impurity)
**推荐设置为 ‘gini’,**因为(1)基尼系数的计算过程相对简单,而计算信息增益需要进行对数运算。(2)使用信息增益作为划分标准时,在使用高纬度数据或者噪声很多的数据时容易过拟合。

3,max_depth
数值型,默认值None。这是与剪枝相关的参数,设置为None时,树的节点会一直分裂,直到:(1)每个叶子都是“纯”的;(2)或者叶子中包含⼩于min_sanples_split个样本。

推荐从 max_depth = 3 尝试增加,观察是否应该继续加大深度。

合适的取值可以是 [3, 5, 8, 15, 25, 30, None]

如果max_leaf_nodes参数非None,则忽略此项

4,min_samples_leaf
数值型,默认值1,指定每个叶子结点包含的最少的样本数。参数的取值除了整数之外,还可以是浮点数,此时(min_samples_leaf * n_samples)向下取整后的整数是每个节点的最小样本数。
此参数设置的过小会导致过拟合,反之就会欠拟合。调整过程:

从min_samples_leaf=5开始上下调整。
对于类别不多的分类问题,设置为1通常是合理的选择。
当叶节点包含样本数量差异很大时,建议设置为浮点数。
推荐的取值可以是:[1, 2, 5, 10]

5,min_samples_split
数值型,默认值2,指定每个内部节点(非叶子节点)包含的最少的样本数。与min_samples_leaf这个参数类似,可以是整数也可以是浮点数。

推荐的取值是:[1, 2, 5, 10, 15, 100]

7,max_features
可以为整数、浮点、字符或者None,默认值为None。此参数用于限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。

如果是整数,则每次切分只考虑max_features个特征。
如果是浮点数,每次切分只考虑max_features*n_features个特征(max_features指定百分⽐)。
如果是字符串‘auto’,则max_features等于n_features。
如果是字符串‘sqrt’,则max_features等于sqrt(n_features)。
如果是字符串‘log2’,则max_features等于log2(n_features)。
如果是字符串None,则max_features等于n_features。
推荐的取值为:[‘log2’, ‘sqrt’, None]

8,class_weight
可以是列表、字典、或者字符串’balanced’,还可以是默认值None。这个参数主要是用于样本不平衡数据集,当设置为None时,所有类别样本权重都为1。也可以利用列表或者字典手动设置各个类别样本的权重,将样本较少的类别赋予更大的权重。当设置为’balanced’时,会自动根据样本出现的频率计算权重,即 n_samples / (n_classes * np.bincount(y))
推荐的设置为:[None, ‘balanced’]

9,max_leaf_nodes
数值型参数,默认值为None,即不限制最大叶子节点数。这个参数通过限制树的最大叶子数量来防止过拟合,如果设置了一个正整数,则会在建立的最大叶节点内的树中选择最优的决策树。如果特征不多,可以设置为None,否则可以设置为小于 2 m a x _ d e p t h 2^{max_depth }2
max_depth
的数值。

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

11,verbose
数值类型,默认值为0,表示不输出日志。如果为1,则每次迭代输出一次日志。如果大于1,则每间隔 verbose 此迭代输出一次日志。

重要属性

1,feature_importances_ ,给出了各个特征对模型的重要性。

2,oob_score_,训练数据使用的包外数据的得分。

重要方法

1,fit(X,y) : 训练模型。
2,predict(X) : 用模型预测,返回预测值。
3,predict_proba(X) : 返回一个数组,数组元素依次为各个样本属于各个类别的概率值。
4,score(X, y) : 返回在(X, y)上预测的准确率(accuracy)。

引入方式如下:

from sklearn.ensemble import RandomForestRegressor
# 所有参数
RandomForestRegressor(bootstrap=True, ccp_alpha=0.0, criterion='mse',
                      max_depth=None, max_features='auto', max_leaf_nodes=None,
                      max_samples=None, min_impurity_decrease=0.0,
                      min_impurity_split=None, min_samples_leaf=1,
                      min_samples_split=2, min_weight_fraction_leaf=0.0,
                      n_estimators=100, n_jobs=None, oob_score=False,
                      random_state=None, verbose=0, warm_start=False)

其中,参数criterion 是字符串类型,默认值为 ‘mse’,是衡量回归效果的指标。可选的还有‘mae’ 。

除了criterion这个参数之外,其他参数、属性、方法的含义与用法与上文提到的随机森林分类器的参数基本一致。

建议参数优化顺序

在这里插入图片描述

GridsearchCV

class sklearn.model_selection.GridSearchCV(estimator, param_grid, *,scoring=None, n_jobs=None, refit=True, cv=None, verbose=2, pre_dispatch='2*n_jobs', error_score=nan, return_train_score=False)

随机森林及其超参数调整(1)_第5张图片

基于GridsearchCV的随机森林超参数调整

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
# 1.载入数据
iris = load_iris()
X=iris.data
Y=iris.target
#
n_estimators=range(50,1000,50)
max_depth = range(2,12,2)
rf_param_grid = {'n_estimators':n_estimators,
                 'max_depth':max_depth,
                 }
#hyper={'n_estimators':n_estimators}
gd=GridSearchCV(estimator=RandomForestClassifier(random_state=0),param_grid=rf_param_grid,verbose=2)
gd.fit(X,Y)
print(gd.best_score_)
print(gd.best_estimator_)
print()

print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次交叉验证后的准确率结果:\n", estimator.cv_results_)

小结

  • 随机森林的模型评估方式: 推荐袋外法 rf.oob,score

参考

https://www.cnblogs.com/pinard/p/6160412.html?utm_source=itdadao&utm_medium=referral
scikit-learn随机森林调参小结
(包含参数的类别意义以及调参案例。)
[Machine Learning & Algorithm] 随机森林(Random Forest)

你可能感兴趣的:(机器学习,随机森林,python,算法)