52、机器学习之随机森林的参数调整和优化【用Python进行AI数据分析进阶教程】

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

用Python进行AI数据分析进阶教程52:

机器学习之随机森林的参数调整和优化


关键词:随机森林、参数调整、交叉验证、过拟合、网格搜索

摘要:随机森林是一种常用的机器学习算法,其参数调整和优化对提升模型性能至关重要。本文介绍了随机森林的五个主要参数:n_estimators(决策树数量)、max_features(每次分裂考虑的最大特征数)、max_depth(决策树的最大深度)、min_samples_split(拆分内部节点所需的最小样本数)和min_samples_leaf(叶子节点所需的最小样本数)。文章详细阐述了这些参数的关键点和注意点,指出通过交叉验证确定合适参数值的重要性,以避免过拟合或欠拟合。同时,本文提供了使用GridSearchCV进行参数调优的代码示例,通过定义参数网格并进行网格搜索,找到了最优参数组合,并在测试集上验证了模型的准确率。

👉 欢迎订阅🔗
《用Python进行AI数据分析进阶教程》专栏
《AI大模型应用实践进阶教程》专栏
《Python编程知识集锦》专栏
《字节跳动旗下AI制作抖音视频》专栏
《智能辅助驾驶》专栏
《工具软件及IT技术集锦》专栏


在使用随机森林进行机器学习时,参数调整和优化是提升模型性能的关键步骤。下面将详细介绍随机森林的主要参数、调整方法,同时指出关键点和注意点,并给出代码示例及重点语句解读。

一、随机森林主要参数及调整思路

1n_estimators(决策树数量)

该参数代表随机森林中决策树的数量。通常来说,增加决策树数量能提升模型性能,但同时也会增加训练时间。

(1)关键点

  • 一般而言,n_estimators值越大,模型越稳定,性能越好,但训练时间会相应增加。
  • 可通过交叉验证来确定合适的n_estimators值。

(2)注意点

  • n_estimators达到一定值后,性能提升会变得不明显,此时再增加该值只会徒增训练时间。

2max_features(每次分裂考虑的最大特征数)

此参数控制在构建决策树时,每次分裂所考虑的最大特征数量。它可以降低决策树之间的相关性,避免过拟合。

(1)关键点

  • 对于分类问题,默认值为sqrt(n_features);对于回归问题,默认值为n_features
  • 可以尝试不同的值,如log2(n_features)n_features等,以找到最优值。

(2)注意点

  • max_features值过大,决策树之间的相关性会增加,容易导致过拟合;若值过小,可能会导致欠拟合。

3max_depth(决策树的最大深度)

该参数限制决策树的最大深度。若不设置,决策树可能会一直生长,直至每个叶子节点只有一个样本,这容易引发过拟合。

(1)关键点

  • 通过设置合适的max_depth,可以防止决策树过深,从而避免过拟合。
  • 可以使用交叉验证来确定最佳的max_depth值。

(2)注意点

  • max_depth设置过小,决策树可能无法充分学习数据的特征,导致欠拟合;若设置过大,又容易过拟合。

4min_samples_split(拆分内部节点所需的最小样本数)

该参数规定了拆分内部节点所需的最小样本数。若节点的样本数小于该值,则不再进行拆分。

(1)关键点

  • 增大min_samples_split可以防止决策树过拟合。
  • 可通过交叉验证来调整该参数。

(2)注意点

  • min_samples_split设置过大,决策树可能无法充分学习数据的特征,导致欠拟合。

5min_samples_leaf(叶子节点所需的最小样本数)

该参数表示叶子节点所需的最小样本数。若叶子节点的样本数小于该值,则会对该节点进行剪枝。

(1)关键点

  • 增大min_samples_leaf可以防止决策树过拟合。
  • 可通过交叉验证来调整该参数。

(2)注意点

  • min_samples_leaf设置过大,决策树可能无法充分学习数据的特征,导致欠拟合。

二、代码示例及解读

1、Python脚本

# 导入NumPy库,用于数值计算和数组操作
import numpy as np
# 从sklearn库的datasets模块导入加载鸢尾花数据集的函数
from sklearn.datasets import load_iris
# 从sklearn库的model_selection模块导入划分训练集和测试集的函数以及网格搜索交叉验证的类
from sklearn.model_selection import train_test_split, GridSearchCV
# 从sklearn库的ensemble模块导入随机森林分类器
from sklearn.ensemble import RandomForestClassifier
# 从sklearn库的metrics模块导入计算准确率的函数
from sklearn.metrics import accuracy_score

try:
    # 加载鸢尾花数据集,该数据集包含了鸢尾花的特征和对应的类别标签
    iris = load_iris()
    # 从鸢尾花数据集中提取特征数据,这些特征是用于训练模型的输入
    X = iris.data
    # 从鸢尾花数据集中提取目标数据,即每个样本对应的类别标签
    y = iris.target

