百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

学习器模型中的超参数(Hyperter),如何选择?

toyiye 2024-07-08 23:07 30 浏览 0 评论

学习器模型中一般有两类参数:


一类是可以从数据中学习估计得到,我们称为参数(Parameter)。


还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数(Hyper parameter)。超参数是在开始学习过程之前设置值的参数。相反,其他参数的值通过训练得出。


我们在选择超参数有两个途径:


1)凭经验;


2)选择不同大小的参数,带入到模型中,挑选表现最好的参数。通过途径2选择超参数时,人力手动调节注意力成本太高,非常不值得。For循环或类似于for循环的方法受限于太过分明的层次,不够简洁与灵活,注意力成本高,易出错。

有一种选择方法叫做网络搜索(GridSearchCV),利用计算机快速计算的特点遍历所有的参数组合,找到最好的参数组合。听起来很高大上,本质上就是暴力搜索。注意的是,该方法在小数据集上很有用,数据集大了就不太适用了。会比较耗费时间和计算资源。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法:拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。这个方法的缺点就是可能会调到局部最优而不是全局最优,但是省时间省力。

使用示例:

from sklearn.model_selection import GridSearchCV 
from sklearn.svm import SVR 
from sklearn import datasets 
dataset = datasets.load_iris() 
X = dataset.data 
y = dataset.target 
grid = GridSearchCV( 
    estimator=SVR(kernel='rbf'), 	
    param_grid={ 	
        'C': [0.1, 1, 10, 100], 
        'epsilon': [0.0001, 0.001, 0.01, 0.1, 1, 10], 
        'gamma': [0.001, 0.01, 0.1, 1] 
    }, 
    cv=5, scoring='neg_mean_squared_error', verbose=0, n_jobs=-1) 
grid.fit(X, y) 
print(grid.best_score_) 
print(grid.best_params_) 


还有一种方法叫做随机搜索(RandomizedSearchCV),再参数量较大的时候使用这种方法可以快速或者较好的参数组合,在搜索超参数的时候,如果超参数个数较少(三四个或者更少),那么我们可以采用网格搜索,一种穷尽式的搜索方法。


但是当超参数个数比较多的时候,我们仍然采用网格搜索,那么搜索所需时间将会指数级上升。所以有人就提出了随机搜索的方法,随机在超参数空间中搜索几十几百个点,其中就有可能有比较小的值。这种做法比上面稀疏化网格的做法快,而且实验证明,随机搜索法结果比稀疏网格法稍好。RandomizedSearchCV使用方法和类GridSearchCV 很相似,但他不是尝试所有可能的组合,而是通过选择每一个超参数的一个随机值的特定数量的随机组合,这个方法有两个优点:


相比于整体参数空间,可以选择相对较少的参数组合数量。如果让随机搜索运行,它会探索每个超参数的不同的值 可以方便的通过设定搜索次数,控制超参数搜索的计算量,但是这个方法也有缺点,他会再搜索的过程中逐步偏向某些更加重要的超参数,会影响搜索的方向。

使用示例:

from scipy.stats import randint as sp_randint 
from sklearn.model_selection import RandomizedSearchCV 
from sklearn.datasets import load_digits 
from sklearn.ensemble import RandomForestClassifier 
# 载入数据 
digits = load_digits() 
X, y = digits.data, digits.target 
# 建立一个分类器或者回归器 
clf = RandomForestClassifier(n_estimators=20) 
# 给定参数搜索范围:list or distribution 
param_dist = {"max_depth": [3, None],  # 给定list 
              "max_features": sp_randint(1, 11),  # 给定distribution 
              "min_samples_split": sp_randint(2, 11),  # 给定distribution 
              "bootstrap": [True, False],  # 给定list 
              "criterion": ["gini", "entropy"]}  # 给定list 
# 用RandomSearch+CV选取超参数 
n_iter_search = 20 
random_search=RandomizedSearchCV(clf,param_distributions=param_dist,n_iter=n_iter_search, cv=5, iid=False) 
random_search.fit(X, y) 
print(random_search.best_score_) 
print(random_search.best_params_) 


还有一种方法叫贝叶斯优化(Bayesian optimization),给定一组超参数,为了计算相应的模型泛化误差,我们需要进行一次完整的模型训练,对于大型的深度学习模型可能需要花上几个小时的时间。注意到网格搜索和随机搜索中,不同的超参数采样是相互独立的,一个直接的想法是,能否充分利用已采样数据来决定下一次采样,以提高搜索效率(或者说减少采样次数)。


贝叶斯优化属于一类优化算法,称为基于序列模型的优化(SMBO)算法。这些算法使用先前对损失 f 的观察结果,以确定下一个(最优)点来抽样 f。该算法大致可以概括如下。

1、使用先前评估的点 X 1:n,计算损失 f 的后验期望。

2、在新的点 X 的抽样损失 f,从而最大化f的期望的某些方法。该方法指定 f 域的哪些区域最适于抽样。

3、重复这些步骤,直到满足某些收敛准则

使用例子:

from skopt import BayesSearchCV
import warnings
warnings.filterwarnings("ignore")
from skopt.space import Real, Categorical, Integer
knn = KNeighborsClassifier()
定义参数
grid_param = { 'n_neighbors' : list(range(2,11)) , 
              'algorithm' : ['auto','ball_tree','kd_tree','brute'] }
#初始化贝叶斯搜索
Bayes = BayesSearchCV(knn , grid_param , n_iter=30 , random_state=14)
Bayes.fit(X_train,y_train)
#最好的参数组合
Bayes.best_params_
#最好分数
Bayes.best_score_
#所有的参数组合
Bayes.cv_results_['params']

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码