Optuna, 一个神奇的 python 库

小寒 小寒聊python 2023年09月27日 07:02

大家好,我是小寒。

今天给大家分享一个神奇的 python 库,Optuna

https://github.com/optuna/optuna

Optuna 是一个开源的尖端 Python 库,专为机器学习中的超参数优化而设计

它简化了为你的模型寻找最佳超参数集的过程,使你能够以最小的努力获得卓越的结果。
Optuna 的核心功能在于能够通过各种优化算法和剪枝策略自动搜索最佳超参数。

Optuna 的优势

Optuna 的一些主要优势包括。

  • 高效搜索空间探索:Optuna 采用多种优化算法,可以有效探索搜索空间并识别最佳超参数集。

  • 自动修剪策略:Optuna 支持各种修剪策略,可以自动终止无希望的试验,从而显着减少超参数优化所花费的时间。

  • 轻松集成:Optuna 与多种机器学习框架兼容,例如 TensorFlow、PyTorch 和 scikit-learn,可以轻松集成到你的现有项目中。

  • 灵活的 API:Optuna 灵活的 API 允许你自定义搜索空间、目标函数和评估指标,以满足各种优化问题。

  • 并行化:Optuna 支持优化运行的并行化,允许你利用分布式计算资源并加快优化过程。

  • 可视化工具:Optuna 附带内置可视化工具,例如 matplotlib 和 plotly,使你能够可视化优化过程并分析结果。

初体验

库的安装

可以使用 pip 进行安装。
pip install optuna

确保你的 python 版本大于等于 3.6 。

定义目标函数

目标函数是优化过程的重要组成部分,因为它指导搜索最佳超参数。

在 Optuna 中,你需要将目标函数定义为 Python 函数,该函数将试验对象作为输入,并返回一个标量值,表示具有给定超参数的模型的性能。
以下是简单线性回归问题的目标函数示例。
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
def objective(trial):
    # Load dataset
    data = fetch_california_housing()
    X, y = data.data, data.target
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
    # Suggest hyperparameters
    alpha = trial.suggest_uniform("alpha", 0.0, 1.0)
    # Train and evaluate model
    model = Ridge(alpha=alpha)
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    score = mean_squared_error(y_test, y_pred)
    return score
在此示例中,目标函数加载 california Housing 数据集,将其分为训练集和测试集,并使用超参数 alpha 训练 Ridge 回归模型。

试验对象的 suggest_uniform 方法用于建议 alpha 指定范围内的值。

该函数返回模型预测的均方误差 (MSE),用作优化指标。

Optuna 研究对象

Optuna 中的研究对象是共享相同搜索空间和目标函数的试验的集合。

要创建研究对象并优化目标函数,你可以使用以下 optuna.create_study() 和 study.optimize() 方法:

# 创建一个学习对象
study = optuna.create_study(direction= "minimize" )
# 优化目标函数
study.optimize(objective, n_trials=100)
在此代码片段中,create_study() 函数使用指定的优化方向( "minimize" 用于最小化目标函数)初始化一个新的研究对象,并且该对象的 optimize() 方法针对给定的试验次数运行优化过程 ( n_trials=100)。

建议超参数

Optuna 提供了各种方法来建议目标函数内的超参数。试验对象的建议方法允许你定义每个超参数的搜索空间。

一些常见的建议方法包括:

  • suggest_uniform(name, low, high):建议在 low 和 high 之间均匀分布的浮点值。

  • suggest_loguniform(name, low, high):建议在 low 和 high 之间按对数分布的浮点值。

  • suggest_int(name, low, high) :建议在 low 和 high 之间的整数值。

  • suggest_categorical(name, choices) :建议在给定列表 choices 中的分类值。

例如,你可以使用 suggest_int 方法为随机森林模型中的超参数 n_estimators 建议一个整数。

from sklearn.ensemble import RandomForestRegressor
def objective(trial):
    # Load dataset and split
    ...
    
    # Suggest hyperparameters
    n_estimators = trial.suggest_int("n_estimators", 10, 200)
    # Train and evaluate model
    model = RandomForestRegressor(n_estimators=n_estimators)
    ...
    
    return score
       

运行优化

要运行优化过程,你需要使用 study.optimize() 方法。
study.optimize(objective, n_trials=100)
这将运行 100 次试验的优化过程,每次试验都使用 Optuna 建议的一组不同的超参数。

可以使用 study.best_params 和 study.best_value 属性「访问最佳超参数集和相应的目标函数最小值」

print("Best hyperparameters:", study.best_params)
print("Best value:", study.best_value)
图片

分析结果

Optuna 提供了多种内置可视化功能,可帮助你分析优化结果并深入了解超参数搜索空间。

一些常见的可视化功能包括。

  • optuna.visualization.plot_optimization_history(study):绘制优化历史记录,显示每次试验的目标函数值。

  • optuna.visualization.plot_param_importances(study) :绘制参数重要性图,表示优化过程中每个超参数的相对重要性。

  • optuna.visualization.plot_slice(study):生成切片图,可视化超参数的各个条件分布。
import optuna.visualization as vis
vis.plot_optimization_history(study)
图片

修剪策略

Optuna 支持各种修剪策略,有助于尽早终止没有希望的试验,从而节省计算资源和时间。

你可以通过在创建研究对象时设置 pruner 参数来在优化过程中启用修剪。

pruner = optuna.pruners.MedianPruner()
study = optuna.create_study(direction="minimize", pruner=pruner)

在此示例中,使用了 MedianPruner 。

Optuna 是一个功能强大且用户友好的 Python 库,用于机器学习中的超参数优化。

其简单的集成、高效的搜索算法和先进的功能使其成为优化机器学习模型的宝贵工具。

最后



今天的分享就到这里。如果觉得不错,点赞,转发安排起来吧。
接下来我们会分享更多的 「深度学习案例以及python相关的技术」,欢迎大家关注。
最后,最近新建了一个 python 学习交流群,会经常分享 「python相关学习资料,也可以问问题,非常棒的一个群」