Python sklearn库中的随机森林模型详解

 更新时间:2023年08月27日 11:44:55   作者:rink1t  
本文主要说明 Python 的 sklearn 库中的随机森林模型的常用接口、属性以及参数调优说明,需要读者或多或少了解过sklearn库和一些基本的机器学习知识

sklearn中的随机森林

sklearn中的集成学习算法模块ensemble中与随机森林相关的类

说明
ensemble.RandomForestClassifier随机森林分类
ensemble.RandomForestRegressor随机森林回归

基本使用

以红酒数据集和波士顿房价数据集为例,sklearn中的分类树和回归树的简单使用如下:

# 导包
from sklearn.datasets import load_wine, load_boston
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
# 分类树
data_wine = load_wine()  # 加载红酒数据集
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data_wine.data, data_wine.target, test_size=0.3, random_state=42)
rfc = RandomForestClassifier()  # 分类树
rfc.fit(X_train, y_train)  # 拟合训练集
print(rfc.predict(X_train))  # 输出测试集的预测结果
print(rfc.score(X_test, y_test))  # 测试集上的准确率
# 回归树
data_boston = load_boston()  # 加载波士顿房价数据集
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data_boston.data, data_boston.target, test_size=0.3, random_state=42)
reg = RandomForestRegressor()  # 回归树
reg.fit(X_train, y_train)  # 拟合训练集
print(reg.predict(X_train))   # 测试集的预测结果
print(reg.score(X_test, y_test))   # 测试集上的决定系数 R2

常用属性和接口

  • .feature_importances_:每个特征的特征重要性,总和为1
  • .oob_score_:当模型 oob_score=True 时,训练后可查看树模型使用oob数据进行测试的平均准确度
  • .estimators_:返回集成的所有决策树模型的模型列表
  • .apply():传入样本特征数据,返回每个样本被分到的节点索引,每个样本对应一个列表,列表中是该样本在随机森林中所有树模型中被分到的叶子节点索引
  • .predict_proba():传入样本特征数据返回每个测试样本对应的被分到每个标签的概率

随机森林的 .score() 接口的选用指标:

  • 随机森林分类:准确度 Accuracy
  • 随机森林回归:决定系数 R2R^2R2

参数说明

与sklearn中的决策树参数很多都很相似,以下参数说明是针对分类树的,对于回归树,几乎所有参数、属性及接口都和分类树一模一样。需要注意的是,在回归树中,没有标签分布是否均衡的问题,因此没有class_weight这样的参数。

sklearn中随机森林分类和随机森林回归的默认参数

  • 随机森林分类
RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,
                       criterion='gini', 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)
  • 随机森林回归
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)

sklearn中随机森林的许多参数是用于限定集成的决策树模型的,这部分参数和决策树模型中的许多参数相同,这里就一笔带过,不再重复进行详细说明了。

  • criterion:不纯度的衡量指标,Gini系数或信息熵
  • max_depth:树的最大深度,超过最大深度的树枝都会被剪掉
  • min_samples_leaf:一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生
  • min_samples_split:一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生
  • max_features:max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃, 默认值为总特征个数开平方取整
  • min_impurity_decrease:限制信息增益的大小,信息增益小于设定数值的分枝不会发生
  • class_weight:用于平衡不均衡数据集样本
  • min_weight_fraction_leaf:计算样本权重版本的 min_samples_leaf

n_estimators

n_estimators是随机森林中树模型的数量,即基评估器的数量。这个参数对随机森林模型的精确性影响是单调的,n_estimators越大,模型的效果往往越好。但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的性能往往不再上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越长。对于这个参数,我们是会在计算资源和模型效果之间取得平衡。

random_state

随机森林中的random_state和决策树中相似,只不过在决策树中,一个random_state只控制生成一棵树的随机状态,而随机森林中的random_state控制的是其集成的所有树模型中的随机状态,例如随机森林的random_state为一个常数后,包含的所有树模型的random_state则状态下固定的随机数。

注意:sklearn中的决策树不是传统的决策树模型,也含有random_state参数,也就是随机选择部分特征,但在一些情况下或许你会发现随机森林集成单棵决策树和用sklearn直接创建单个决策树模型的效果也是不同的,这是因为在sklearn中随机森林中集成的决策树的特征选择随机性要比tree模块中的决策树模型的随机性大得多,例如某数据集有700个特征,那随机森林中的每棵树可能随机选择其中的几十个特征来考虑,而独立的单个决策树模型可能随机选择其中的几百个特征来考虑。

bootstrap & oob_score

