应用机器学习算法时,实践方法论能够帮助我们更好地训练模型。
如果在 Kaggle 上的结果不太好,虽然 Kaggle 上呈现的是测试数据的结果,但要先检查训练数据的损失。看看模型在训练数据上面,有没有学起来,再去看测试的结果,如果训练数据的损失很大,显然它在训练集上面也没有训练好。
(图示在训练集上面没有学好的几点原因)
一、模型偏差(Model Bias)
模型偏差可能会影响模型训练。
举例说明:假设一个模型设计的过于简单,导致该函数的集合太小了,没有包含任何一个函数,可以让损失变低的函数不在模型可以描述的范围内。损失还是不够低。(这种情况就如同在大海里面捞“针”(一个损失低的函数),结果“针”根本就不在海里。)
解决方法:
1、可以增加更多的特征,重新设计一个更大的模型。
2、可以使用深度学习,增加更多的灵活性。
但是并不是训练的时候,损失大就代表一定是模型偏差,可能会遇到另外一个问题:优化做得不好
二、优化问题(Optimization issue)
(一般只会用到梯度下降进行优化,但是这种优化的方法很多的问题。)
如图 (a) 图 (b) 所示蓝色部分是模型可以表示的函数所形成的集合,可以把 θ 代入不同的数值,形成不同的函数,把所有的函数通通集合在一起,得到这个蓝色的集合。这个蓝色的集合里面,确实包含了一些函数,这些函数它的损失是低的。但问题是梯度下降这一个算法无法找出损失低的函数,梯度下降是解一个优化的问题,找到 θ∗ 就结束了。但 θ∗ 的损失不够低。这个模型里面存在着某一个函数的损失是够低的,梯度下降却没有给出这一个函数。
(优化方法的问题)
建议:看到一个从来没有做过的问题,可以先跑一些比较小的、比较浅的网络,或甚至用一些非深度学习的方法,比如线性模型、支持向量机(Support Vector Machine,SVM),SVM 可能是比较容易做优化的,它们比较不会有优化失败的问题。
情况一:如果是模型偏差,就把模型变大。假设经过努力可以让训练数据的损失变小,接下来可以来看测试数据损失;如果测试数据损失也小,比这个较强的基线模型还要小,就结束了。
情况二:如果训练数据上面的损失小,测试数据上的损失大,可能是真的过拟合。在测试上的结果不好,不一定是过拟合。要把训练数据损失记下来,先确定优化没有问题,模型够大了。接下来才看看是不是测试的问题,如果确实是训练损失小,测试损失大,这个有可能是过拟合
三、过拟合(Overfitting)
1)识别过拟合:
把训练数据损失记下来,先确定优化没有问题,模型够大了(模型偏差)。接下来才看看是不是测试的问题,如果是训练损失小,测试损失大,这个有可能是过拟合。总的来说,过拟合:训练数据上面的损失小,测试数据上的损失大,就是过拟合。
2)解决过拟合问题:
方法一:增加训练集,也就是可以做数据增强(data augmentation,),数据增强就是根据问题的理解创造出新的数据
方法二:给模型一些限制,让模型不要有过大的灵活性,因为能选择的函数有限,可能就会正好选到跟真正的分布比较接近的函数,在测试集上得到比较好的结果。
四、交叉验证(Cross Validation)
比较合理选择模型的方法是把训练的数据分成两半,一部分称为训练集(training set),一部分是验证集(validation set),比如 90% 的数据作为训练集,有 10% 的数据作为验证集。在训练集上训练出来的模型会使用验证集来衡量它们的分数,根据验证集上面的分数去挑选结果,在挑分数的时候,是用验证集来挑模型。但是会有一个问题,如果随机分验证集,可能会分得不好,所以可以用 k 折交叉验证
五. 不匹配:
如图所示,横轴是从 2021 年的 1 月 1 号开始一直往下,红色的线是真实的数字,蓝色的线是预测的结果。可以看到,2 月 26 日是 2021 年观看人数最高的一天了,但是机器的预测差距却非常的大,差距有 2580。
在某个点上预测值和真实值不同(或是出现反常),这种情况是另外一种错误的形式,这种错误的形式称为不匹配(mismatch),不匹配是指训练集和测试集的分布不同。(不匹配跟过拟合其实不同,一般的过拟合可以用搜集更多的数据来克服,但是不匹配是指训练集跟测试集的分布不同,训练集再增加数据也没有帮助。)