我只是想了解更多关于中间步骤实际上是什么以及如何使用剪枝的更多信息,如果您使用的是不同的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()的需求,而且每次您想要使用剪枝时都需要它吗?
发布于 2021-11-17 03:18:48
基本的模型创建可以通过一次传递完整的训练数据集来完成。但是,仍然有一些模型可以通过在相同的训练数据集上进行再训练来改进(提高准确性)。
为了确保我们在这里不会浪费资源,我们将在通过intermediate_score使用验证数据集的每一步之后检查准确性,如果准确性没有提高,如果没有,我们将删除整个测试,跳过其他步骤。然后,我们进行下一次试验,询问alpha的另一个值--我们试图确定的超参数,它在验证数据集上具有最大的准确性。
对于其他图书馆来说,这只是问问我们自己,我们希望我们的模型是什么,准确性肯定是衡量模型胜任力的一个很好的标准。可能还有其他人。
例如金枪鱼修剪,我希望模型继续重新训练,但只在我的具体条件。如果中间值不能击败我的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_accuracyOptuna在https://optuna.readthedocs.io/en/stable/reference/pruners.html有专门的剪枝器
https://stackoverflow.com/questions/69990009
复制相似问题