主要功能

急切的搜索空格

使用Python条件、循环和语法自动搜索最佳超参数

最先进的技术算法

高效搜索大空间并删减无希望的试验以获得更快的结果

容易的并行化

在不修改代码的情况下,在多个线程或进程上并行化超参数搜索

代码示例

Optuna是框架不可知论者。您可以将其用于任何机器学习或深度学习框架。

一个简单的优化问题:

  1. 定义客观的要优化的功能。让我们最小化(x)-2)^2
  2. 使用建议超参数值试验对象。这里,浮点值为x个建议来自-1010
  3. 创建一个学习对象并调用优化方法超过100试验
进口optuna定义目标(试验):x=试验.sugest_float('x',-10,10)返回(x-2)**2研究=optuna.create_study()研究优化(目标,n试验=100)study.best_params#例如{'x':2.002108042}

可乐研究谷歌 在Colab中打开 在Colab中打开

您可以优化PyTorch超参数,例如层数和每个层中的隐藏节点,分三个步骤:

  1. 将模型训练与客观的功能和返回精度
  2. 建议使用超参数试验对象
  3. 创建一个学习对象并执行优化
进口焊炬进口optuna# 1. 定义要最大化的目标函数。定义目标(试验):# 2. 使用试验对象建议超参数的值。n_layers=试用.sugest_int('n_lawers',1,3)层=[]in_features=28*28英寸对于范围内的i(n层):out_features=试用.sugest_int(f'n_units_l{i}',4128)layers.append(torch.nn.Linear(in_features,out_feature))layers.append(torch.nn.ReLU())in_features=输出特性layers.append(torch.nn.Linear(in_features,10))layers.append(torch.nn.LogSoftmax(dim=1))型号=火炬编号。顺序(*层)到(火炬装置(“pu”))。。。返回精度# 3. 创建一个研究对象并优化目标函数。研究=optuna.create_study(direction='maximize')研究优化(目标,n试验=100)
查看Github的完整示例

您可以优化Chainer超参数,例如层数和每个层中的隐藏节点,分三个步骤:

  1. 将模型训练与客观的功能和返回精度
  2. 建议使用超参数试验对象
  3. 创建一个学习对象并执行优化
导入链接器进口optuna# 1. 定义要最大化的目标函数。定义目标(试验):# 2. 使用试验对象建议超参数的值。n_layers=试用.sugest_int('n_lawers',1,3)层=[]对于范围内的i(n层):n_units=试用.sugest_int(f'n_units_l{i}',4128,log=真)layers.append(L.Linear(无,n_units))层.附加(F.relu)layers.append(L.Linear(无,10))model=L.分类器(chainer.Sequential(*层))。。。返回精度# 3. 创建研究对象并优化目标函数。研究=optuna.create_study(direction='maximize')研究.优化(目标,n_trials=100)
查看Github的完整示例

您可以优化TensorFlow超参数,例如层数和每个层中的隐藏节点,分三个步骤:

  1. 将模型训练与客观的功能和返回精度
  2. 建议使用超参数试验对象
  3. 创建一个学习对象并执行优化
导入张量流作为tf进口optuna# 1. 定义要最大化的目标函数。def目标(试验):# 2. 使用试验对象建议超参数的值。n_layers=试用.sugest_int('n_lawers',1,3)型号=tf.keras。序列()model.add(tf.keras.layers.Flatten())对于范围内的i(n层):num_hidden=试用.sugest_int(f'n_units_l{i}',4128,log=True)model.add(tf.keras.layers.Dense(num_hidden,activation='relu'))model.add(tf.keras.layers.Dense(类别))。。。返回精度# 3. 创建研究对象并优化目标函数。研究=optuna.create_study(direction='maximize')研究优化(目标,n试验=100)
查看Github的完整示例

您可以在中优化Keras超参数,例如过滤器数量和内核大小三个步骤:

  1. 将模型训练与客观的功能和返回精度
  2. 建议使用超参数试验对象
  3. 创建一个学习对象并执行优化
进口keras进口optuna# 1. 定义要最大化的目标函数。定义目标(试验):model=序列()# 2. 使用试验对象建议超参数的值。模型.添加(Conv2D(filters=trial.sugest_categorical('filters',[32,64]),kernel_size=试用.suggest_categorical('kernel_size',[3,5]),stemps=试验.sugest_categorical('strides',[1,2]),activation=试验建议类别(‘activation’,['relu',‘linear’]),input_shape=输入形状)model.add(Flatten())model.add(密度(CLASSES,activation='softmax'))#我们用抽样学习率编译我们的模型。lr=试验.sugest_float('lr',1e-5,1e-1,log=True)model.compile(loss='sparse_categorical_crossentropy',optimizer=RMSprop(lr=lr),metrics=['accuracy'])。。。返回精度# 3. 创建研究对象并优化目标函数。研究=optuna.create_study(direction='maximize')研究.优化(目标,n_trials=100)
查看Github的完整示例

您可以优化MXNet超参数,例如层数和隐藏的每个层中的节点,分三个步骤:

  1. 将模型训练与客观的功能和返回精度
  2. 建议使用超参数试验对象
  3. 创建一个学习对象并执行优化
