【超参数研究02】使用随机搜索优化超参数

news2025/1/15 3:21:42

 一、说明

        在神经网络训练中,超参数也是需要优化的,然而在超参数较多(大于3个)后,如果用穷举的,或是通过经验约摸实现就显得费时费力,无论如何,这是需要研究、规范、整合的要点,本文对超参的随机性搜索展开研究。

二、超参数研究

       我在之前的超参数调优文章中提到了网格搜索。让我们从上次中断的地方继续。

        虽然网格搜索是用于超参数优化的强大工具,但它的计算成本可能很高,并且用于高维超参数空间不切实际。因为它使用参数网格的所有组合子集。

        随机搜索解决了这个问题。在随机搜索CV中,用户为模型的每个超参数定义值的分布。然后,该算法从这些分布中随机采样超参数,以创建一组超参数组合。例如,如果有三个范围为 [0.1、1.0]、[10, 100] 和 [1, 10] 的超参数,则算法可能会分别随机采样 0.4、75 和 5 的值,以创建超参数组合。

        当超参数的数量很大时,随机搜索比网格搜索更有效,因为它不需要评估超参数值的所有可能组合。通过随机采样超参数组合,随机搜索可以覆盖超参数空间的更广泛区域,有可能在比网格搜索更少的迭代中找到更好的超参数值。

        在下一节中,我将使用网格搜索示例中使用的相同笔记本电脑价格数据集。我不会再次讨论预处理代码,但您可以参考上一篇文章以获取更多信息。一旦数据集经过了一些预处理,我们最终得到了两个数组,X 和 y,我们将使用它来构建我们的模型。

from sklearn.model_selection import RandomizedSearchCV

三、随机搜索原理应用 

        现在,让我们仔细看看课堂。它接受的参数如下:RandomizedSearchCV

  • estimator是将用于训练的模型(或管道对象)。
  • param_distributions是一个字典或字典列表,用于指定要从中采样超参数的分布。列表中的每个字典对应于一个超参数,其中键是超参数的名称,值是要从中采样的分布。rvs分布必须提供一种采样方法(例如来自scipy.stats.distributions的采样方法)。
  • n_iter是随机组合的数量。
  • cv指定交叉验证拆分策略。它可以是用于指定折叠数的整数值,也可以是交叉验证生成器,可用于定义更高级的交叉验证策略。
  • scoring是用于评估模型性能的指标。它可以采用许多不同的形式,包括字符串、可调用函数和多个指标的字典。分类指标:准确性、精度、召回率、f1。回归指标:neg_mean_squared_error,r2。聚类指标:adjusted_rand_score、silhoutte_score。这些是最受欢迎的,请访问此处查看整个列表。
  • refit指定是否使用搜索期间找到的最佳超参数重新调整整个数据集上的最佳估计器。默认情况下,设置为 ,这意味着在随机搜索完成后,对象将使用找到的最佳超参数自动重新调整整个数据集上的最佳估计器。refitTrueRandomizedSearchCV
  • verbose控制搜索期间输出的详细程度。
  • pre_dispatch用于控制网格搜索期间并行启动的作业数。它采用一个整数值,该值指定在任何给定时间可以启动的最大作业数。例如,如果 ,则在任何给定时间并行启动的作业都不会超过 2 个。pre_dispatch=2
  • random_state是种子。
  • error_score用于指定在超参数组合无法完成拟合过程时应为其分配的分数。在网格搜索过程中,该算法会针对每个超参数组合训练和评估模型。但是,有时由于内存不足或数值不稳定等原因,模型可能无法拟合或评分。在这种情况下,算法需要为失败的超参数组合分配分数,以便它可以继续搜索。RandomizedSearchCVRandomizedSearchCV
  • return_train_score指定是否在输出中包含训练分数。
import xgboost as xgb
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform, randint

