前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NN和树模型通吃的调参神器Optuna!

NN和树模型通吃的调参神器Optuna!

作者头像
炼丹笔记
发布2021-07-16 12:13:04
1.5K0
发布2021-07-16 12:13:04
举报
文章被收录于专栏:炼丹笔记炼丹笔记

目前非常多的超参寻优算法都不可避免的有下面的一个或者多个问题:

  1. 需要人为的定义搜索空间;
  2. 没有剪枝操作,导致搜索耗时巨大;
  3. 无法通过小的设置变化使其适用于大的和小的数据集;

本文介绍的一种超参寻优策略则同时解决了上面三个问题,与此同时,该方法在目前kaggle的数据竞赛中也都是首选的调参工具包,其优势究竟有多大,我们看一下其与目前最为流行的一些工具包的对比。

Optuna

01

Define-By-Run的API

Optuna将超参数优化描述为一个最小化/最大化目标函数的过程,该目标函数以一组超参数作为输入并返回其(验证)分数。该函数不依赖于外部定义的静态变量,动态构造神经网络结构的搜索空间(层数和隐单元数)。Optuna是以每一个优化过程为研究对象,以每一个评价目标函数为试验对象。Optuna中的目标函数接收的不是超参数值,而是与单个试验相关联的活动试验对象。

  1. 模块化编程:Optuna的代码是模块化的,用户可以轻松地用其他条件变量和其他参数集的方法扩充代码,并从更多样化的模型池中进行选择。
  2. Optuna可以较为容易地进行部署;

02

高效的采样和剪枝策略

  1. 关系采样,Optuna可以识别关于共现的实验结果,通过这种方式,框架可以在经过一定数量的独立采样后识别出潜在的共现关系,并使用推断出的共现关系进行用户选择的关系采样算法。
  2. 高效的剪枝算法,Optuna会定期监测中间目标值并终止不符合预定条件的试验。它还采用异步Successive Halving算法,所以我们可以在此进行并行计算,而相互不会有太多影响。

03

可扩展的同时易于设置

Optuna是一个可扩展的系统,它可以处理各种各样的任务,包括:

  1. 从需要大量工作人员的繁重实验到通过Jupyter Notebook等交互界面进行的试验级、轻量级计算;
  2. 当用户需要进行分布式计算时,Optuna的用户可以部署关系数据库作为后端。Optuna的用户也可以使用SQLite数据库。
  3. Optuna的新设计大大减少了部署存储所需的工作量,新的设计可以很容易地集成到Kubernetes这样的容器编排系统中。

代 码

1. 数据集生成

代码语言:javascript
复制
# !pip install optuna
代码语言:javascript
复制
import optuna
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import KFold , cross_val_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import lightgbm as lgb
import numpy as np
from optuna.samplers import TPESampler
from sklearn.metrics import accuracy_score

iris = load_iris()
X = iris.data
y = iris.target

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3,random_state = 14)

2. Optuna+LightGBM

代码语言:javascript
复制

sampler = TPESampler(seed=10) # for reproducibility
def objective(trial):
    dtrain = lgb.Dataset(X_train, label=y_train)
    
    param = {
        'objective': 'multiclass',
        'metric': 'multi_logloss',
        'verbosity': -1,
        'boosting_type': 'gbdt',
        'num_class':3,
        'lambda_l1': trial.suggest_loguniform('lambda_l1', 1e-8, 10.0),
        'lambda_l2': trial.suggest_loguniform('lambda_l2', 1e-8, 10.0),
        'num_leaves': trial.suggest_int('num_leaves', 2, 512),
        'learning_rate': trial.suggest_loguniform('learning_rate', 1e-8, 1.0),
        'n_estimators': trial.suggest_int('n_estimators', 700, 3000),
        'feature_fraction': trial.suggest_uniform('feature_fraction', 0.4, 1.0),
        'bagging_fraction': trial.suggest_uniform('bagging_fraction', 0.4, 1.0),
        'bagging_freq': trial.suggest_int('bagging_freq', 1, 7),
        'min_child_samples': trial.suggest_int('min_child_samples', 5, 100),
    }

    gbm = lgb.train(param, dtrain)
    return accuracy_score(y_test, np.argmax(gbm.predict(X_test),axis=1))

study = optuna.create_study(direction='maximize', sampler=sampler)
study.optimize(objective, n_trials=100)
  • 输出模型的最好结参数
代码语言:javascript
复制
# 输出模型的最好结参数
study.best_params
代码语言:javascript
复制
{'lambda_l1': 0.0234448167468032,
 'lambda_l2': 7.075730911992614e-07,
 'num_leaves': 173,
 'learning_rate': 4.887601625186522e-05,
 'n_estimators': 1824,
 'feature_fraction': 0.9712805361251421,
 'bagging_fraction': 0.8498709168727996,
 'bagging_freq': 2,
 'min_child_samples': 17}

适用问题

Optuna方法目前适用于所有模型的参数的调节,传统的模型亦或者是神经网络模型。目前最新的kaggle竞赛中,该方法可以非常快速的寻找到最优的参数,是目前必须一试的算法。

参考文献

  1. https://github.com/optuna/optuna
  2. Optuna: A Next-generation Hyperparameter Optimization Framework
  3. Smart Hyperparameter Tuning With Optuna

知识星球和交流群已经成立,后台回复“加群”扫码后进群。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 炼丹笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 数据集生成
  • 2. Optuna+LightGBM
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档