
如何使用 Optuna 进行 Scikit-learn 超参数优化
作者 | Ideogram 提供图片
引言
Optuna是一个专门为自动化超参数优化而设计的机器学习框架,即找到能优化模型性能的机器学习模型超参数的外部固定设置。它可以与 Scikit-learn 等其他机器学习建模框架无缝集成。
在本文中,我们将展示如何将两者结合起来进行超参数优化任务。
使用 Optuna 进行 Scikit-learn 超参数优化
如果是在 Python 开发环境中首次使用 Optuna,则需要先安装它。
1 |
pip install optuna |
在本示例中,我们将使用 Scikit-learn 的digits
数据集训练一个随机森林分类器。该数据集是 MNIST 数据集的一个“简化版本”,用于图像分类,包含手写数字的 8×8 像素图像。现在是时候导入必要的组件了。
1 2 3 4 |
import optuna from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split, cross_val_score from sklearn.ensemble import RandomForestClassifier |
接下来,我们定义稍后将用于进行超参数优化过程的主函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
def objective(trial): n_estimators = trial.suggest_int("n_estimators", 10, 200) max_depth = trial.suggest_int("max_depth", 2, 32, log=True) min_samples_split = trial.suggest_int("min_samples_split", 2, 10) digits = load_digits() X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.2, random_state=42) clf = RandomForestClassifier( n_estimators=n_estimators, max_depth=max_depth, min_samples_split=min_samples_split, random_state=42 ) score = cross_val_score(clf, X_train, y_train, cv=3, scoring="accuracy").mean() return score |
正如你所见,几乎整个建模过程都封装在这个objective(trial)
函数中,它是 Optuna 管理的核心函数,用于自动化超参数搜索,执行指定次数的试验。让我们看看这个函数的具体内容,也就是我们定义的过程。
- 定义超参数搜索空间或网格(有关此概念的更深入了解,请参阅本文)。搜索空间中的超参数通过
suggest_in
函数添加到 Optuna 的视野中。 - 加载数据集并将其拆分为训练集和测试集。
- 初始化模型。
- 使用交叉验证对其进行评估。
现在我们执行整个过程的两步。首先,我们定义“研究”或超参数优化实验。请注意,我们将 direction 参数设置为“maximize”,因为之前我们选择“accuracy”(越高越好)作为交叉验证的指导指标。
1 |
study = optuna.create_study(direction="maximize") |
其次,optimize 方法间接调用 Optuna 重写的 objective 函数,该函数是我们之前定义的、需要多次试验才能完成过程的核心函数。
1 |
study.optimize(objective, n_trials=50) |
这将输出总共 50 个实验报告,指定每次试验的超参数设置和所得模型的准确率。由于我们有兴趣获得所有尝试配置中的最佳值,因此让我们轻松获取它。
1 2 |
print("最佳超参数:", study.best_params) print("最佳准确率:", study.best_value) |
以及一个示例输出:
1 2 |
最佳 超参数: {'n_estimators': 188, 'max_depth': 17, 'min_samples_split': 4} 最佳 准确率: 0.9700765483646485 |
太棒了!得益于 Optuna 的自动化超参数优化功能,我们找到了一个随机森林集成配置,能够以超过 97% 的预测准确率对数字图像进行分类。
如果您已经使用了 Scikit-learn 内置的超参数优化类,如GridSearchCV
或RandomizedSearchCV
,您可能会想:为什么 Optuna 更好?一个原因是 Optuna 在后台使用了贝叶斯优化,使超参数调整过程更有效率。此外,Optuna 应用了内部策略,如剪枝或突然终止前景不明的试验,并支持比传统方法更复杂的搜索空间。
总结
如果您已经按照上面的步骤操作,您现在应该能够使用 Optuna 实现 Scikit-learn 超参数优化。
有关更多信息,请查看以下 Machine Learning Mastery 资源:
我不认为 optuna 能提供有用的 HP 模型。Optuna 计算的函数损失与训练和测试文件不同,并且这两者之间也有不同的梯度。差异越大,测试文件上的 AUC 就越差,模型也从未泛化。我进行了大量测试,并能证明这一点(即使借助 AI 也无法获得可用的结果)!此外,当 optuna “找到”所谓的“好模型”时,也存在巨大的差异,但当我使用相同的设置在真实模型上测试它时,我的 AUC 结果却只有 50% 左右,甚至更糟,模型总是偶然找到结果。完全没用!那么 Optuna 如何才能使用呢?我从没想过数据科学会变成无用的巫师式杂乱无章。
您好 Josh…除了 Optuna 和其他优化包的默认设置外,还有许多参数可以调整。
请详细说明您的用例,我们可以一起选择一个可能对您的数据更有益的用例。