如何使用PyTorch和Optuna进行交叉验证

7

我想使用交叉验证来测试官方Optuna和基于pytorch的样例代码(https://github.com/optuna/optuna/blob/master/examples/pytorch_simple.py)。

我考虑将数据拆分为交叉验证的折叠,然后尝试对每个折叠进行参数调整,但是由于study.trials_dataframe()返回的参数每次都不同,所以无法获得每个参数的平均准确性。


1
简短回答:Optuna的贝叶斯过程是交叉验证试图近似的内容。如果可能,请查看此答案并在那里发表评论;目前我认为没有必要进行交叉发布:https://stats.stackexchange.com/a/491268/272731 - brethvoice
1个回答

8
我认为我们需要评估所有的折叠并在目标函数内计算平均值。我创建了一个示例笔记本,请看一下。
在笔记本中,我稍微修改了objective函数以使用参数传递数据集,并添加了一个包装函数objective_cv来调用带有分裂数据集的objective函数。然后,我优化objective_cv而不是objective函数。
def objective(trial, train_loader, valid_loader):

    # Remove the following line.
    # train_loader, valid_loader = get_mnist()

    ...

    return accuracy


def objective_cv(trial):

    # Get the MNIST dataset.
    dataset = datasets.MNIST(DIR, train=True, download=True, transform=transforms.ToTensor())

    fold = KFold(n_splits=3, shuffle=True, random_state=0)
    scores = []
    for fold_idx, (train_idx, valid_idx) in enumerate(fold.split(range(len(dataset)))):
        train_data = torch.utils.data.Subset(dataset, train_idx)
        valid_data = torch.utils.data.Subset(dataset, valid_idx)

        train_loader = torch.utils.data.DataLoader(
            train_data,
            batch_size=BATCHSIZE,
            shuffle=True,
        )
        valid_loader = torch.utils.data.DataLoader(
            valid_data,
            batch_size=BATCHSIZE,
            shuffle=True,
        )

        accuracy = objective(trial, train_loader, valid_loader)
        scores.append(accuracy)
    return np.mean(scores)


study = optuna.create_study(direction="maximize")
study.optimize(objective_cv, n_trials=20, timeout=600)

一个很棒的简历解决方案! - Angus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接