了解 Optuna 中的中间值和修剪
Understanding Intermediate Values and Pruning in Optuna
我只是想知道更多关于中间步骤实际上是什么以及如果您使用的是教程部分中没有的其他 ml 库(例如)XGB、Pytorch 等时如何使用修剪的更多信息
例如:
X, y = load_iris(return_X_y=True)
X_train, X_valid, y_train, y_valid = train_test_split(X, y)
classes = np.unique(y)
n_train_iter = 100
def objective(trial):
global num_pruned
alpha = trial.suggest_float("alpha", 0.0, 1.0)
clf = SGDClassifier(alpha=alpha)
for step in range(n_train_iter):
clf.partial_fit(X_train, y_train, classes=classes)
intermediate_value = clf.score(X_valid, y_valid)
trial.report(intermediate_value, step)
if trial.should_prune():
raise optuna.TrialPruned()
return clf.score(X_valid, y_valid)
study = optuna.create_study(
direction="maximize",
pruner=optuna.pruners.HyperbandPruner(
min_resource=1, max_resource=n_train_iter, reduction_factor=3
),
)
study.optimize(objective, n_trials=30)
for step in range()
部分的重点是什么?这样做不是只会让优化花费更多时间,而且循环中的每一步都不会产生相同的结果吗?
我真的在想弄清楚 for step in range()
的必要性,每次你想使用修剪时都需要它吗?
基本的模型创建可以通过一次完整的训练数据集来完成。但是有些模型仍然可以通过在相同的训练数据集上再次训练来改进(提高准确性)。
为了确保我们没有在这里浪费资源,如果准确性提高,我们将在每个步骤后使用验证数据集检查准确性,如果准确性提高,我们会修剪整个试验,跳过其他步骤。然后我们进行下一次试验,询问另一个 alpha 值——我们试图确定的超参数,以在验证数据集上具有最高的准确性。
对于其他图书馆,这只是问问我们自己我们想要我们的模型做什么的问题,准确性肯定是衡量模型能力的一个很好的标准。可以有其他的。
示例 optuna 修剪,我希望模型继续重新训练,但仅限于我的特定条件。如果中间值不能打败我的 best_accuracy 并且如果步数已经超过我的最大迭代的一半,那么修剪这个试验。
best_accuracy = 0.0
def objective(trial):
global best_accuracy
alpha = trial.suggest_float("alpha", 0.0, 1.0)
clf = SGDClassifier(alpha=alpha)
for step in range(n_train_iter):
clf.partial_fit(X_train, y_train, classes=classes)
if step > n_train_iter//2:
intermediate_value = clf.score(X_valid, y_valid)
if intermediate_value < best_accuracy:
raise optuna.TrialPruned()
best_accuracy = clf.score(X_valid, y_valid)
return best_accuracy
Optuna 在 https://optuna.readthedocs.io/en/stable/reference/pruners.html
有专门的修枝剪
我只是想知道更多关于中间步骤实际上是什么以及如果您使用的是教程部分中没有的其他 ml 库(例如)XGB、Pytorch 等时如何使用修剪的更多信息
例如:
X, y = load_iris(return_X_y=True)
X_train, X_valid, y_train, y_valid = train_test_split(X, y)
classes = np.unique(y)
n_train_iter = 100
def objective(trial):
global num_pruned
alpha = trial.suggest_float("alpha", 0.0, 1.0)
clf = SGDClassifier(alpha=alpha)
for step in range(n_train_iter):
clf.partial_fit(X_train, y_train, classes=classes)
intermediate_value = clf.score(X_valid, y_valid)
trial.report(intermediate_value, step)
if trial.should_prune():
raise optuna.TrialPruned()
return clf.score(X_valid, y_valid)
study = optuna.create_study(
direction="maximize",
pruner=optuna.pruners.HyperbandPruner(
min_resource=1, max_resource=n_train_iter, reduction_factor=3
),
)
study.optimize(objective, n_trials=30)
for step in range()
部分的重点是什么?这样做不是只会让优化花费更多时间,而且循环中的每一步都不会产生相同的结果吗?
我真的在想弄清楚 for step in range()
的必要性,每次你想使用修剪时都需要它吗?
基本的模型创建可以通过一次完整的训练数据集来完成。但是有些模型仍然可以通过在相同的训练数据集上再次训练来改进(提高准确性)。
为了确保我们没有在这里浪费资源,如果准确性提高,我们将在每个步骤后使用验证数据集检查准确性,如果准确性提高,我们会修剪整个试验,跳过其他步骤。然后我们进行下一次试验,询问另一个 alpha 值——我们试图确定的超参数,以在验证数据集上具有最高的准确性。
对于其他图书馆,这只是问问我们自己我们想要我们的模型做什么的问题,准确性肯定是衡量模型能力的一个很好的标准。可以有其他的。
示例 optuna 修剪,我希望模型继续重新训练,但仅限于我的特定条件。如果中间值不能打败我的 best_accuracy 并且如果步数已经超过我的最大迭代的一半,那么修剪这个试验。
best_accuracy = 0.0
def objective(trial):
global best_accuracy
alpha = trial.suggest_float("alpha", 0.0, 1.0)
clf = SGDClassifier(alpha=alpha)
for step in range(n_train_iter):
clf.partial_fit(X_train, y_train, classes=classes)
if step > n_train_iter//2:
intermediate_value = clf.score(X_valid, y_valid)
if intermediate_value < best_accuracy:
raise optuna.TrialPruned()
best_accuracy = clf.score(X_valid, y_valid)
return best_accuracy
Optuna 在 https://optuna.readthedocs.io/en/stable/reference/pruners.html
有专门的修枝剪