目录
基本思路
1.训练资料上loss很大
1.1 model bias
1.2 optimazation(优化不够好)
1.3如何确定是 model bias还是optimazation
解决方法
2.训练资料上loss很小
2.1 Overfitting
解决方案
1.使用更多训练资料
2.限制模型
2.2 Mismatch
3.选出最优模型
常见误区
测试集划分为public和private原因
解决方法:Cross-Validation(交叉验证)
N-fold Cross Validation
基本思路
最终结果不满意时(比如在Kaggle上得分低),按照以下思路改进
首先检查训练资料上的loss
1.训练资料上loss很大
1.1 model bias
可能是模型偏差导致的,解决方案:重新设计模型,增大模型的弹性,如增加feature
1.2 optimazation(优化不够好)
但不是所有情况都是model bias的问题。参数优化不够好也会引起问题。
1.3如何确定是 model bias还是optimazation
注意:上图所示不是Overfitting(指训练资料上loss小,而测试资料上loss大)!显然56层的模型弹性比20层的更大,所以是优化的问题。
解决方法
2.训练资料上loss很小
进一步检查测试资料上的loss,如果很小,恭喜你,已经训练成功了。下面是针对测试资料上loss很大的情况
2.1 Overfitting
模型弹性太大,可能出现这个问题,模型过度“记忆”了训练数据的细节(包括噪声和异常值),而非学习其内在规律。
解决方案
1.使用更多训练资料
此方法往往是最有效的。但有时不能找到更多的资料,此时可使用Data Augmentation(数据增强)利用有限样本生成更多资料,比如左右翻转图片、裁剪放大图片,但数据需符合真实场景:不分图片不能翻转
2.限制模型
使用更少的参数,使用弹性更小模型,如CNN(卷积神经网络)等等。
但是过犹不及,如果限制太大,又会回到model bias的问题。
2.2 Mismatch
训练资料和测试资料的数据有不同的分布,增加训练数据也无济于事。
3.选出最优模型
常见误区
选取public得分最高的作为结果上传
测试集划分为public和private原因
即使是一个很废物的模型,只要通过一直调参,不断上传,也可能在得到一个很好的结果。将测试集划分为public和private,只有public分数展示给提交者,最终以private的分数为准,可以避免上述情况。
这是因为很多testing set是全部公开的,没有划分public和private,所以通过不断调参,可以得到好的结果。但现实中往往机器并不能取得超过人类的结果。
解决方法:Cross-Validation(交叉验证)
从training set划出Validation set(验证集),后者不参与模型的调参,用模型在后者上的结果表示训练结果。最后选择模型时,选validation set上表现最好的,尽量不要在意public上的结果,如果又根据public上的结果反复调整,可能出现模型fit在public testing set这种上述提及的情况。
N-fold Cross Validation
如果划分的验证集数据不好,会影响最终结果,k-Fold Cross-Validation(k折交叉验证)可以解决此问题:每次用不同的数据作为验证集,直至覆盖所有数据,然后取平均值作为结果。