【机器学习-08】参数调优宝典:网格搜索与贝叶斯搜索等攻略

超参数是估计器的参数中不能通过学习得到的参数。在scikit-learn中,他们作为参数传递给估计器不同类的构造函数。典型的例子有支持向量分类器的参数C,kernel和gamma,Lasso的参数alpha等。

​ 在超参数集中搜索以获得最佳cross validation交叉验证分数的方法是可实现并且推荐的。

​ 当构建一个估计器是,任意参数的选取通过这种方式可能会获得最佳参数。尤其是,要想知道参数名字和其对应的当前值,使用:

estimator.get_params() 

​ 搜索包括:

  • 一个估计器(回归或分类,如sklearn.svm.SVC());
  • 一个参数空间;
  • 一个搜索的方法或可选参数集;
  • 一个交叉验证的方案;
  • 一个评分函数。

在scikit-learn中,超参数优化(optimization)或调优(tuning)是为学习算法选择一组最优超参数(Hyper-parameter),找到全局最小值;的方法一般包括以下四种:
在这里插入图片描述

  • 传统或手动调参
  • 网格搜索
  • 随机搜索
  • 贝叶斯搜索

一、 传统或手动调参

机器学习模型调优算法中的“传统或手动调参”是一种重要的优化方法,它主要依赖于模型训练者的经验和判断,对模型的超参数进行调整以达到最佳性能。以下是关于传统或手动调参的详细介绍:

原理:

手动调参的原理在于通过调整模型的超参数,来权衡模型的偏差和方差,从而提高模型的预测性能。超参数是机器学习算法在训练之前需要设定的参数,它们对模型的训练过程和结果有重要影响。

步骤:

  • 理解数据和模型: 首先,模型训练者需要深入了解数据的特性以及所使用的- 机器学习模型的原理。这有助于确定哪些超参数可能对模型的性能有重要影响。
  • 选择初始参数: 可以使用算法的默认参数作为起点,或者根据经验选择一组初始参数进行训练。
  • 调整重要参数: 根据模型的训练效果和性能评估指标(如准确率、召回率、F1分数等),逐步调整对模型性能影响较大的超参数。
  • 评估和调整: 使用验证集或交叉验证来评估不同超参数组合下的模型性能,并根据评估结果调整超参数。
  • **迭代优化:**重复上述步骤,直到找到一组较优的超参数组合,使得模型在验证集上的性能达到最佳。

优点:

  • 灵活性: 手动调参可以根据具体的数据和模型特点进行灵活调整,没有固定的规则限制。
  • 可解释性: 由于调参过程是基于人的经验和判断,因此可以更容易地理解和解释模型的性能变化。

缺点:

  • 依赖经验: 手动调参的效果很大程度上取决于模型训练者的经验和技能水平,对于初学者来说可能难以掌握。
  • 耗时费力: 手动调参通常需要尝试多种不同的超参数组合,并进行多次训练和评估,因此过程可能比较耗时和繁琐。
  • 容易陷入局部最优: 由于手动调参通常是基于当前状态的局部调整,因此可能容易陷入局部最优解,而非全局最优解。

让我们看看如下代码:

#importing required libraries
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold , cross_val_score
from sklearn.datasets import load_winewine = load_wine()
X = wine.data
y = wine.target#splitting the data into train and test set
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3,random_state = 14)#declaring parameters grid
k_value = list(range(2,11))
algorithm = ['auto','ball_tree','kd_tree','brute']
scores = []
best_comb = []
kfold = KFold(n_splits=5)#hyperparameter tunning
for algo in algorithm:for k in k_value:knn = KNeighborsClassifier(n_neighbors=k,algorithm=algo)results = cross_val_score(knn,X_train,y_train,cv = kfold)print(f'Score:{round(results.mean(),4)} with algo = {algo} , K = {k}')scores.append(results.mean())best_comb.append((k,algo))best_param = best_comb[scores.index(max(scores))]
print(f'\nThe Best Score : {max(scores)}')
print(f"['algorithm': {best_param[1]} ,'n_neighbors': {best_param[0]}]")

二、网格搜索

机器学习模型调优算法中的“网格搜索”是一种自动化调参方法,它通过穷举搜索的方式,在指定的参数空间内寻找最优的超参数组合,从而优化模型的性能。以下是对网格搜索的详细介绍:

原理:

