optuna 自动化调参利器
Optuna是一个自动超参数优化软件框架,专为机器学习而设计。它具有命令式、 运行时定义的用户 API。Optuna的用户可以动态地构建超参数的搜索空间。
optuna API
使用optuna
Optuna 与几乎所有可用的机器学习框架一起使用:TensorFlow、PyTorch、LightGBM、XGBoost、CatBoost、sklearn、FastAI 等。
安装optuna
pip install optuna
每个 Optuna 超参数调整会话称为学习。我们通过调用create_study方法来实例化一个学习会话。我们可以将几个重要的参数传递给这个方法,如下所示
import optuna
study = optuna.create_study(direction="maximize", sampler=optuna.samplers.TPESampler())
direction
direction value 可以设置为maximize或minimize,具体取决于我们的超参数调整的最终目标。
- 如果目标是通过准确度、F1 分数、精确度或召回率等指标来提高性能,则将其设置为maximize.
- 如果目标是减少损失函数,例如 log-loss、MSE、RMSE 等,则将其设置为minimize.
sampler
sampler value
指示您希望 Optuna 实施的采样器方法。您可以选择多个采样器选项,例如:
GridSampler
:根据定义的搜索空间中的每个组合选择一组超参数值。RandomSampler
:从定义的搜索空间中随机选择一组超参数值。TPESampler
:这是sampler我们使用 Optuna
时的默认设置。它基于贝叶斯超参数优化,这是一种有效的超参数调整方法。它将像随机采样器一样开始,但该采样器记录了一组超参数值的历史以及过去试验的相应目标值。然后,它将根据过去试验的有希望的目标值集为下一次试验建议一组超参数值。
接下来,我们可以调用optimize我们学习中的方法,并将我们的objective函数作为参数之一传递。
import optunastudy = optuna.create_study(direction="maximize", sampler=optuna.samplers.TPESampler())
study.optimize(objective, n_trials=30)
上面的n_trials参数表示您希望 Optuna 在研究中执行的试验次数。
到目前为止,我们还没有创建objective 函数。所以让我们objective首先定义搜索空间来创建我们的函数。
搜索空间定义
在每个超参数调整会话中,我们需要为采样器定义一个搜索空间。搜索空间是采样器应该从超参数中考虑的值的范围。
例如,假设我们要调整三个超参数:学习率、层的单元数和神经网络模型的优化器。然后,我们可以定义搜索空间如下:
def objective(trial):params = {'learning_rate': trial.suggest_loguniform('learning_rate', 1e-5, 1e-1),'optimizer': trial.suggest_categorical("optimizer", ["Adam", "RMSprop", "SGD"]),'n_unit': trial.suggest_int("n_unit", 4, 18)}model = build_model(params)accuracy = train_and_evaluate(params, model)return accuracy
在objective函数中,我们传递了一个名为 的参数trial,它来自TrialOptuna 的类。此类使 Optuna 能够记录一组选定的超参数值,并objective在每次试验中记录我们的函数值(在我们的例子中是准确性)
正如您在上面看到的,我们将每个超参数的搜索空间定义为一个名为 的字典params。对于每个超参数,我们用方法定义搜索空间的范围(最小值和最大值)suggest_*
。
该suggest_*
方法有几个扩展,具体取决于超参数的数据类型:
suggest_int
:如果您的超参数接受一系列整数类型的数值。suggest_categorical
:如果您的超参数接受分类值的选择。suggest_uniform
:如果您的超参数接受一系列数值,并且您希望对每个值进行同样的采样。suggest_loguniform
:如果您的超参数接受一系列数值,并且您希望在对数域中对每个值进行同样的采样。suggest_discrete_uniform
:如果您的超参数接受特定区间内的一系列数值,并且您希望每个值都以同样的可能性进行采样。suggest_float
:如果您的超参数接受一系列浮点类型的数值。这是 , 和
的suggest_uniform包装suggest_loguniform方法suggest_discrete_uniform
构建 PyTorch 模型、训练循环和评估目标函数
现在我们可以使用保存在params字典中的选定超参数值来构建 PyTorch 模型。接下来,我们将训练模型并评估我们的目标函数,在我们的例子中是准确度。
import optuna
import torch
import torch.nn as nn
import torch.optim as optim
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split# Build neural network model
def build_model(params):in_features = 20return nn.Sequential(nn.Linear(in_features, params['n_unit']),nn.LeakyReLU(),nn.Linear(params['n_unit'], 2),nn.LeakyReLU())# Train and evaluate the accuarcy of neural network model
def train_and_evaluate(param, model):df = pd.read_csv('heart.csv')df = pd.get_dummies(df)train_data, val_data = train_test_split(df, test_size = 0.2, random_state = 42)train, val = Dataset(train_data), Dataset(val_data)train_dataloader = torch.utils.data.DataLoader(train, batch_size=2, shuffle=True)val_dataloader = torch.utils.data.DataLoader(val, batch_size=2)use_cuda = torch.cuda.is_available()device = torch.device("cuda" if use_cuda else "cpu")criterion = nn.CrossEntropyLoss()optimizer = getattr(optim, param['optimizer'])(model.parameters(), lr= param['learning_rate'])if use_cuda:model = model.cuda()criterion = criterion.cuda()for epoch_num in range(EPOCHS):total_acc_train = 0total_loss_train = 0for train_input, train_label in train_dataloader:train_label = train_label.to(device)train_input = train_input.to(device)output = model(train_input.float())batch_loss = criterion(output, train_label.long())total_loss_train += batch_loss.item()acc = (output.argmax(dim=1) == train_label).sum().item()total_acc_train += accmodel.zero_grad()batch_loss.backward()optimizer.step()total_acc_val = 0total_loss_val = 0with torch.no_grad():for val_input, val_label in val_dataloader:val_label = val_label.to(device)val_input = val_input.to(device)output = model(val_input.float())batch_loss = criterion(output, val_label.long())total_loss_val += batch_loss.item()acc = (output.argmax(dim=1) == val_label).sum().item()total_acc_val += accaccuracy = total_acc_val/len(val_data)return accuracy# Define a set of hyperparameter values, build the model, train the model, and evaluate the accuracy
def objective(trial):params = {'learning_rate': trial.suggest_loguniform('learning_rate', 1e-5, 1e-1),'optimizer': trial.suggest_categorical("optimizer", ["Adam", "RMSprop", "SGD"]),'n_unit': trial.suggest_int("n_unit", 4, 18)}model = build_model(params)accuracy = train_and_evaluate(params, model)return accuracy
运行超参数调优
我们已经创建了目标函数,我们已经定义了搜索空间,我们已经构建了模型和训练循环,现在我们准备好使用 Optuna 运行超参数调整。
要运行超参数调整,我们需要实例化一个study会话,调用optimize方法,并将我们的objective函数作为参数传递。
超参数调整过程完成后,我们可以通过访问best_trial方法来获取超参数的最佳组合,如下所示:
EPOCHS = 100study = optuna.create_study(direction="maximize", sampler=optuna.samplers.TPESampler())
study.optimize(objective, n_trials=100)
best_trial = study.best_trialfor key, value in best_trial.params.items():print("{}: {}".format(key, value))# learning_rate: 0.0018518678521842887
# optimizer: Adam
# n_unit: 9
以下是某项目的调参案例展示
optuna可视化
Optuna 提供了一项功能,使我们能够在完成后可视化调整过程的历史。我们现在将介绍其中的一些。
第一个可视化是每个训练步骤中每个试验的目标函数图(在我们的例子中是准确性)。
optuna.visualization.plot_intermediate_values(study)
还可以将优化历史可视化:这种可视化有助于查看哪个试验是最佳试验,以及其他试验的客观价值与最佳试验相比如何。由于修剪机制,在特定试验中缺少几个数据点。
optuna.visualization.plot_optimization_history(study)
Optuna 还使我们能够绘制超参数的重要性,如下所示:
optuna.visualization.plot_param_importances(study)
optuna dashboard可视化
conda install -c conda-forge optuna-dashboard
pip install optuna-dashboard
study = optuna.create_study(study_name='test',direction="maximize",storage='sqlite:///db.sqlite3')
定义完后创建会话时,study_name指定了你的会话名称,direction为maximize或者minimize,最大或者最小,默认是最小,这里我们要让精确度最大,所以用maximize,storage定义了你的存储方式,这里我们用sqlite3,也可以用mysql等。
以上日志默认的保存位置在你当前的工作目录,会生成一个db.sqlite3的文件
再打开命令行或者anaconda-prompt,输入以下命令启动dashboard:
optuna-dashboard sqlite:///db.sqlite3
复制127.0.0.1:8080到你的浏览器里打开,就可以看到你的dashboard和study了:
如果指定服务器IP地址可使用
optuna-dashboard sqlite:///db.sqlite3 --host 0.0.0.0
复制IP:8080到你的浏览器里打开,同样可以看到你的dashboard和study
optuna 自动化调参利器相关推荐
- 有没有什么高效「炼丹」神器可以推荐?复旦fastNLP团队祭出内部调参利器fitlog...
机器之心报道 参与:Racoon X.张倩 集 Tabular 显示实验结果.自定义备忘.前端操作删除/隐藏记录.自动 git commit 等诸多功能于一体,这个调参神器助你高效「炼出金丹」. 「有 ...
- 机器学习狗太苦逼了!自动化调参哪家强?
机器学习狗太苦逼了!自动化调参哪家强? https://mp.weixin.qq.com/s/gqN0fDIJBoxyAxYaC2dI-w 作者|Facundo Santiago译者|李志编辑|Deb ...
- python网格搜索核函数_机器学习笔记——模型调参利器 GridSearchCV(网格搜索)参数的说明...
算法 数据结构 机器学习笔记--模型调参利器 GridSearchCV(网格搜索)参数的说明 GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数.但是这个 ...
- optuna-自动化调参利器
Optuna是一个自动超参数优化软件框架,专为机器学习而设计.它具有命令式. 运行时定义的用户 API.Optuna的用户可以动态地构建超参数的搜索空间. optuna API Xgboost.Cat ...
- 自动化调参NNI学习(三):使用python启动NNI框架调整随机森林(RandomForest)模型
首先按照NNI框架的要求写一个调参的代码文件my_rf.py: import nni from sklearn.model_selection import train_test_split impo ...
- 自动化调参NNI学习(二):使用NNI框架调整LGBM模型
1. LGBM回归任务代码 import numpy as np import lightgbm as lgbm from sklearn.model_selection import train_t ...
- 模型调参利器--hyperopt
一.前言 在机器学习中,模型的训练需要花费大量的时间.而每一个算法在训练前都需要配置数量不一的超参数,参数对训练结果的影响相当大. 因此,超参数的优化是一件相当重要,却又费时费力的事. Hyperop ...
- 随机森林调参_机器学习-模型调参利器 gridSearchCV(网格搜索)
在机器学习模型中,需要人工选择的参数称为超参数.比如随机森林中决策树的个数,人工神经网络模型中隐藏层层数和每层的节点个数,正则项中常数大小等等,他们都需要事先指定.超参数选择不恰当,就会出现欠拟合或者 ...
- 机器学习(四)——模型调参利器 gridSearchCV(网格搜索) scoring的
如果是None,则使用estimator的误差估计函数 (3) scoring=None 模型评价标准,默认None,这时需要使用score函数:或者如scoring='roc_auc', ...
- 调参神器optuna学习笔记
介绍 optuna作为调参工具适合绝大多数的机器学习框架,sklearn,xgb,lgb,pytorch等. 主要的调参原理如下: 1 采样算法 利用 suggested 参数值和评估的目标值的记录, ...
最新文章
- rownum 的一点儿研究
- 紧急通知,读者服务群大调整
- feign client传递对象
- 同时支持来自多个源头的域名的跨域调用
- unity让对象作为参数_C#+Unity学习笔记:类与对象
- oracle sql取查询结果第一条,SQL获取第一条记录的方法(sqlserver、oracle、mysql数据库)...
- redis04-----Hash 哈希数据类型相关命令
- 空间查询时出错误 An expected Field was not found or could not be retrieved properly. [SHAPE.AREA] 问题的解决...
- 约定俗成的版本号命名规则
- Excel:数据处理
- 稻盛和夫《干法》读后感
- 关于数据治理的读书笔记 - 什么是数据战略?
- 计算机学院网络安全学院,网络空间安全学院
- 网络安全学习笔记6(批处理编写)
- FLOJET NEMP50/7泵
- csu-2018年11月月赛Round2-div1题解
- xml转json以及调用websrvices传参
- STM 32简单编程实例
- Flutter 混合开发 - 03 百度地图定位功能 ios 篇
- 北上深广领军,成都名列第五,武汉跌出前十,中国城市综合发展指标最新排名公布...