目前非常多的超参寻优算法都不可避免的有下面的一个或者多个问题:
本文介绍的一种超参寻优策略则同时解决了上面三个问题,与此同时,该方法在目前kaggle的数据竞赛中也都是首选的调参工具包,其优势究竟有多大,我们看一下其与目前最为流行的一些工具包的对比。
Optuna
01
Define-By-Run的API
Optuna将超参数优化描述为一个最小化/最大化目标函数的过程,该目标函数以一组超参数作为输入并返回其(验证)分数。该函数不依赖于外部定义的静态变量,动态构造神经网络结构的搜索空间(层数和隐单元数)。Optuna是以每一个优化过程为研究对象,以每一个评价目标函数为试验对象。Optuna中的目标函数接收的不是超参数值,而是与单个试验相关联的活动试验对象。
02
高效的采样和剪枝策略
03
可扩展的同时易于设置
Optuna是一个可扩展的系统,它可以处理各种各样的任务,包括:
代 码
# !pip install optuna
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)
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)
# 输出模型的最好结参数
study.best_params
{'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竞赛中,该方法可以非常快速的寻找到最优的参数,是目前必须一试的算法。
参考文献
知识星球和交流群已经成立,后台回复“加群”扫码后进群。