网格搜索的原理是基于暴力穷尽搜索,它会在指定的参数范围内,按照设定的步长,生成一个参数网格。然后,网格搜索会遍历这个参数网格中的每一组参数组合,对模型进行训练和评估,以找到在验证集上性能最佳的超参数组合。

步骤:

  • 确定参数范围和步长: 首先,需要确定要搜索的超参数的范围和步长。这通常基于经验、算法的要求或数据的特性来确定。
  • 生成参数网格: 根据确定的参数范围和步长,生成一个参数网格,其中包含了所有可能的参数组合。
  • 遍历参数网格: 对于参数网格中的每一组参数组合,使用这些参数来训练模型,并在验证集上评估模型的性能。
  • 记录最佳参数组合: 在遍历过程中,记录每一组参数对应的模型性能评估结果,并找到性能最佳的一组参数。
  • 使用最佳参数组合: 最后,使用找到的最佳参数组合来重新训练模型,并在测试集上评估其性能。

优点:

  • 简单直观: 网格搜索是一种简单直观的调参方法,易于理解和实现。
  • 全局搜索: 通过遍历整个参数网格,网格搜索能够在全局范围内寻找最优参数组合,避免陷入局部最优。

缺点:

  • 计算成本高: 当参数空间较大或参数范围较广时,网格搜索需要遍历的参数组合数量会急剧增加,导致计算成本非常高昂,可能需要大量的时间和计算资源。
  • 可能不是最优解: 由于网格搜索是基于固定步长的搜索,可能无法找到真正的全局最优解,特别是当最优解位于两个搜索点之间时。
  • 缺乏灵活性: 网格搜索无法根据模型性能的变化动态调整搜索范围和步长,因此对于一些复杂的问题可能不太适用。

让我们来了解一下 sklearn 的 GridSearchCV 是如何工作的,

from sklearn.model_selection import GridSearchCVknn = KNeighborsClassifier()
grid_param = { 'n_neighbors' : list(range(2,11)) , 'algorithm' : ['auto','ball_tree','kd_tree','brute'] }grid = GridSearchCV(knn,grid_param,cv = 5)
grid.fit(X_train,y_train)#best parameter combination
grid.best_params_#Score achieved with best parameter combination
grid.best_score_#all combinations of hyperparameters
grid.cv_results_['params']#average scores of cross-validation
grid.cv_results_['mean_test_score']

三、随机搜索

机器学习模型调优算法中的“随机搜索”是一种高效且灵活的参数调优方法。它通过随机采样超参数空间中的参数组合,来寻找最优的超参数配置,从而优化模型的性能。以下是关于随机搜索的详细介绍:

原理:

随机搜索的原理在于,通过随机采样的方式,从整个超参数空间中挑选出一定数量的参数组合进行评估。与网格搜索不同,随机搜索并不遍历所有可能的参数组合,而是根据指定的采样策略(如均匀分布、正态分布等)在参数空间中进行随机抽样。这种方式可以在有限的计算资源下,快速找到性能较好的超参数组合。

步骤:

  • 定义参数空间: 首先,需要确定要搜索的超参数及其取值范围。这些超参数可以是学习率、正则化系数、树的深度等,具体取决于所使用的机器学习算法。
  • 设置采样策略: 选择合适的采样策略,确定如何从参数空间中随机抽取参数组合。常见的采样策略包括均匀采样、正态分布采样等。
  • 随机采样与评估: 根据采样策略,在参数空间中随机抽取一定数量的参数组合,并使用这些参数组合来训练模型。然后,在验证集上评估模型的性能,并记录每个参数组合对应的性能指标。
  • 选择最佳参数组合: 从所有评估过的参数组合中,选择性能最佳的一组作为最优超参数组合。
  • 重新训练与评估: 使用最优超参数组合重新训练模型,并在测试集上评估其性能。

优点:

  • 计算效率高: 由于随机搜索只需要评估一部分参数组合,因此相对于网格搜索来说,计算成本更低,能够在有限的时间内找到较好的超参数组合。
  • 灵活性强: 随机搜索可以根据问题的特点和计算资源的情况,灵活调整采样策略和采样数量,以适应不同的应用场景。
  • 全局搜索能力: 通过随机采样,随机搜索能够在一定程度上避免陷入局部最优解,具有更好的全局搜索能力。

