在机器学习模型的训练过程中,超参数是一个外部配置,其值不能从数据中估计得出。无法确切知道在特定问题上模型超参数的最佳值。可能会使用经验法则、复制在其他问题上使用的值,或者通过试错来寻找最佳值。调整模型的超参数是为了发现导致最准确预测的模型参数。例如,在支持向量机中使用的'C'和'𝞼'超参数,以及用于正则化的'𝞪'超参数。
之所以关注超参数,是因为这些参数直接控制着训练算法的行为,并对模型性能产生重大影响。一个合适的超参数选择可以使算法大放异彩!
超参数优化器在整个学习算法过程中的位置如下。如上所述,超参数调整器是模型外部的,调整是在模型训练之前进行的。调整过程的结果是超参数的最优值,然后这些值被输入到模型训练阶段。现在,让介绍Optuna,这是一个Python中的优化库,可以用于超参数优化。
Optuna是一个自动化超参数优化过程的软件框架。它通过使用不同的采样器,如网格搜索、随机、贝叶斯和进化算法,自动找到最优的超参数值。首先,将简要描述Optuna中可用的不同采样器。
网格搜索:每个超参数的搜索空间被离散化。优化器为每个超参数配置启动学习,并在最后选择最佳配置。
随机:随机采样搜索空间,并继续直到满足停止标准。
贝叶斯:基于概率模型的方法,用于寻找最优超参数。
进化算法:利用适应度函数的值来寻找最优超参数的元启发式方法。
选择Optuna的原因:Optuna的以下特点促使使用它来解决尝试解决的问题的超参数调整!
现在,让看看如何使用Optuna进行优化。使用鸢尾花数据集来演示这一点。首先,必须决定基于哪个指标来优化超参数。这个指标是优化目标。在这里,将指标设为k=3的交叉验证分数。所以,让首先创建目标函数。
import optuna
import sklearn
from sklearn import datasets
def objective(trial):
iris = sklearn.datasets.load_iris()
n_estimators = trial.suggest_int('n_estimators', 2, 20)
max_depth = int(trial.suggest_loguniform('max_depth', 1, 32))
clf = sklearn.ensemble.RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth)
return sklearn.model_selection.cross_val_score(clf, iris.data, iris.target, n_jobs=-1, cv=3).mean()
在这个例子中,使用随机森林进行分类。希望优化的只有两个——n_estimators和max_depth。因此,为这些超参数定义了搜索空间。如所见,n_estimators是整数,范围从2到20,max_depth是从对数均匀分布中取值,范围从1到32。这些值是由指定的。
可以根据参数的性质更改这些值和类型。因此,这个函数接受一个试验对象作为其参数。试验只是优化实验的一个迭代。所以,目标是最大化交叉验证分数,并确定哪些值的n_estimators和max_depth会最大化cross_val_score!
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)
在这里,方向可以是'maximize'或'minimize',取决于目标的性质。想最大化cross_val_score,所以给了'maximize'。另外,给出了100次试验。在这里没有指定要使用的采样器,默认情况下是贝叶斯优化器。一旦调用optimize方法,就可以看到优化过程开始了。
trial = study.best_trial
print('Accuracy: {}'.format(trial.value))
print("Best hyperparameters: {}".format(trial.params))
optuna.visualization.plot_optimization_history(study)
optuna.visualization.plot_slice(study)