用Python进行AI数据分析进阶教程52:
机器学习之随机森林的参数调整和优化
关键词:随机森林、参数调整、交叉验证、过拟合、网格搜索
摘要:随机森林是一种常用的机器学习算法,其参数调整和优化对提升模型性能至关重要。本文介绍了随机森林的五个主要参数:n_estimators(决策树数量)、max_features(每次分裂考虑的最大特征数)、max_depth(决策树的最大深度)、min_samples_split(拆分内部节点所需的最小样本数)和min_samples_leaf(叶子节点所需的最小样本数)。文章详细阐述了这些参数的关键点和注意点,指出通过交叉验证确定合适参数值的重要性,以避免过拟合或欠拟合。同时,本文提供了使用GridSearchCV进行参数调优的代码示例,通过定义参数网格并进行网格搜索,找到了最优参数组合,并在测试集上验证了模型的准确率。
👉 欢迎订阅🔗
《用Python进行AI数据分析进阶教程》专栏
《AI大模型应用实践进阶教程》专栏
《Python编程知识集锦》专栏
《字节跳动旗下AI制作抖音视频》专栏
《智能辅助驾驶》专栏
《工具软件及IT技术集锦》专栏
在使用随机森林进行机器学习时,参数调整和优化是提升模型性能的关键步骤。下面将详细介绍随机森林的主要参数、调整方法,同时指出关键点和注意点,并给出代码示例及重点语句解读。
一、随机森林主要参数及调整思路
1、n_estimators(决策树数量)
该参数代表随机森林中决策树的数量。通常来说,增加决策树数量能提升模型性能,但同时也会增加训练时间。
(1)关键点:
- 一般而言,n_estimators值越大,模型越稳定,性能越好,但训练时间会相应增加。
- 可通过交叉验证来确定合适的n_estimators值。
(2)注意点:
- 当n_estimators达到一定值后,性能提升会变得不明显,此时再增加该值只会徒增训练时间。
2、max_features(每次分裂考虑的最大特征数)
此参数控制在构建决策树时,每次分裂所考虑的最大特征数量。它可以降低决策树之间的相关性,避免过拟合。
(1)关键点:
- 对于分类问题,默认值为sqrt(n_features);对于回归问题,默认值为n_features。
- 可以尝试不同的值,如log2(n_features)、n_features等,以找到最优值。
(2)注意点:
- 若max_features值过大,决策树之间的相关性会增加,容易导致过拟合;若值过小,可能会导致欠拟合。
3、max_depth(决策树的最大深度)
该参数限制决策树的最大深度。若不设置,决策树可能会一直生长,直至每个叶子节点只有一个样本,这容易引发过拟合。
(1)关键点:
- 通过设置合适的max_depth,可以防止决策树过深,从而避免过拟合。
- 可以使用交叉验证来确定最佳的max_depth值。
(2)注意点:
- 若max_depth设置过小,决策树可能无法充分学习数据的特征,导致欠拟合;若设置过大,又容易过拟合。
4、min_samples_split(拆分内部节点所需的最小样本数)
该参数规定了拆分内部节点所需的最小样本数。若节点的样本数小于该值,则不再进行拆分。
(1)关键点:
- 增大min_samples_split可以防止决策树过拟合。
- 可通过交叉验证来调整该参数。
(2)注意点:
- 若min_samples_split设置过大,决策树可能无法充分学习数据的特征,导致欠拟合。
5、min_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、重点语句解读
(1)param_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数据分析进阶教程》专栏 |
| 2 | AI大模型应用实践进阶教程 | 《AI大模型应用实践进阶教程》专栏 |
| 3 | Python编程知识集锦 | 《Python编程知识集锦》专栏 |
| 4 | 字节跳动旗下AI制作抖音视频 | 《字节跳动旗下AI制作抖音视频》专栏 |
| 5 | 智能辅助驾驶 | 《智能辅助驾驶》专栏 |
| 6 | 工具软件及IT技术集锦 | 《工具软件及IT技术集锦》专栏 |
👉 关注我 @理工男大辉郎 获取实时更新
欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
优快云博客:理工男大辉郎
抖音号:31580422589
1653

被折叠的 条评论
为什么被折叠?