缺点:

  • 结果不稳定: 由于随机搜索是基于随机采样的,因此每次运行的结果可能会有所不同,存在一定的不确定性。
  • 可能错过最优解: 虽然随机搜索可以在全局范围内搜索超参数组合,但由于其随机性,有时可能会错过真正的最优解。

让我们了解一下 sklearn 的 RandomizedSearchCV 是如何工作的,

from sklearn.model_selection import RandomizedSearchCVknn = KNeighborsClassifier()grid_param = { 'n_neighbors' : list(range(2,11)) , 'algorithm' : ['auto','ball_tree','kd_tree','brute'] }rand_ser = RandomizedSearchCV(knn,grid_param,n_iter=10)
rand_ser.fit(X_train,y_train)#best parameter combination
rand_ser.best_params_#score achieved with best parameter combination
rand_ser.best_score_#all combinations of hyperparameters
rand_ser.cv_results_['params']#average scores of cross-validation
rand_ser.cv_results_['mean_test_score']

四、贝叶斯搜索

之前在博客中也介绍过贝叶斯搜索和python实现,具体参考本人博客贝叶斯优化(Bayesian Optimization)介绍和python实现

机器学习模型调优算法中的“贝叶斯搜索”是一种基于贝叶斯定理的自动化调参方法,它通过不断地更新目标函数的后验分布来寻找最优的超参数组合。以下是对贝叶斯搜索的详细介绍:

原理:

贝叶斯搜索的主要思想是,在给定优化的目标函数(广义的函数,只需指定输入和输出即可,无需知道内部结构以及数学性质)的情况下,通过不断地添加样本点来更新目标函数的后验分布(通常是高斯过程),直到后验分布基本贴合于真实分布。每一次添加样本点都会考虑上一次参数的信息,以便更好地调整当前的参数。贝叶斯搜索的核心过程包括先验函数(Prior Function, PF)与采集函数(Acquisition Function, AC)。PF主要利用高斯过程回归(或其他PF函数)来建模目标函数的分布,而AC则用于确定下一个采样点,以最大化信息增益或最小化预期损失。

步骤:

  • 定义先验分布: 基于问题的特性和经验知识,为超参数定义先验分布。
  • 采集函数与样本选择: 使用采集函数(如EI、PI、UCB等)来评估不同超参数组合的潜在价值,并选择下一个要评估的样本点。
  • 模型评估与更新: 在选定的超参数组合下训练模型,并在验证集上评估其性能。然后,使用这些评估结果来更新目标函数的后验分布。
  • 迭代优化: 重复步骤2和3,直到满足停止条件(如达到最大迭代次数、性能提升不再显著等)。
  • 选择最优参数: 从更新后的后验分布中选择性能最优的超参数组合。

优点:

  • 高效性: 贝叶斯搜索能够平衡探索(在全局尚未探索的区域寻找更好的解)和利用(利用已知信息优化当前解),从而在较少的迭代次数内找到较好的超参数组合。
  • 灵活性: 贝叶斯搜索可以适应各种复杂的目标函数和参数空间,对于非线性、非凸等问题也能表现出良好的性能。
  • 自适应性: 随着迭代次数的增加,贝叶斯搜索会逐渐聚焦于性能更好的参数区域,从而提高搜索效率。

缺点:

  • 计算成本: 尽管贝叶斯搜索相对于网格搜索和随机搜索更为高效,但在处理高维参数空间或需要精确建模的情况下,计算成本仍然可能较高。
  • 实现复杂性: 贝叶斯搜索的实现相对复杂,需要深入理解贝叶斯定理和高斯过程等概念,以及如何选择和使用合适的采集函数。
  • 对初始化的敏感性: 贝叶斯搜索的性能可能受到初始化参数和先验分布的影响,不合理的初始化可能导致搜索过程陷入局部最优解。

让我们用 scikit-optimize 的BayesSearchCV来理解这一点
安装: pip install scikit-optimize
实现贝叶斯搜索的另一个类似的库是 bayesian-optimization

from skopt import BayesSearchCVimport warnings
warnings.filterwarnings("ignore")# parameter ranges are specified by one of below
from skopt.space import Real, Categorical, Integerknn = KNeighborsClassifier()
#defining hyper-parameter grid
grid_param = { 'n_neighbors' : list(range(2,11)) , 'algorithm' : ['auto','ball_tree','kd_tree','brute'] }#initializing Bayesian Search
Bayes = BayesSearchCV(knn , grid_param , n_iter=30 , random_state=14)
Bayes.fit(X_train,y_train)#best parameter combination
Bayes.best_params_#score achieved with best parameter combination
Bayes.best_score_#all combinations of hyperparameters
Bayes.cv_results_['params']#average scores of cross-validation
Bayes.cv_results_['mean_test_score']

