超参数优化指南

机器学习模型的训练过程中,超参数是一个外部配置,其值不能从数据中估计得出。无法确切知道在特定问题上模型超参数的最佳值。可能会使用经验法则、复制在其他问题上使用的值,或者通过试错来寻找最佳值。调整模型的超参数是为了发现导致最准确预测的模型参数。例如,在支持向量机中使用的'C'和'𝞼'超参数,以及用于正则化的'𝞪'超参数。

之所以关注超参数,是因为这些参数直接控制着训练算法的行为,并对模型性能产生重大影响。一个合适的超参数选择可以使算法大放异彩!

超参数优化器的作用

超参数优化器在整个学习算法过程中的位置如下。如上所述,超参数调整器是模型外部的,调整是在模型训练之前进行的。调整过程的结果是超参数的最优值,然后这些值被输入到模型训练阶段。现在,让介绍Optuna,这是一个Python中的优化库,可以用于超参数优化。

Optuna简介

Optuna是一个自动化超参数优化过程的软件框架。它通过使用不同的采样器,如网格搜索、随机、贝叶斯和进化算法,自动找到最优的超参数值。首先,将简要描述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)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485