超参数优化学习——利用hyperopt实现贝叶斯优化

本次内容
简单的说明贝叶斯优化算法
使用hyperopt实现超参数实现神经网络优化

贝叶斯优化

贝叶斯优化的思想类似于网格搜索法和随机搜索方法,本质上是一种类似于穷举的当时,比较最优值。而网格搜索和随机搜索会消耗大量的实践,效率较低,贝叶斯优化就是在有限的时间内找到一个相对较好的结果。因此贝叶斯优化也会出现局部最优解的情况,要想尽量避免这样的问题可以将搜索范围增加,搜索点之间的间隔降低来尽量避免出现局部最优解。

hyperopt库

hyperopt库是我使用了多个贝叶斯优化库之后选择的结果,总体来说初次上手较为简单,可以实现TEP贝叶斯优化,优化结果展示比较简洁、美观。但是其支持的优化算法比较少,要想实现更多的优化算法可以使用optuna

参数空间

hyperopt的参数空间,一般是以字典形式展现的,其中包括:

  1. hp.quniform(“参数名称”,上界, 下届, 步长):此方法适合数字类的搜索,在步长的选择上可以是整型也可以是浮点型,若要想尽量避免算法陷入局部最优,可以将界限扩大,步长减小。
  2. hp.uniform("参数“,上界, 下界): 适用于随机分布的浮点型数据,可以在学习率等参数优化时使用
  3. hp.choice(“参数”, [a, b,c]):此方法中的列表中的值,可以是字符串类型,也可以是浮点型数据,可以在激活函数的选取上使用。
常用函数
  1. fmin()基础功能的优化函数,可以在定义中选择使用tep方法或rand方法来进行算法优化
  2. Trials()用来保存优化结果,在优化结束后可以查看随时,参数等信息
  3. early_stop_fn()用来提前停止参数寻优,此函数中传入数字具体的数字n,表示在寻优过程中有n次的损失基本不再改变,则算法停止。
安装
pip install hyperopt
案例-双向GUR网络的神经元数参数寻优

使用tensorflow,keras库实现网络的搭建,这里并未对优化后的模型进行保存,和寻优完之后的结果进行处理。

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, Bidirectional, GRU
from hyperopt import hp, fmin, tpe, Trials
from hyperopt.early_stop import no_progress_loss

定义待优化的模型

# 模型
def model(params):
    model = Sequential()
    model.add(Bidirectional(GRU(units=int(params['units']), activation='relu'), input_shape=(x_train.shape[1], x_train.shape[-1])))
    model.add(Dense(1))
    model.summary()
    model.compile(loss='mae', optimizer='adam')
    model.fit(x_train, y_train, epochs=20, batch_size=64, validation_data=(x_val, y_val))
    # 用测试集上的损失进行寻优
    score_loss = model.evaluate(x_val, y_val, verbose=2) 
    print("Text loss:", score_loss)
    return score_loss

定义数据切分函数

def create_dataset(dataset, look_back=8):
    data_x, data_y = [], []
    for i in range(len(dataset) - look_back - 1):
        # 获取全部元素
        x = dataset[i:i + look_back, 0:dataset.shape[1]]
        data_x.append(x)
        # 第0列,想要预测的数据
        y = dataset[i + look_back, 0]
        data_y.append(y)
    return np.array(data_x), np.array(data_y)

定义寻优过程

# 定义参数优化函数
def param_hyperopt(max_evals=100):
    trials = Trials()
    # 提前停止条件
    early_stop_fn = no_progress_loss(20)
    # 优化模型
    params_best = fmin(fn=model, space=params_space, algo=tpe.suggest, max_evals=max_evals,
                       trials=trials, early_stop_fn=early_stop_fn)
    print('best params:', params_best)
    return params_best, trials

这里只对神经元进行寻优,若想对其他参数也进行寻优,添加寻优空间即可

# 定义参数模型空间
params_space = {
    "units": hp.quniform('units', 40, 120, 4)
}

主程序

data1 = pd.read_csv('201701.csv', usecols=['站点名称', 'PM2.5', 'PM10'], engine='python')
data2 = pd.read_csv('201702.csv', usecols=['站点名称', 'PM2.5', 'PM10'], engine='python')
data3 = pd.read_csv('201703.csv', usecols=['站点名称', 'PM2.5', 'PM10'], engine='python')
data4 = pd.read_csv('201704.csv', usecols=['站点名称', 'PM2.5', 'PM10'], engine='python')
data5 = pd.read_csv('201705.csv', usecols=['站点名称', 'PM2.5', 'PM10'], engine='python')
data6 = pd.read_csv('201706.csv', usecols=['站点名称', 'PM2.5', 'PM10'], engine='python')
data = pd.concat([data1, data2, data3, data4, data5, data6])
data = data[data['站点名称'] == '衡水监测站']
data = pd.concat([data], ignore_index=True)
del data['站点名称']
print(data[:10])
print(data.shape)  # (2880, 2)

# 输入,输出划分
data = data[['PM2.5', 'PM10']]
print(data[0:10])

# 归一化
scale = MinMaxScaler()
data = scale.fit_transform(data)
print(data[0:10])

# 划分数据集
X_data = data[0:int(len(data) * 0.9)]
Y_data = data[int(len(data) * 0.9):]
# 训练集
x_train, y_train = create_dataset(X_data)
x_val, y_val = create_dataset(Y_data)
print(x_train.shape)  # (3900, 8, 2)
print(x_val.shape)
# 调用参数寻优函数
params_best, trials = param_hyperopt(20)

寻优结果如下:
寻优结果

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值