盘点我跳过的科研天坑,进坑就是半年白干( 四 )


需要指出的是 , 尽管经常会听到一些关于调参的诟病(类似于“这篇论文效果好完全是靠调参!”的抱怨) , 但是调参是有其必要性的 。 应该避免的是不规范的调参和不公平的实验比较方式 。 比如 , 不能用测试集数据调参;以及 , 不能仅对自己提出的模型疯狂调参 , 而应对所有使用中的模型都进行同等程度的调参方式等等 。
5.注意调参和选择特征的阶段
超参数调整和特征选择都应当是训练的一部分 , 而不是说训练之前运行一次就以为万事大吉 。 特别是特征选择 , 如果对整个数据集统一进行特征选择 , 很可能又会把测试数据和训练数据中包含的知识混在一起 , 导致测试结果不可靠 , 因此 , 最好只对你训练用的那一部分数据进行调参和特征选择 。 一种推荐的方法是嵌套交叉验证 , 这种方法在交叉验证外面再套了一圈验证 , 用来测试不同超参数和特征选择对模型的影响 。
5如何合理地评估模型
1.选择合适的测试集
能够证明模型泛化性才是好的测试集 。 训练集上表现再好也可能只是过拟合 , 只有在一个尽可能贴近实际场景的测试集中表现过关 , 才能证明模型的训练是有效的 。 你的训练集中数据可以是在单一条件下采集的 , 但测试集中数据必须包括各式各样的情况 。 而且测试集和训练集绝对不能有重合 。
2.验证集是有必要的
在刚开始做机器学习的时候 , 我对于验证集的概念不甚清楚 , 也不明白为什么要掐出来那么多数据当验证集(甚至有人告诉过我验证集可有可无 , 谢谢您嘞!) 。 验证集主要是用在训练过程中 , 用来对比多个模型的表现的 。 当你需要同时训练好几个超参数设置不一样的模型时 , 帮助挑选这些模型的就是验证集 。 虽然测试集没有直接参与模型的训练 , 但它指导了训练的方向 。 验证集就是训练和测试之间的缓冲地带 , 保证了模型的训练集和测试集没有任何重叠 。 验证集的另一个好处就是 , 你可以用它来检查你的模型是否真的学到了数据的规律 , 见势不妙时可以趁早停下;如果模型在验证集中表现先升后降 , 很可能是模型过拟合的标志 。
3.一个模型多验证几次
机器学习的模型能有多不稳定 , 我相信所有用过GAN和RL的人都有话要说 , 随机采样训练样本的情况下 , 模型能往各种神奇的方向发展 , 收敛到各式各样的局部最优 。 这就是为什么我们需要交叉验证法 , 它能尽可能地保证模型训练效果 , 一定程度上防止过拟合 。 需要注意的是 , 如果数据集中存在类别不均衡的问题 , 最好保证每个验证组中都能包含所有类别 。 在交叉验证的过程中 , 强烈推荐大家记录每轮中测试的均值和方差 , 在比较模型表现时这些数据会起到重要作用 。
4.留点数据用于最终验证
在训练过程中 , 交叉验证可以很大程度上保证一类模型的训练效果的稳定性 , 但是 , 对于训练中的每个模型个体 , 这样的验证还不够充分 , 因为每组交叉验证的子集中数据量往往都不大 , 不一定具有泛化性 , 说不定 , 表现最好的模型只是恰好遇到了最简单的验证子集 。 因此 , 如果你的数据还算充裕 , 最好能留一部分数据 , 在训练结束之后再无偏验证一下模型们的表现 。
5.数据不均衡的时候 , 精度是没有意义的
数据采集不均衡的情况很常见 。 例如 , 很多的自动驾驶的数据集中 , 行人、自行车、卡车的数量加起来还没有小轿车多 。 这种情况下 , 用模型对交通参与物分类的精度作为衡量模型表现的标准 , 恐怕意义不大 。 这种情况下 , 应当先对不同类别样本的分类精度进行一致性检验 , 或者采用一些适用于不均衡数据的评估指标 , 例如Kappa系数 , Matthews相关系数等 。