param_distributions = {
    'learning_rate': uniform(0.01, 0.5),
    'n_estimators': randint(100, 1000),
    'max_depth': randint(1, 10),
    'colsample_bytree': uniform(0.1, 0.9),
    'gamma': uniform(0, 1),
    'reg_alpha': uniform(0, 1),
    'reg_lambda': uniform(0, 1)
}

model = xgb.XGBRegressor(random_state=1)

# run the search
random_search = RandomizedSearchCV(
    estimator=model,
    param_distributions=param_distributions,
    n_iter=100,
    cv=5,
    random_state=42,
    verbose=1,
    scoring="neg_root_mean_squared_error"
)
random_search.fit(X_train, y_train)

"""
Fitting 5 folds for each of 100 candidates, totalling 500 fits
"""

        在此示例中,我们使用库和从库中定义一组超参数分布。uniformrandintscipy.stats

        该对象正在执行 5 倍交叉验证(即,将数据集分成 5 个相等的部分,并依次对这些部分中的每一个进行训练和评估)。对于 100 个随机生成的超参数组合中的每一个,模型将被训练和评估 5 次(数据的每一折一次)。因此,总共将有 500 个模型拟合(即,100 个超参数组合 x 每个组合 5 个折叠 = 500 个拟合)。RandomizedSearchCV

该对象与我在上一篇文章中解释的对象共享相同的属性。因此,我不会在这里再次讨论它们。您可以参考我之前的帖子以获取有关这些属性的更多信息。RandomizedSearchCVGridSearchCV

print("Best estimator: ", random_search.best_estimator_)

"""
Best estimator:  XGBRegressor(base_score=0.5, booster='gbtree', callbacks=None,
             colsample_bylevel=1, colsample_bynode=1,
             colsample_bytree=0.36664615513367416, early_stopping_rounds=None,
             enable_categorical=False, eval_metric=None,
             gamma=0.1652669390630025, gpu_id=-1, grow_policy='depthwise',
             importance_type=None, interaction_constraints='',
             learning_rate=0.017818203370596968, max_bin=256,
             max_cat_to_onehot=4, max_delta_step=0, max_depth=9, max_leaves=0,
             min_child_weight=1, missing=nan, monotone_constraints='()',
             n_estimators=443, n_jobs=0, num_parallel_tree=1, predictor='auto',
             random_state=1, reg_alpha=0.3948815181755697,
             reg_lambda=0.2934881747180381, ...)
"""
print("Best score: ", random_search.best_score_)
print("Best hyperparameters: ", random_search.best_params_)

"""
Best score:  -21681.389784324936
Best hyperparameters:  {'colsample_bytree': 0.36664615513367416, 'gamma': 0.1652669390630025, 'learning_rate': 0.017818203370596968, 'max_depth': 9, 'n_estimators': 443, 'reg_alpha': 0.3948815181755697, 'reg_lambda': 0.2934881747180381}
"""
results_df = pd.DataFrame(random_search.cv_results_)
results_df.head()

        第一排result_df。图片由作者提供。

print("Best index: ", random_search.best_index_)
print("Best scorer: ", random_search.scorer_)
print("Best n splits: ", random_search.n_splits_)
print("Best refit time: ", random_search.refit_time_)
print("Best multi metric: ", random_search.multimetric_)
print("Best n features: ", random_search.n_features_in_)

"""
Best index:  10
Best scorer:  make_scorer(mean_squared_error, greater_is_better=False, squared=False)
Best n splits:  5
Best refit time:  0.45199108123779297
Best multi metric:  False
Best n features:  51
"""
best_model = random_search.best_estimator_
best_model.fit(X_train, y_train)
y_pred = best_model.predict(X_test)
rmse_train = np.sqrt(mean_squared_error(y_train, best_model.predict(X_train)))
rmse_test = np.sqrt(mean_squared_error(y_test, y_pred))
print(f"Train RMSE: {rmse_train}, Test RMSE: {rmse_test}")