# 使用train_test_split函数将数据集划分为训练集和测试集,
# 测试集占比30%,random_state=42保证每次划分结果一致
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 定义参数网格,用于随机森林分类器的参数调优,
# GridSearchCV会在这个参数网格中寻找最优参数组合
    param_grid = {
        # 随机森林中决策树的数量,尝试不同的数量以找到最优值
        'n_estimators': [50, 100, 200],
        # 划分节点时考虑的最大特征数,
#  'sqrt'表示考虑特征数的平方根,'log2'表示考虑特征数的对数
        'max_features': ['sqrt', 'log2'],
        # 决策树的最大深度,None表示不限制树的深度
        'max_depth': [None, 10, 20, 30],
        # 拆分内部节点所需的最小样本数,防止过拟合
        'min_samples_split': [2, 5, 10],
        # 叶子节点所需的最小样本数,防止过拟合
        'min_samples_leaf': [1, 2, 4]
    }

    # 创建随机森林分类器实例,random_state=42保证每次运行模型的结果一致
    rf = RandomForestClassifier(random_state=42)

# 使用GridSearchCV进行参数调优,estimator指定要调优的模型为随机森林分类器,
# param_grid是参数网格,cv=5表示5折交叉验证,
# n_jobs=-1表示使用所有可用的CPU核心进行并行计算
    grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5, n_jobs=-1)

    # 在训练集上进行网格搜索,寻找最优参数组合
    grid_search.fit(X_train, y_train)

    # 输出在网格搜索中找到的最优参数组合
    print("Best parameters found: ", grid_search.best_params_)

    # 获取使用最优参数组合的模型实例
    best_model = grid_search.best_estimator_
    # 使用最优模型对测试集进行预测,得到预测结果
    y_pred = best_model.predict(X_test)

    # 计算模型在测试集上的准确率,即预测正确的样本数占总样本数的比例
    accuracy = accuracy_score(y_test, y_pred)
    # 输出模型在测试集上的准确率
    print(f"Accuracy: {accuracy}")
except Exception as e:
    # 如果代码执行过程中出现异常,打印异常信息
    print(f"An error occurred: {e}")

2、输出 / 打印结果示例及注释

plaintext

Best parameters found: {'max_depth': None, 'max_features': 'sqrt', 'min_samples_leaf': 1, 'min_samples_split': 2, 'n_estimators': 100}

  • 以上输出显示了在网格搜索中找到的最优参数组合,这里表示随机森林中决策树的最大深度不限制,划分节点时考虑特征数的平方根,叶子节点最小样本数为1,拆分内部节点最小样本数为2,决策树数量为100。
  • Accuracy: 0.9777777777777777

            以上输出显示了使用最优参数组合的模型在测试集上的准确率,这里表示模型的准确率约为97.8%。

  • 需要注意的是,由于随机森林的随机性(即使设置了random_state),每次运行代码时得到的最优参数组合和准确率可能会略有不同。

3、重点语句解读

1param_grid

Python脚本

param_grid = {
    'n_estimators': [50, 100, 200],
    'max_features': ['sqrt', 'log2'],
    'max_depth': [None, 10, 20, 30],
    'min_samples_split': [2, 5, 10],
    'min_samples_leaf': [1, 2, 4]}

此代码定义了一个参数网格,包含了要调整的参数及其可能的值。GridSearchCV会对这些参数的所有组合进行尝试,以找到最优参数。

(2)grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5, n_jobs=-1):

  • estimator=rf:指定要调优的模型为随机森林分类器。
  • param_grid=param_grid:指定参数网格。
  • cv=5:表示使用 5 折交叉验证。
  • n_jobs=-1:表示使用所有可用的 CPU 核心进行并行计算,以加快调优速度。

(3)grid_search.fit(X_train, y_train):

  • 该语句使用训练集数据对GridSearchCV进行训练,它会尝试参数网格中的所有参数组合,并使用交叉验证来评估每个组合的性能。

(4)print("Best parameters found: ", grid_search.best_params_):

  • 此语句输出通过GridSearchCV找到的最佳参数组合。

(5)best_model = grid_search.best_estimator_:

  • 该语句获取使用最佳参数组合的随机森林模型。

(6)y_pred = best_model.predict(X_test):

  • 使用最佳参数的模型对测试集进行预测。

(7)accuracy = accuracy_score(y_test, y_pred):

  • 计算模型在测试集上的准确率。

通过上述步骤,你可以对随机森林模型的参数进行调优,从而提升模型的性能。

——The END——


🔗 欢迎订阅专栏

序号专栏名称说明
1用Python进行AI数据分析进阶教程《用Python进行AI数据分析进阶教程》专栏
2AI大模型应用实践进阶教程《AI大模型应用实践进阶教程》专栏
3Python编程知识集锦《Python编程知识集锦》专栏
4字节跳动旗下AI制作抖音视频《字节跳动旗下AI制作抖音视频》专栏
5智能辅助驾驶《智能辅助驾驶》专栏
6工具软件及IT技术集锦《工具软件及IT技术集锦》专栏

👉 关注我 @理工男大辉郎 获取实时更新

欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
优快云博客:理工男大辉郎
抖音号:31580422589

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

理工男大辉郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值