news 2026/8/27 3:36:09

Day 11 常见的调参方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day 11 常见的调参方式

@浙大疏锦行

学习目标

三种主流调参方法:

网格搜索(GridSearchCV):穷举式搜索
穷举所有参数组合、能找到最优解、计算量大,维度灾难、 参数空间小,计算资源充足

随机搜索(RandomizedSearchCV):随机采样---只是一种思想
随机采样参数组合、效率高于网格搜索 、可能错过最优解、参数空间大,中等计算资源

贝叶斯优化(BayesSearchCV):智能优化
基于概率模型智能搜索、高效,收敛快 、实现复杂 、 参数空间大,计算资源有限

实战:随机森林调参

1.基线模型

# --- 1. 默认参数的随机森林 --- # 评估基准模型,这里确实不需要验证集 print("--- 1. 默认参数随机森林 (训练集 -> 测试集) ---") import time # 这里介绍一个新的库,time库,主要用于时间相关的操作,因为调参需要很长时间,记录下会帮助后人知道大概的时长 start_time = time.time() # 记录开始时间 rf_model = RandomForestClassifier(random_state=42) rf_model.fit(X_train, y_train) # 在训练集上训练 rf_pred = rf_model.predict(X_test) # 在测试集上预测 end_time = time.time() # 记录结束时间 print(f"训练与预测耗时: {end_time - start_time:.4f} 秒") print("\n默认随机森林 在测试集上的分类报告:") print(classification_report(y_test, rf_pred)) print("默认随机森林 在测试集上的混淆矩阵:") print(confusion_matrix(y_test, rf_pred))

2.网格搜索优化

# --- 2. 网格搜索优化随机森林 --- print("\n--- 2. 网格搜索优化随机森林 (训练集 -> 测试集) ---") from sklearn.model_selection import GridSearchCV # 定义要搜索的参数网格 param_grid = { 'n_estimators': [50, 100, 200], 'max_depth': [None, 10, 20, 30], 'min_samples_split': [2, 5, 10], 'min_samples_leaf': [1, 2, 4] } # 创建网格搜索对象 grid_search = GridSearchCV(estimator=RandomForestClassifier(random_state=42), # 随机森林分类器 param_grid=param_grid, # 参数网格 cv=5, # 5折交叉验证 n_jobs=-1, # 使用所有可用的CPU核心进行并行计算 scoring='accuracy') # 使用准确率作为评分标准 start_time = time.time() # 在训练集上进行网格搜索 grid_search.fit(X_train, y_train) # 在训练集上训练,模型实例化和训练的方法都被封装在这个网格搜索对象里了 end_time = time.time() print(f"网格搜索耗时: {end_time - start_time:.4f} 秒") print("最佳参数: ", grid_search.best_params_) #best_params_属性返回最佳参数组合 # 使用最佳参数的模型进行预测 best_model = grid_search.best_estimator_ # 获取最佳模型 best_pred = best_model.predict(X_test) # 在测试集上进行预测 print("\n网格搜索优化后的随机森林 在测试集上的分类报告:") print(classification_report(y_test, best_pred)) print("网格搜索优化后的随机森林 在测试集上的混淆矩阵:") print(confusion_matrix(y_test, best_pred))

3.随机搜索优化

