注意
转到末尾 下载完整的示例代码。
重复使用最佳试验
在某些情况下,您可能希望在超参数优化后,再次使用最佳超参数重新评估目标函数。
例如,
您已通过 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 分数等其他评估指标。您可以定义另一个目标函数,该函数共享大部分 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 返回为 FrozenTrial。 FrozenTrial 与活动试验不同,并且在某些情况下其行为与 Trial 不同。例如,剪枝不起作用,因为 should_prune 始终返回 False。
注意
对于 Optuna 的多目标优化 中演示的多目标优化, best_trials 返回 Pareto 前沿上的 FrozenTrial 列表。因此,我们可以通过类似上述的方式重用列表中的每个试验。
脚本总运行时间: (0 分 0.034 秒)