"""
Train RMSE: 3604.8162519843863, Test RMSE: 17321.86440339491
"""

        我们得到的结果或多或少与.GridSearchCV

  • 当超参数的搜索空间较大,且不同超参数的值之间没有明显的相关性时,随机搜索效果最好。另一方面,网格搜索在搜索空间较小且具有清晰结构或网格状结构时效果最佳。
  • 当要搜索的超参数数量很大时,随机搜索可能比网格搜索更快,因为它只需要评估超参数的随机子集,而网格搜索评估超参数的每个组合。但是,如果搜索空间较小或要搜索的超参数数量相对较少,则网格搜索可能会更快。
  • 如果您对哪些超参数对您的模型更重要有先验知识或直觉,则网格搜索可以更有效,因为它会评估超参数的每个组合。在这种情况下,随机搜索可能不那么有效,因为它只是随机采样超参数的子集。
  • 如果计算资源有限,随机搜索可能是更好的选择,因为与网格搜索相比,它需要的资源更少。

四、

本系列教程研究。包含:【超参数研究01】使用网格搜索优化超参数-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1127525.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【自用】知识点梳理 自动控制第Z章 离散s

目录标题 离散XXXQ1 离散化的表达式和传递函数怎么匹配上? 离散系统的分析与校正Q ZOH有什么作用K ZOH的Z变换✨K Z变换表格模拟化矫正ZOH的等效Q 为什么离散化之后幅值会变化?Q 模拟化校正中ZOH环节为什么需要等效成惯性环节? 离散化的方法Q…

Android dumpsys介绍

文章目录 一、需求二、环境三、相关概念3.1 dumpsys3.2 Binder3.3 管道 四、dumpsys指令的使用4.1 dumpsys使用4.2 dumpsys指令语法 五、详细设计5.1 dumpsys流程图5.2 dumpsys查看电池信息5.2.1 dumpsys battery指令5.2.2 service->dump打印函数 5.3 dumpsys源码分析5.3.1 …

[support2022@cock.li].faust、[tsai.shen@mailfence.com].faust勒索病毒数据怎么处理|数据解密恢复

引言: 威胁网络安全的恶意软件不断涌现,而[support2022cock.li].faust勒索病毒则是其中的一员。这个网络黑暗角落的新星,以其数据绑架的方式,一度成为数据安全的威胁焦点。本文将探究[support2022cock.li].faust勒索病毒的运作方…

Cypress的安装与启动

目录 一:Cypress介绍 二:安装与使用 1、下载node.js 2、安装Cypress 3、启动Cypress 3、解决异常 三:总结 一:Cypress介绍 Cypress 是为现代网络而构建的下一代前端测试工具,用于解决开发者和 QA 工程师在测试现…

【Hydro】水文模型比较框架MARRMoT - 包含47个概念水文模型的Matlab代码

目录 说明源代码运行实例workflow_example_1.mworkflow_example_2.mworkflow_example_3.mworkflow_example_4.m 测试1、 结构体兼容性问题2、append的兼容性问题3、修改后的MARRMoT_model.m 说明 MARRMoT是一个新的水文模型比较框架,允许不同概念水文模型结构之间的…

BandZip 免费纯净快速的文件压缩/解压缩软件

BandZip 功能齐全、性能优异的免费文件压缩和解压缩工具。版本 7.x 及以上有广告,安装 7.x 以下版本即可。 功能以及特性 支持多种常见的压缩格式,包括 ZIP、RAR、7Z、TAR 等;高效的压缩算法,能够将文件压缩到较小的体积&#…

【网络安全 --- 任意文件下载漏洞(1)】任意文件下载漏洞

一,环境,工具准备 1-1 VMVare 16 虚拟机及下载安装(资源) 请参考以下博客安装(特详细):【网络安全 --- 工具安装】VMware 16.0 详细安装过程(提供资源)-CSDN博客【网络安…

vue2vue3--render函数(h)

目录 h函数 方法1. 在Options API中的使用 方法2. 在Composition API中的使用 Vue 2中的渲染函数 ​基础​ vue2 vue3 vue3--声明渲染函数 节点、树以及虚拟 DOM ​虚拟 DOM​ createElement 参数 深入数据对象 约束 vue2 vue3 使用 JavaScript 代替模板功能…

