任务三---机器学习框架和实践攻略
在应用机器学习算法时,实践方法论能够帮助我们更好地训练模型,如果训练数据的损失很大,显然它在训练集上面也没有训练好。接下来可以逐步分析一下在训练集上面没有学好的原因。
目录
一,模型偏差
第一个可能是模型的偏差。举个例子,假设模型过于简单,一个有未知参数的函数代 θ 1 \theta_1θ 1得到一个函数 f θ 1 ( x ) f_{\theta_1}(x)f θ 1 (x),同理可得到另一个函数 f θ 2 ( x ) f_{\theta_2}(x)f θ 2(x),把所有的函数集合起来得到一个函数的集合. 但是这个函数的集合太小了,可以让损失变低的函数不在模型可以描述的范围内。在这个情况下,就算找出了一个 θ ∗ \theta^*θ
∗,虽然它是这些蓝色的函数里面最 好的一个,但损失还是不够低。
这个时候重新设计一个模型,给模型更大的灵活性。举个例子,可以增加输入的特征,本 来输入的特征只有前一天的信息,假设要预测接下来的观看人数,用前一天的信息不够多,用 56 天前的信息,模型的灵活性就比较大了。也可以用深度学习,增加更多的灵活性。所以如果模型的灵活性不够大,可以增加更多特征,可以设一个更大的模型,可以用深度学习来增加模型的灵活性,这是第一个可以的解法。但是并不是训练的时候,损失大就代表一定是模型偏差,可能会遇到另外一个问题:优化做得不好。
二,优化问题
一般只会用到梯度下降进行优化,这种优化的方法很多的问题。比如可能会卡在局部最小值的地方,无法找到一个真的可以让损失很低的参数。
三,过拟合
为什么会有过拟合这样的情况呢?举一个极端的例子,这是训练集。假设根据这些训练 集,某一个很废的机器学习的方法找出了一个一无是处的函数。这个一无是处的函数,只要输入 x 有出现在训练集里面,就把它对应的 y 当做输出。如果 x 没有出现在训练集里面,就输出一个随机的值。这个函数啥事也没有干,是一个一无是处的函数,但它在训练数据上的损失是 0。把训练数据通通丢进这个函数里面,它的输出跟训练集的标签是一模一样的,所以在训练数据上面,这个函数的损失可是 0 呢,可是在测试数据上面,它的损失会变得很大, 因为它其实什么都没有预测,这是一个比较极端的例子,在一般的情况下,也有可能发生类似的事情。
四,交叉验证
比较合理选择模型的方法是把训练的数据分成两半,一部分叫作训练集(training set), 一部分是验证集(validation set)。比如 90% 的数据放在训练集里面,有 10% 的数据,会被 拿来做验证集,在训练集上训练出来的模型会使用验证集来衡量它们的分数,根据验证集上面的分数去挑选结果。
五,不匹配
图中横轴就是从 2021 年的 1 月 1 号开始一直往下,红色的线是真实的数字,蓝色的线是预测的结果。2 月 26 日是 2021 年观看人数最高的一天了,机器的预测差距非常的大, 差距有 2.58k,以这一天是 2021 年观看人数最多的一天。跑了一层两层跟四层的看看,所有的模型的结果都不好两层跟三层的错误率都是 2 点多 k,其实四层跟一层比较好,都是 1.8k 左右,但是这四个模型不约而同的,觉得 2 月 26 日应该是个低点,但实际上 2 月 26 日 是一个峰值,模型其实会觉得它是一个低点,也不能怪它,因为根据过去的数据,周五晚上大 家都出去玩了。但是 2 月 26 日反常况。这种情况应该算是另外一种错误的形式, 这种错误的形式称为不匹配(mismatch)。
不匹配跟过拟合其实不同,一般的过拟合可以用搜集更多的数据来克服,但是不匹配是指训练集跟测试集的分布不同,训练集再增加其实也没有帮助了。
配跟过拟合其实不同,一般的过拟合可以用搜集更多的数据来克服,但是不匹配是指训练集跟测试集的分布不同,训练集再增加其实也没有帮助了。