如何使用 Optuna 进行 Scikit-learn 超参数优化

How to Perform Scikit-learn Hyperparameter Optimization with Optuna

如何使用 Optuna 进行 Scikit-learn 超参数优化
作者 | Ideogram 提供图片

引言

Optuna是一个专门为自动化超参数优化而设计的机器学习框架,即找到能优化模型性能的机器学习模型超参数的外部固定设置。它可以与 Scikit-learn 等其他机器学习建模框架无缝集成。

在本文中,我们将展示如何将两者结合起来进行超参数优化任务。

使用 Optuna 进行 Scikit-learn 超参数优化

如果是在 Python 开发环境中首次使用 Optuna,则需要先安装它。

在本示例中,我们将使用 Scikit-learn 的digits数据集训练一个随机森林分类器。该数据集是 MNIST 数据集的一个“简化版本”,用于图像分类,包含手写数字的 8×8 像素图像。现在是时候导入必要的组件了。

接下来,我们定义稍后将用于进行超参数优化过程的主函数。

正如你所见,几乎整个建模过程都封装在这个objective(trial)函数中,它是 Optuna 管理的核心函数,用于自动化超参数搜索,执行指定次数的试验。让我们看看这个函数的具体内容,也就是我们定义的过程。

  • 定义超参数搜索空间或网格(有关此概念的更深入了解,请参阅本文)。搜索空间中的超参数通过suggest_in函数添加到 Optuna 的视野中。
  • 加载数据集并将其拆分为训练集和测试集。
  • 初始化模型。
  • 使用交叉验证对其进行评估。

现在我们执行整个过程的两步。首先,我们定义“研究”或超参数优化实验。请注意,我们将 direction 参数设置为“maximize”,因为之前我们选择“accuracy”(越高越好)作为交叉验证的指导指标。

其次,optimize 方法间接调用 Optuna 重写的 objective 函数,该函数是我们之前定义的、需要多次试验才能完成过程的核心函数。

这将输出总共 50 个实验报告,指定每次试验的超参数设置和所得模型的准确率。由于我们有兴趣获得所有尝试配置中的最佳值,因此让我们轻松获取它。

以及一个示例输出:

太棒了!得益于 Optuna 的自动化超参数优化功能,我们找到了一个随机森林集成配置,能够以超过 97% 的预测准确率对数字图像进行分类。

如果您已经使用了 Scikit-learn 内置的超参数优化类,如GridSearchCVRandomizedSearchCV,您可能会想:为什么 Optuna 更好?一个原因是 Optuna 在后台使用了贝叶斯优化,使超参数调整过程更有效率。此外,Optuna 应用了内部策略,如剪枝或突然终止前景不明的试验,并支持比传统方法更复杂的搜索空间。

总结

如果您已经按照上面的步骤操作,您现在应该能够使用 Optuna 实现 Scikit-learn 超参数优化。

有关更多信息,请查看以下 Machine Learning Mastery 资源:

如何使用 Optuna 进行 Scikit-learn 超参数优化的 2 条回复

  1. Josh 2025年7月24日 下午 6:44 #

    我不认为 optuna 能提供有用的 HP 模型。Optuna 计算的函数损失与训练和测试文件不同,并且这两者之间也有不同的梯度。差异越大,测试文件上的 AUC 就越差,模型也从未泛化。我进行了大量测试,并能证明这一点(即使借助 AI 也无法获得可用的结果)!此外,当 optuna “找到”所谓的“好模型”时,也存在巨大的差异,但当我使用相同的设置在真实模型上测试它时,我的 AUC 结果却只有 50% 左右,甚至更糟,模型总是偶然找到结果。完全没用!那么 Optuna 如何才能使用呢?我从没想过数据科学会变成无用的巫师式杂乱无章。

    • James Carmichael 2025年7月25日 凌晨 1:04 #

      您好 Josh…除了 Optuna 和其他优化包的默认设置外,还有许多参数可以调整。

      请详细说明您的用例,我们可以一起选择一个可能对您的数据更有益的用例。

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。