使用cpolar内网穿透实现远程Stackedit Markdown编辑器

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器,在GitHub上拥有20.7k Star!,它支持将Markdown笔记保…

库克嘴上说着共赢,实际却是降低中国制造占比,外媒:真是老狐狸

近期库克再度访华,在成都的苹果线下零售店与消费者密切互动,参观立讯精密并表示与中国制造合作共赢,然而日本媒体拆解iPhone15却撕下了苹果的遮羞布,库克真的是老狐狸。 一直以来,苹果CEO库克都积极向中国消费者释放善…

《java核心卷Ⅰ》知识点总结(可作面试题)

🛫 JDK和JRE傻傻分不清?🛫 HelloWorld的输出都经历了啥?🛫 Java的三个版本都是啥?🛫 关于main方法你都知道啥?main方法被声明为private会怎样?🛫 强制and自动类型转换都…

使用whatweb和python批量获取指纹信息

该程序去除了whatweb输出的一些乱码 import sys import os from pathlib import Path if __name__ "__main__":type sys.stdout.encoding file1Path("out.txt")if file1.is_file():os.remove("out.txt")os.system("whatweb -i url.txt -…

Flutter页面滑动回调处理解决方法

文章目录 TabBarViewTabBarView简介TabBarView详细介绍 TabBarView滑动时如何处理事务例子 PageControllerPageController介绍PageController 的详细介绍 TabBarView TabBarView简介 TabBarView 是 Flutter 中的一个用于显示选项卡视图的小部件。它通常与 TabBar 一起使用&am…

Vue 实战项目(智慧商城项目): 完整的订单购物管理功能 内涵资源代码 基于Vant组件库 Vuex态管理 基于企业级项目开发规范

鹏鹏老师的实战开发项目 智慧商城项目 接口文档:安全问题(需要私信即可) 演示地址:跳转项目地址 01. 项目功能演示 1.明确功能模块 启动准备好的代码,演示移动端面经内容,明确功能模块 在这里插入图…

腾讯云SSH连接不上的一个解决办法

最近在购买完腾讯云服务器后Xshell登录时老是报出Connection failed问题,最后发现问题所在。 解决方法 本人购买的是校园套餐中的轻量应用服务器2核2G,购买完以后打开控制台 在轻量级云服务器中找到自己购买的云服务器后,重置密码&#xff0…

【JavaEE初阶】 CAS详解

文章目录 🌲什么是 CAS🚩CAS伪代码 🎋CAS 是怎么实现的🌳CAS的应用🚩实现原子类🚩实现自旋锁 🎄CAS 的 ABA 问题🚩什么是 ABA 问题🚩ABA 问题引来的 BUG🚩解决…

Spring Boot实战 | 如何整合高性能数据库连接池HikariCP

专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https:/…

MySql第三篇---索引的创建与设计原则

文章目录 MySql第三篇---索引的创建与设计原则索引的声明与使用索引的分类创建索引在已经存在的表上创建索引删除索引 索引的设计原则哪些情况适合创建索引?限制索引的数目哪些情况不适合创建索引? 小结 MySql第三篇—索引的创建与设计原则 索引的声明与…

如何安装Ubuntu20.04(详细图文教程

目录 一.简介 二、需要资源 三、window设置 1、分区 2、启动盘制作 四、ubuntu安装 一.简介 Linux是一种自由和开放源代码的操作系统内核,被广泛应用于各种计算机系统中。它以稳定性、安全性和灵活性而闻名,并成为服务器、嵌入式设备和个人计算机…

如何用BCompare打增量包

一、基本描述 增量包:工程项目中的文件随着开发、更新、迭代过程,更新、修改了部分文件,没必要将所有的文件都更新时,只打包更新、修改了的这部分文件,这样的一个文件包称为增量包。 二、使用场景 在某个大的版本re…