五、总结

在机器学习模型调优的过程中,找到参数的最佳组合与所需的计算时间之间始终存在一个权衡。当面对超参数空间庞大、维度众多时,选择适当的优化方式显得尤为重要。以下是针对网格搜索、随机搜索、手动调参和贝叶斯搜索这四种优化方式的总结:

  • 网格搜索提供了一种全面而系统的搜索方法,通过遍历所有可能的参数组合来找到最优解。然而,当参数空间较大时,网格搜索的计算成本会急剧增加,可能导致优化过程耗时过长。

  • 随机搜索则通过随机抽样来减少计算量,同时保持一定的全局搜索能力。它能够在有限的计算资源下快速找到性能较好的参数组合,尤其适用于超参数空间较大或计算资源有限的情况。

  • 手动调参依赖于模型训练者的经验和判断,虽然灵活性较高,但耗时费力且容易陷入局部最优。它通常作为其他自动化调参方法的补充,用于对特定参数进行微调。

  • 贝叶斯搜索则利用贝叶斯定理和高斯过程来不断更新目标函数的后验分布,以找到最优的超参数组合。它在平衡探索和利用方面表现出色,能够在较少的迭代次数内找到较好的解。然而,贝叶斯搜索的实现相对复杂,需要深入理解相关概念和技术。

在实际应用中,我们可以根据问题的特性和计算资源的情况选择合适的优化方式。对于超参数空间较大的情况,可以先使用随机搜索快速找到潜在的参数组合,然后对这些组合进行局部的网格搜索以选择最优特征。这样既能保证一定的全局搜索能力,又能减少计算成本。同时,结合手动调参对特定参数进行微调,可以进一步提高模型的性能。最终,在找到参数的最佳组合的保证和计算时间之间取得一个合理的权衡。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言基础】:字符串函数(二)

文章目录 一、strncpy函数的使用二、strncat函数的使用三、strncmp函数的使用四、strstr函数的使用和模拟实现4.1 strstr函数的使用4.2 strstr函数的模拟实现 五、strtok函数的使用六、strerror函数的使用 上节回顾:【C语言基础】:字符函数和字符串函数 …

基于java+springboot+vue实现的健身房管理系统(文末源码+Lw+ppt)23-523

摘 要 健身房管理的以往工作流程繁杂、多样、管理复杂与设备维护繁琐。而如今计算机已完全能够胜任健身房管理工作,而且更加准确、方便、快捷、高效、清晰、透明,它完全可以克服以上所述的不足之处。这将给查询信息和管理带来很大的方便,从…