随机森林中在保证树模型的随机性时,除了原本决策树模型自带的随机性(从原始特征中随机选择部分特征),对于其中每个树模型的训练样本,则采用bootstrap方法,当 bootstrap 参数为True时,假设有 nnn 个树模型,则会从原始训练样本中进行有放回随机抽样得到大小与原始训练样本数量相同的 nnn 个自助集,这 nnn 个自助集作为对对应的 nnn 个树模型的训练数据。该方法可进一步增大模型的随机性。

每个自助集中只包含原始数据中的部分数据,由于可重复抽样,因此大小与原始训练数据集相同,对于每棵树而言,训练数据都仅包含原始数据的部分数据,其它数据被称为袋外数据(out of bag, oob data),为了不让这部分数据浪费,对于每棵树我们将它对应的袋外数据作为这单棵树模型的测试集进行性能测试,当 oob_score 参数为True时,随机森林模型在训练后会针对每棵树模型使用袋外数据计算准确度后取其均值,则在训练随机森林模型后可调用 oob_score_ 接口查看。

n_jobs

n_jobs表示并行运行的作业数,用于指定随机森林的并行计算,可以加速训练过程

  • -1:使用最大的CPU核心数,例如4核CPU会启动4个并行作业。
  • 1(默认):禁用并行计算,串行运行。
  • 2、3等整数:指定并行运行的作业数。

并行运行时,会拆分数据到不同CPU内核分别训练,然后合并结果,可大幅减少随机森林的训练时间,但会消耗更多CPU资源。

参数影响程度

我们在调参的时候,一般会从基于主观判断来从对模型影响最大的参数向影响最小的参数调整,对于可控的数值型参数,例如随机森林的 n_estimators 我们往往基于经验和主观判断调节,对于选项较少的如 criterion等参数,我们一般可以使用网格调参,当然算力允许的话想怎么调都是可以的。

参数影响影响程度
n_estimators随着参数值的增加,模型性能提升至平稳,不影响单个模型的复杂度4
max_depth默认为最大值(不限制),值越小,模型复杂度越小3
min_samples_leaf默认为最小值(1),值越大,模型复杂度越小2
min_samples_split默认为最小值(2),值越大,模型复杂度越小2
max_features默认为中间值(auto),值越小,模型复杂度越小,值越大,模型复杂度越大1

模型复杂度越大,过拟合风险越大,欠拟合风险越小;模型复杂度越小,欠拟合风险越大,过拟合风险越小。

ps:这里的参数中除了 n_estimators 外的其它参数影响程度对于单个决策树模型也是同理的。

到此这篇关于Python sklearn库中的随机森林模型详解的文章就介绍到这了,更多相关Python sklearn随机森林模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python os.access()用法实例

    Python os.access()用法实例

    在本篇文章里小编给大家分享了关于Python os.access()用法实例内容以及相关知识点,需要的朋友们学习下。
    2019-02-02
  • Python 通过正则表达式快速获取电影的下载地址

    Python 通过正则表达式快速获取电影的下载地址

    这篇文章主要介绍了Python 通过正则表达式快速获取电影的下载地址,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 利用Python抓取行政区划码的方法

    利用Python抓取行政区划码的方法

    做项目的时候会需要用到各个行政区划的代码,最近就碰巧遇到有这个需求,于是就上网搜了一下,测试后分享给大家,这篇文章就给大家分享了利用Python抓取行政区划码的示例代码,有需要的朋友们可以参考借鉴,下面跟着小编一起去学习学习吧。
    2016-11-11
  • Python hashlib模块详情

    Python hashlib模块详情

    本文,我们来对Python 提供的安全哈希算法的通用接口-hashlib模块进行学习,文章内容具有一定的参考价值,需要的小伙伴可以参考一下
    2021-11-11
  • django之自定义软删除Model的方法

    django之自定义软删除Model的方法

    这篇文章主要介绍了django之自定义软删除Model的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • python range()函数取反序遍历sequence的方法

    python range()函数取反序遍历sequence的方法

    今天小编就为大家分享一篇python range()函数取反序遍历sequence的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python绘制分组对比柱状图

    python绘制分组对比柱状图

    这篇文章主要为大家详细介绍了python绘制分组对比柱状图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • windows10下安装TensorFlow Object Detection API的步骤

    windows10下安装TensorFlow Object Detection API的步骤

    这篇文章主要介绍了windows10下安装TensorFlow Object Detection API的步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • python中如何使用函数改变list

    python中如何使用函数改变list

    这篇文章主要介绍了python中如何使用函数改变list,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 零基础写python爬虫之神器正则表达式

    零基础写python爬虫之神器正则表达式

    正则表达式在Python爬虫中的作用就像是老师点名时用的花名册一样,是必不可少的神兵利器。正则表达式是用于处理字符串的强大工具,它并不是Python的一部分。其他编程语言中也有正则表达式的概念,区别只在于不同的编程语言实现支持的语法数量不同。
    2014-11-11

最新评论