我有一个非常基础的问题。
1) 在什么情况下建议保留一部分数据用于验证,什么情况下不需要这样做?例如,什么时候我们可以说最好采用80%用于训练,10%用于验证,10%用于测试的划分方式,什么时候可以说简单地采用80%用于训练,20%用于测试的划分方式就足够了?
2) 此外,使用K折交叉验证是否与简单划分(训练-测试)兼容?
回答:
如果我的数据集规模有限,我认为拥有训练集和验证集更为有价值。验证集本质上也是一个测试集。这样做的原因是,你希望你的模型能够从在训练数据上获得高准确率的基础上,对未见过的数据也具有高准确率。验证集可以帮助你确定这一点。我通常会至少拿出10%的数据集作为验证集。重要的是,你要随机选择验证数据,使其概率分布与训练集匹配。接下来,我会监控验证损失,并保存验证损失最低时的模型。我还使用可调整的学习率。Keras有两个有用的回调函数可用于此目的,分别是ModelCheckpoint和ReduceLROnPlateau。文档在这里这里。有了验证集,你可以在训练过程中监控验证损失,并确定你的模型是否在正确训练(训练准确率)以及是否正确地进行外推(验证损失)。通常情况下,随着模型准确率的提高,验证损失平均应会减少。如果验证损失开始增加而训练准确率很高,那么你的模型可能出现了过拟合,你可以采取补救措施,例如加入丢弃层(dropout layers)、使用正则化器(regularizers)或降低模型复杂度。相关文档在这里这里和这里。关于为什么我使用可调整学习率,可以参考Stack Overflow上的一个回答这里。