我的演示代码在这里。检查出来,然后回到这里阅读/留下评论。如果你想编辑我的代码,让它在更多种类的机器上运行,那就太好了;只需提交一个拉取请求和/或自己分叉代码,并出于礼貌让我知道。
交叉验证是贝叶斯优化的近似值,因此不必将其与 Optuna 一起使用。但是,如果它有意义并且你有时间去做,它只会导致元优化。
我昨天在设置参数研究时意识到了这一点,并意识到这需要几个月,而不仅仅是几天才能完成。这是我最初设置的方式:
将 MNIST 训练和测试集组合成一个数据集,然后进行训练和验证n次(对于 MNIST 组合,n=70,000) 持有nv=65,697随机选择的样本在每个交叉验证复制中的每个训练时期进行验证。
使用以下方法训练每个复制品的模型nc=4,303没有为验证而保留的样本(每个时期结束时的损失是在保留时计算的nv样本)直到验证损失在指定数量的时期内停止减少(通过 Keras 的EarlyStopping带有耐心参数的回调)。向 Optuna 报告模型的性能,作为所有复制中最佳训练模型的平均验证损失。选择方法见下文nc=n−nv(训练集大小)。
将步骤 1 和 2 组合成 Optuna 的目标函数,以最小化平均验证损失。执行研究,确保指定direction='minimize'.
我最终使用的是每次 Optuna 试验只需要几分钟(最多)的东西,而不是 70,000 倍:
分别加载 MNIST 训练和测试集并保持nv=n−nc仅从训练集中随机选择的样本,用于在每个训练时期进行验证。
使用训练单个模型nc样本(对于 MNIST,这是 3,833),直到验证损失(根据保留计算nv=n−nc样本)在几个时期内停止减少(如 Keras 的EarlyStopping带有耐心参数的回调)。通过推断测试数据集(不参与训练或验证)并计算任何相关后果所涉及的概率作为风险度量(如果可能),以评估具有最低验证损失的模型的性能。
将步骤 1 和 2 组合成 Optuna 的目标函数,以最小化或最大化(取决于风险/评估指标)。然后执行研究,确保指定优化方向(direction='maximize'或direction='minimize'适当)。
注意: 在这种情况下nc=n3/4基于以下引用的文章;通常人们使用不到一半的数据进行验证,但在这种情况下,训练的数据总是不超过一半,而且通常要少得多。此外,至少重复训练和验证步骤n同一篇文章要求时间。即使我没有进行交叉验证,我仍然在训练期间进行验证,因此尽管缺乏这样做的理论基础,我仍然使用这种指数计算来计算训练集的大小。通常的做法是保留 1/5 的数据(或 K 折的 1/K)进行验证。在这种情况下,我坚持1−n3/4验证数据的比例,最终总是超过整个数据集的 1/2。
作者:邵军
文章:通过交叉验证选择线性模型
出版信息:美国统计协会杂志;亚历山大卷。88,伊斯。422,(1993 年 6 月):486。
摘要:考虑在一类线性模型中选择具有最佳预测值的模型的问题。提供了使用 leave-nv-out 交叉验证方法的一些实际方面的动机、理由和讨论,并给出了模拟研究的结果。