Docker部署Alist全平台网盘神器结合内网穿透实现无公网IP访问云盘资源

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-oZuxWTWUiXLx3aQO {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

数据本地性如何助力企业在云上实现高效机器学习

分享嘉宾: Lu Qiu, Shawn Sun 本文将讨论数据本地性对于在云上进行高效机器学习的重要性。首先对比现有解决方案的利弊,并综合考虑如何通过数据本地性来降低成本和实现性能最大化。其次会介绍新一代的Alluxio设计与实现,详细说明其在模型训练…

刷题28-30(力扣0322/0078/0221)

0322. 零钱兑换 题目: 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以…

一文带你看懂 前后端之间图片的上传与回显

一文带你看懂 前后端之间图片的上传与回显 前言 看了很多类似的文章,发现很多文章,要不就是不对,要不就是代码写的不通俗易懂,所以有了这篇文章,我将会从原理到实战,带你了解 实战包含前端 原生 vue3 rea…

Gold Effects

HDRP、URP、LWRP和标准支持 完全可定制的金币效果。几乎每个属性都是可调整的,您可以更改这些效果的颜色、渐变、噪波纹理和整体形状。支持HDRP、URP和LWRP,当然也支持标准渲染器。易于拖放设置,带有定制示例的演示场景。使用标准Unity Animator为箱子制作动画,因此您可以轻…

Python爬虫与数据可视化源码免费领取

引言 作为一名在软件技术领域深耕多年的专业人士,我不仅在软件开发和项目部署方面积累了丰富的实践经验,更以卓越的技术实力获得了🏅30项软件著作权证书的殊荣。这些成就不仅是对我的技术专长的肯定,也是对我的创新精神和专业承诺…

电子科技大学链时代工作室招新题C语言部分---题号H

1. 题目 最有操作的一道题,有利于对贪心算法有个初步了解。 这道题的开篇向我们介绍了一个叫汉明距离的概念。 汉明距离指的就是两个相同长度的字符串的不同字符的个数。 例如,abc和acd,b与c不同,c与d不同,所以这两个…

每周一算法:迭代加深A*

题目链接 AcWing 180. 排书 题目描述 给定 n n n 本书,编号为 1 ∼ n 1\sim n 1∼n。 在初始状态下,书是任意排列的。 在每一次操作中,可以抽取其中连续的一段,再把这段插入到其他某个位置。 我们的目标状态是把书按照 1 ∼…

牛客题霸-SQL进阶篇(刷题记录一)

本文基于前段时间学习总结的 MySQL 相关的查询语法,在牛客网找了相应的 MySQL 题目进行练习,以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多,因此本文不再展示,只提供 MySQL 代码与示例输出。 部分题目因…

青海200MW光伏项目 35kV开关站图像监控及安全警示系统

一、背景 随着我国新能源产业的快速发展,光伏发电作为清洁能源的重要组成部分,得到了国家政策的大力扶持。青海作为我国光伏资源丰富地区,吸引了众多光伏项目的投资建设。在此背景下,为提高光伏发电项目的运行效率和安全性能&…

基于Java中的SSM框架实现万卷图书馆书籍借阅管理系统项目【项目源码+论文说明】

基于Java中的SSM框架实现万卷图书馆书籍借阅管理系统演示 摘要 图书管理系统,是一个由人、计算机等组成的能进行管理信息的收集、传递、加工、保存、维护和使用的系统。利用信息控制企业的行为;帮助企业实现其规划目标。 图书馆管理系统,能…

二、typescript基础语法

一、条件语句 二、函数 1、有名函数 function add(x:number, y:number):number {return x y;}2、匿名函数 let add function (x:number, y:number):number {return x y;}函数可选参数 function buildName(firstname: string, lastname?:string) {if (lastname) {return fi…

asp.net mvc 重新引导视图路径,改变视图路径

asp.net mvc 重新引导视图路径,改变视图路径 使用指定的控制器上下文和母版视图名称来查找指定的视图 通过本文学习,你可以根据该技法,去实现,站点自定义皮肤,手机站和电脑站,其他设备站点,在不…

3.面向对象中级

文章目录 包访问修饰符封装继承继承使用细节继承内存布局及细节 Supersuper使用细节super与this比较 overwrite多态对象的多态:向上转型:向下转型:多态细节动态绑定机制 Object类equalshashcodetoStringfinalize 包 区分相同名字的类&#x…

LeetCode讲解算法1-排序算法(Python版)

文章目录 一、引言问题提出 二、排序算法1.选择排序(Selection Sort)2.冒泡排序3.插入排序(Insertion Sort)4.希尔排序(Shell Sort)5.归并排序(Merge Sort)6.快速排序(Qu…

linux之shell脚本基础

1.构建基础脚本 1.1 创建shell脚本 1.1.1 第一行需要指定使用的shell # 用作注释行.shell并不会处理脚本中的注释行,但是第一行的注释,会告诉shell使用哪个shell来运行脚本. #!/bin/bash 1.1.2 让shell找到你的脚本 直接运行脚本会提示-bash: a.sh: command not found.因…

Selenium 自动化 —— Selenium IDE录制、回放、导出Java源码

Hello Selenium 示例 之前我们在专栏的第一篇文章中演示了使用使用Selenium进行百度搜索的Hello world示例。 代码不复杂非常简单: public static void main(String[] args) {WebDriver driver null;try {// 设置Chrome驱动的路径 // System.setPro…

Javaweb学习记录(三)请求响应案例

下面为一个请求响应案例,postman发送请求,服务器响应将一个xml文件中的数据通过读取解析,将其用Result类标准的格式返回前端,在前端用json的方式显示 后端Controller代码 1、通过本类的字节码文件得到类加载器并寻找到需要解析的…