重用最优试验

在某些情况下,您可能希望在超参数优化完成后,使用找到的最佳超参数再次评估目标函数。

例如,

  • 您已经使用 Optuna 找到了不错的超参数,现在希望使用迄今为止找到的最佳超参数运行一个相似的 objective 函数,以便进一步分析结果,或者

  • 您使用 Optuna 对部分数据集进行了优化以减少训练时间。在超参数调优完成后,您希望使用找到的最佳超参数值训练使用完整数据集的模型。

best_trial 提供了一个接口,可以使用当前最佳超参数值重新评估目标函数。

本教程展示了一个示例,说明如何使用当前最佳值重新运行一个不同的 objective 函数,就像上面的第一个例子一样。

进一步研究最佳模型

让我们考虑一个经典的监督分类问题,并使用 Optuna 进行如下操作

from sklearn import metrics
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split


import optuna


def objective(trial):
    X, y = make_classification(n_features=10, random_state=1)
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)

    C = trial.suggest_float("C", 1e-7, 10.0, log=True)

    clf = LogisticRegression(C=C)
    clf.fit(X_train, y_train)

    return clf.score(X_test, y_test)


study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=10)

print(study.best_trial.value)  # Show the best value.
0.92

假设在超参数优化之后,您想在相同数据集上计算其他评估指标,例如召回率、精确率和 f1-score。您可以定义另一个目标函数,该函数与原 objective 函数共享大部分内容,以便使用最佳超参数重现模型。

def detailed_objective(trial):
    # Use same code objective to reproduce the best model
    X, y = make_classification(n_features=10, random_state=1)
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)

    C = trial.suggest_float("C", 1e-7, 10.0, log=True)

    clf = LogisticRegression(C=C)
    clf.fit(X_train, y_train)

    # calculate more evaluation metrics
    pred = clf.predict(X_test)

    acc = metrics.accuracy_score(pred, y_test)
    recall = metrics.recall_score(pred, y_test)
    precision = metrics.precision_score(pred, y_test)
    f1 = metrics.f1_score(pred, y_test)

    return acc, f1, recall, precision

study.best_trial 作为 detailed_objective 函数的参数传入。

detailed_objective(study.best_trial)  # calculate acc, f1, recall, and precision
(0.92, 0.9285714285714286, 0.9285714285714286, 0.9285714285714286)

best_trial 与普通试验的区别

这里使用了 best_trial,它将 best_trial 返回为一个 FrozenTrialFrozenTrial 与活跃试验不同,在某些情况下其行为与 Trial 不同。例如,剪枝(pruning)不起作用,因为 should_prune 总是返回 False

注意

对于 使用 Optuna 进行多目标优化 中演示的多目标优化,best_trials 返回 Pareto 前沿上的一系列 FrozenTrial。因此,我们可以通过上述类似的方式重用列表中的每个试验。

脚本总运行时间: (0 minutes 0.045 seconds)

由 Sphinx-Gallery 生成的画廊