将mxnet导入为mx进口optuna# 1. 定义要最大化的目标函数。定义目标(试验):# 2. 使用试验对象建议超参数的值。n_layers=试用.sugest_int('n_lawers',1,3)数据=mx.symbol。变量(“数据”)数据=mx.sym.flatten(数据=数据)对于范围内的i(n层):num_hidden=试用.sugest_int(f'n_units_l{i}',4128,log=True)数据=mx符号。FullyConnected(数据=数据,num_hidden=num_hudden)数据=mx.symbol。激活(数据=数据,act_type=“relu”)数据=mx.symbol。FullyConnected(数据=数据,num_hidden=10)mlp=mx.symbol。SoftmaxOutput(数据=数据,名称=“softmax”)。。。返回精度# 3. 创建研究对象并优化目标函数。研究=optuna.create_study(direction='maximize')研究优化(目标,n试验=100)
查看Github的完整示例

您可以优化Scikit-Learn超参数,例如C类的参数SVC公司最大深度(_depth)RandomForest分类器,在里面三个步骤:

  1. 将模型训练与客观的功能和返回精度
  2. 使用试验对象
  3. 创建一个学习对象并执行优化
导入sklearn进口optuna# 1. 定义要最大化的目标函数。定义目标(试验):# 2. 使用试验对象建议超参数的值。classifier_name=trial.sugest_categorical('classifier',['SVC','RandomForest'])如果分类器名称==“SVC”:svc_c=试用.sugest_float('svc_c',1e-10,1e10,log=True)分类器obj=sklearn.svm。SVC(C=SVC_C,gamma='auto')其他:rf_max_depth=试用.sugest_int('rf_max-depth',2,32,log=True)classifier_obj=sklearn.ensembly。随机预测分类器(max_depth=rf_max_depth,n_estimators=10)。。。返回精度# 3. 创建研究对象并优化目标函数。研究=optuna.create_study(direction='maximize')研究优化(目标,n试验=100)
请参阅Github上的完整示例

您可以通过三种方式优化XGBoost超参数,例如booster类型和alpha步骤:

  1. 将模型训练与客观的功能和返回精度
  2. 建议使用超参数试验对象
  3. 创建一个学习对象并执行优化
将xgboost导入为xgb导入optuna# 1. 定义要最大化的目标函数。定义目标(试验):。。。# 2. 使用试验对象建议超参数的值。参数={“静音”:1,“objective”:“binary:logistic”,“booster”:trial.sugest_categorical(“booster“,[“gbtree”,“gblinear”,“dart”]),“lambda”:试用.sugest_float('lambda’,1e-8,1.0,log=True),“alpha”:试用.sugest_float('alpha',1e-8,1.0,log=True)}bst=xgb.列车(参数,列车)。。。返回精度# 3. 创建研究对象并优化目标函数。研究=optuna.create_study(direction='maximize')研究优化(目标,n试验=100)
查看Github的完整示例

您可以优化LightGBM超参数,例如增强类型和叶数,在里面三个步骤:

  1. 将模型训练与客观的功能和返回精度
  2. 建议使用超参数试验对象
  3. 创建一个学习对象并执行优化
将lightgbm导入为lgb进口optuna# 1. 定义要最大化的目标函数。定义目标(试验):。。。# 2. 使用试验对象建议超参数的值。参数={“objective”:“binary”,“metric”:“binary_logloss”,“详细信息”:-1,'boosting_type':'gbdt',“lambda_l1”:试用.sugest_float('lambda_l1',1e-8,10.0,log=True),“lambda_l2”:试用.sugest_float('lambda_ l2',1e-8,10.0,log=True),“num_leaves”:试用.sugest_int('num_leves',225),‘feature_fraction’:试用.sugest_float(‘feature _ fraction',0.4,1.0),'bagging_fraction':试用.sugest_float('bagging _ fraction',0.4,1.0),'bagging_freq':试用.sugest_int('bagging _freq',1,7),'min_child_samples':试验.suggest_int('min_child_samples',5100),}gbm=lgb.train(参数,dtrain)。。。返回精度# 3. 创建研究对象并优化目标函数。研究=optuna.create_study(direction='maximize')研究优化(目标,n试验=100)
查看Github的完整示例

在Github查看更多示例,包括PyTorch Ignite、Dask-ML和MLFlow存储库。
它还提供以下可视化演示:

从optuna.visualization导入plot_intermediate_values。。。绘图中间值(研究)
查看Github的完整示例

安装

Optuna可以与pip一起安装。支持Python 3.7或更新版本。

%pip安装optuna
细节

仪表板

Optuna仪表板是Optuna的实时web仪表板。您可以在图表中检查优化历史、超参数重要性等。

%pip安装optuna-dashboard%optuna-仪表板sqlite:///db.sqlite3

Optuna Dashboard也可以作为Jupyter Lab和Visual Studio代码的扩展提供。

VS代码扩展

VS代码扩展

要使用,请安装扩展,右键单击文件浏览器中的SQLite3文件,然后从下拉菜单中选择“在Optuna Dashboard中打开”。

Jupyter实验室扩展

Jupyter实验室扩展
%pip安装jupyterlab jupyterlab-optuna
GitHub存储库 文档 VS代码扩展(市场)
在Medium上查看更多故事

视频

纸张

如果您在科学出版物中使用Optuna,请使用以下引文:

秋叶拓哉、三野昭太郎、延濑敏彦、大田武夫和小山正男。2019Optuna:KDD中的下一代超参数优化框架。
查看纸张 arXiv公司预打印

Bibtex条目:

@进行中{optuna_2019,title={Optuna:下一代超参数优化框架},author={秋叶、Takuya和Sano、Shotaro和Yanase、Toshihiko和Ohta、Takeru和Koyama、Masanori},booktitle={第25届{ACM}{SIGKDD}知识发现和数据挖掘国际会议论文集},年份={2019}}

社区