# --- 2. 随机搜索优化随机森林 --- print("\n--- 2. 随机搜索优化随机森林 (训练集 -> 测试集) ---") from sklearn.model_selection import RandomizedSearchCV from scipy.stats import randint # 定义参数分布(使用分布而非固定列表) param_distributions = { 'n_estimators': randint(50, 200), # 从50-200之间随机整数 'max_depth': [None, 10, 20, 30], # 也可以用固定列表 'min_samples_split': randint(2, 11), # 从2-10之间随机整数 'min_samples_leaf': randint(1, 5) # 从1-4之间随机整数 } # 创建随机搜索对象 random_search = RandomizedSearchCV( estimator=RandomForestClassifier(random_state=42), param_distributions=param_distributions, n_iter=50, # 随机采样50次(可调整) cv=5, # 5折交叉验证 n_jobs=-1, # 使用所有CPU核心 scoring='accuracy', random_state=42 # 保证结果可复现 ) start_time = time.time() # 在训练集上进行随机搜索 random_search.fit(X_train, y_train) end_time = time.time() print(f"随机搜索耗时: {end_time - start_time:.4f} 秒") print("最佳参数: ", random_search.best_params_) # 使用最佳参数的模型进行预测 best_model_random = random_search.best_estimator_ best_pred_random = best_model_random.predict(X_test) print("\n随机搜索优化后的随机森林 在测试集上的分类报告:") print(classification_report(y_test, best_pred_random)) print("随机搜索优化后的随机森林 在测试集上的混淆矩阵:") print(confusion_matrix(y_test, best_pred_random))

4.贝叶斯优化

# pip install scikit-optimize -i https://pypi.tuna.tsinghua.edu.cn/simple # --- 2. 贝叶斯优化随机森林 --- print("\n--- 2. 贝叶斯优化随机森林 (训练集 -> 测试集) ---") from skopt import BayesSearchCV from skopt.space import Integer from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, confusion_matrix import time # 定义要搜索的参数空间 search_space = { 'n_estimators': Integer(50, 200), 'max_depth': Integer(10, 30), 'min_samples_split': Integer(2, 10), 'min_samples_leaf': Integer(1, 4) } # 创建贝叶斯优化搜索对象 bayes_search = BayesSearchCV( estimator=RandomForestClassifier(random_state=42), search_spaces=search_space, n_iter=32, # 迭代次数,可根据需要调整 cv=5, # 5折交叉验证,这个参数是必须的,不能设置为1,否则就是在训练集上做预测了 n_jobs=-1, scoring='accuracy' ) start_time = time.time() # 在训练集上进行贝叶斯优化搜索 bayes_search.fit(X_train, y_train) end_time = time.time() print(f"贝叶斯优化耗时: {end_time - start_time:.4f} 秒") print("最佳参数: ", bayes_search.best_params_) # 使用最佳参数的模型进行预测 best_model = bayes_search.best_estimator_ best_pred = best_model.predict(X_test) print("\n贝叶斯优化后的随机森林 在测试集上的分类报告:") print(classification_report(y_test, best_pred)) print("贝叶斯优化后的随机森林 在测试集上的混淆矩阵:") print(confusion_matrix(y_test, best_pred))

5.贝叶斯优化进阶

# pip install bayesian-optimization -i https://mirrors.aliyun.com/pypi/simple/ # --- 2. 贝叶斯优化随机森林 --- print("\n--- 2. 贝叶斯优化随机森林 (训练集 -> 测试集) ---") from bayes_opt import BayesianOptimization from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score from sklearn.metrics import classification_report, confusion_matrix import time import numpy as np # 假设 X_train, y_train, X_test, y_test 已经定义好 # 定义目标函数,这里使用交叉验证来评估模型性能 def rf_eval(n_estimators, max_depth, min_samples_split, min_samples_leaf): n_estimators = int(n_estimators) max_depth = int(max_depth) min_samples_split = int(min_samples_split) min_samples_leaf = int(min_samples_leaf) model = RandomForestClassifier( n_estimators=n_estimators, max_depth=max_depth, min_samples_split=min_samples_split, min_samples_leaf=min_samples_leaf, random_state=42 ) scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy') return np.mean(scores) # 定义要搜索的参数空间 pbounds_rf = { 'n_estimators': (50, 200), 'max_depth': (10, 30), 'min_samples_split': (2, 10), 'min_samples_leaf': (1, 4) } # 创建贝叶斯优化对象,设置 verbose=2 显示详细迭代信息 optimizer_rf = BayesianOptimization( f=rf_eval, # 目标函数 pbounds=pbounds_rf, # 参数空间 random_state=42, # 随机种子 verbose=2 # 显示详细迭代信息 ) start_time = time.time() # 开始贝叶斯优化 optimizer_rf.maximize( init_points=5, # 初始随机采样点数 n_iter=32 # 迭代次数 ) end_time = time.time() print(f"贝叶斯优化耗时: {end_time - start_time:.4f} 秒") print("最佳参数: ", optimizer_rf.max['params']) # 使用最佳参数的模型进行预测 best_params = optimizer_rf.max['params'] best_model = RandomForestClassifier( n_estimators=int(best_params['n_estimators']), max_depth=int(best_params['max_depth']), min_samples_split=int(best_params['min_samples_split']), min_samples_leaf=int(best_params['min_samples_leaf']), random_state=42 ) best_model.fit(X_train, y_train) best_pred = best_model.predict(X_test) print("\n贝叶斯优化后的随机森林 在测试集上的分类报告:") print(classification_report(y_test, best_pred)) print("贝叶斯优化后的随机森林 在测试集上的混淆矩阵:") print(confusion_matrix(y_test, best_pred))
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 0:26:40

