【问题标题】:Understanding Intermediate Values and Pruning in Optuna了解 Optuna 中的中间值和修剪
【发布时间】:2021-12-27 13:57:34
【问题描述】:

我只是想了解更多关于中间步骤实际上是什么以及如何使用修剪的信息,如果您使用的是教程部分中没有的其他 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() 的需求,是否每次您希望使用修剪时都需要它?

【问题讨论】:

    标签: python machine-learning deep-learning hyperparameters optuna


    【解决方案1】:

    通过一次完整的训练数据集可以完成基本模型的创建。但是有些模型仍然可以通过在相同的训练数据集上重新训练来改进(提高准确性)。

    为了确保我们不会在这里浪费资源,如果准确性提高,我们将在每个步骤后通过intermediate_score 使用验证数据集检查准确性,否则我们会修剪整个试验,跳过其他步骤。然后我们进行下一次试验,询问另一个 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 有专门的修剪器

    【讨论】:

    • 那么它如何与不需要n_train_iter 的机器学习算法一起使用,如您上面的示例所示?
    • 如果机器学习算法的模型不需要重新训练或者您不想重新训练模型,那么不使用试用剪枝是可行的。
    • 有道理,谢谢@ferdy!
    猜你喜欢
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2020-06-04
    • 2021-09-30
    • 2015-11-01
    相关资源
    最近更新 更多