admin 管理员组文章数量: 887006
超参数优化学习——利用hyperopt实现贝叶斯优化
本次内容
简单的说明贝叶斯优化算法
使用hyperopt实现超参数实现神经网络优化
贝叶斯优化
贝叶斯优化的思想类似于网格搜索法和随机搜索方法,本质上是一种类似于穷举的当时,比较最优值。而网格搜索和随机搜索会消耗大量的实践,效率较低,贝叶斯优化就是在有限的时间内找到一个相对较好的结果。因此贝叶斯优化也会出现局部最优解的情况,要想尽量避免这样的问题可以将搜索范围增加,搜索点之间的间隔降低来尽量避免出现局部最优解。
hyperopt库
hyperopt库是我使用了多个贝叶斯优化库之后选择的结果,总体来说初次上手较为简单,可以实现TEP贝叶斯优化,优化结果展示比较简洁、美观。但是其支持的优化算法比较少,要想实现更多的优化算法可以使用optuna
参数空间
hyperopt的参数空间,一般是以字典形式展现的,其中包括:
- hp.quniform(“参数名称”,上界, 下届, 步长):此方法适合数字类的搜索,在步长的选择上可以是整型也可以是浮点型,若要想尽量避免算法陷入局部最优,可以将界限扩大,步长减小。
- hp.uniform("参数“,上界, 下界): 适用于随机分布的浮点型数据,可以在学习率等参数优化时使用
- hp.choice(“参数”, [a, b,c]):此方法中的列表中的值,可以是字符串类型,也可以是浮点型数据,可以在激活函数的选取上使用。
常用函数
- fmin()基础功能的优化函数,可以在定义中选择使用tep方法或rand方法来进行算法优化
- Trials()用来保存优化结果,在优化结束后可以查看随时,参数等信息
- 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()modelpile(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)
寻优结果如下:
本文标签: 超参数优化学习利用hyperopt实现贝叶斯优化
版权声明:本文标题:超参数优化学习——利用hyperopt实现贝叶斯优化 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732353042h1533636.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论