18、Linux系统文件共享与安全防护指南

Linux系统文件共享与安全防护指南 1. 文件共享方式选择 在网络中使用Linux系统共享文件时,主要有两种选择:Samba和NFS,它们各有优缺点,选择取决于要共享文件的计算机类型。 | 共享方式 | 适用场景 | 优点 | 缺点 | | ---- | ---- | ---- | ---- | | Samba | 与Windows…

作者头像 李华
网站建设 2026/8/27 2:46:30

23、Linux Mint 故障排除全攻略

Linux Mint 故障排除全攻略 1. 软件渲染模式故障排除 在 Linux Mint 的 Cinnamon 版本中,如果 Cinnamon 无法直接访问显卡或获取高效运行所需的资源,系统会进入软件渲染模式。登录后,你会看到一条消息,提示已启用此模式。此模式允许你在排查根本原因时继续使用计算机,但…

作者头像 李华
网站建设 2026/8/26 13:26:22

26、Linux Mint MATE与KDE版本使用指南

Linux Mint MATE与KDE版本使用指南 1. MATE版本的Linux Mint使用体验 在使用MATE版本的Linux Mint时,屏幕底部的面板会随着应用程序的打开和关闭而显示或隐藏应用图标。运行中的应用程序的操作方式与其他桌面环境类似,你可以通过面板的右键菜单来最小化、最大化窗口以及关闭…

作者头像 李华
网站建设 2026/8/26 14:30:06

Kubernetes Master 节点核心组件全景解析

Kubernetes Master 节点核心组件全景解析 引言 在 Kubernetes 集群中,Master 节点是“大脑”和“控制中心”,负责整个集群的管理、调度、监控与期望状态的维护。 相对而言,**工作节点(Node)**负责运行实际的应用容器。 Master 节点核心组件主要包括: kube-apiserver e…

作者头像 李华
网站建设 2026/8/25 20:32:21

SolidWorks异形孔向导功能介绍

SolidWorks 的 异形孔向导(Hole Wizard)​ 是其最核心的特征工具之一,主要用于快速创建符合国际标准(如 ISO、ANSI、GB 等)的标准化孔特征(如螺纹孔、沉头孔、锥孔、阶梯孔等)。它通过参数化设计…

作者头像 李华
网站建设 2026/8/27 5:57:14

数据大国的存储短板:600亿HDD依赖如何突围?

“HDD(机械硬盘),是我们IT产业链里唯一还没拿下的核心件。”华为高级副总裁、华为云CEO兼数据存储产品线总裁周跃峰的这番言论,近期在存储行业引发广泛共鸣。在AI扩容、云上增算成为行业热点的当下,这个看似“老掉牙”的存储设备,突然成为悬在中国存储产业头顶的“达摩克…

作者头像 李华