(入门以及简介+实战)超参数寻找器hyperopt库中常见的函数或类的作用

文章目录

      • 介绍与安装
      • 一个例子
      • 再入门

介绍与安装

用来找超参数的,我们常常用的是格子搜索以及贪婪搜索对不对。它这个库有着更多的策略。

pip install hyperopt

一个例子

from hyperopt import fmin, tpe, hp
best = fmin(fn=lambda x: x ** 2,
    space=hp.uniform('x', -10, 10),
    algo=tpe.suggest,
    max_evals=100)
print(best)

好了,上面引入了3个函数,fmin, tpe, hp。其中hp用来指定参数空间,比如hp.uniform(‘x’, -10, 10),其表示我们有一个参数x,其可能取值在-10到10之间,并且是均匀分布。tpe则是用来指定我们的搜索策略,比如可能是格子搜索之类的。max_evals=100则表示,由于我们的参数x取值连续,不可能说取遍所有值,所以尝试了100次不同的x值之后就结束。然后再说fn这个参数,上面是一个匿名函数,表示了一个二次函数 x 2 x^2 x2。这个东西表示的就是我们的目标函数,显然x在0处目标函数达到最小,我怎么知道是要求最小而不是最大的,因为fmin。一旦使用fmin,就会求解完毕,所以best其实已经求解完了,其存储了最佳的x是什么,如下:

{'x': -0.026755005286317524}

有一点误差,不要紧。

有人吐槽,这和我们训练一个神经网络调参有啥关系,当然有关系,你只需要将上述fn换成你的模型即可。

再入门

上面其实不太好,上面best只记录了最佳x,但是我们想要记录一下,100次不同的x得到的各自的目标值怎么办?从而我们可以画图看一下,目标值对这个参数敏感不敏感对吧。
那该怎么做呢?

import pickle
import time
from hyperopt import fmin, tpe, hp, STATUS_OK, Trials

def objective(x):
    return {
        'loss': x ** 2,#注意loss和status其实类似于关键字,loss就是目标函数。
        #下面这个就是这次评估的状态,是否成功,有人问这还能不成功的吗?好像确实有可能,比如参数太大,内存爆了。
        'status': STATUS_OK,
        # -- store other results like this
        'eval_time': time.time(),
        'other_stuff': {'type': None, 'value': [0, 1, 2]}
        }
trials = Trials()
best = fmin(objective,
    space=hp.uniform('x', -10, 10),
    algo=tpe.suggest,
    max_evals=100,
    trials=trials)

print(best)

比如上面,我们我们的目标函数,不但会返回loss,还会记录其他一些我们需要记录的东西,这些东西通通会存起来,到trials对象中。至于那个best,和之前还是一样的,就是最优的x值。所以我们重点在怎么操作trials对象,从而读取100次调参中我们需要的数据。
(入门以及简介+实战)超参数寻找器hyperopt库中常见的函数或类的作用_第1张图片
先看上面四个用法。第一个,其实说白了,就是说,这个库本身其实就会记录每一次调参返回的一些官方内置的东西,比如下面一大堆东西,并不止我们上面写的eval_time。

(入门以及简介+实战)超参数寻找器hyperopt库中常见的函数或类的作用_第2张图片
第二个trials.results就是只返回我们需要的那几个,如下:

(入门以及简介+实战)超参数寻找器hyperopt库中常见的函数或类的作用_第3张图片
另外,两个就是只返回loss和status,就不说了。

你可能感兴趣的:(机器学习,python,人工智能)