引言
假设我们实现了一个机器学习算法用于做分类,但在测试集上结果不好,下一步应该怎么办呢?有没有一些一般性的指导原则对我们的算法调优进行指导?
除了模型本身的一些参数调节,大部分人都知道去尝试下面一些通用的调整方法:
正如Andrew NG在机器学习课程上所说,上面提到的每一个方法,都可以扩展成一个6个月的项目;而大部分人都是凭直觉选择这些方法的,这浪费了大量的调优时间。有没有科学的指导原则来帮助我们选择这些通用的调整方法呢?
本文就以线性回归为例,详细讲解如何选择这些通用的调整方法,得出的结论也适用于其他的机器学习算法。下面先介绍正则化
的作用。
正则化
这里先引入正则化
的概念。
直观理解
两个模型的回归曲线如下图所示,从图中可以看出,第二个模型已经过拟合
(overfitting
)。
如果我们减小
正则化
要做的,就是适当减小
正则化定义
正则化参数
过拟合
的程度。
三种拟合的情况
欠拟合
: 连训练集都不能很好的拟合,又叫High Bias
Just Right
: 能很好的拟合训练集与测试集过拟合
: 能很好的拟合训练集,但不能很好的拟合测试集,又叫High Variance
从下图可以直观的看出三种拟合情况之间的区别。
调优时,首先需要判断模型处于哪种拟合情况。怎么判断呢?就是划分训练集后,绘制Learning Curve
即可。
训练集划分(train & validation & test)
一般按6:2:2的比例,将数据集分为训练集,验证集,测试集。
为什么需要验证集呢?
- 如果没有validation dataset,则可能训练出来的模型仅仅匹配测试集,而不适用于将来的数据。验证集能提高一定的泛化能力
- 验证集能保证模型训练到最优(比如可以用early stop策略)
Learning Curve(学习曲线)
Learning Curve
是训练集误差
与验证集误差
相对于训练集数目m
的二维曲线图。这里和下面的m
,表示有多少个训练集。比如我有1000个手写数字训练样本,m=10,表示从中取10个做训练集;m=1000,表示从中取1000个做训练集。
训练集误差
:是根据训练集predic结果h,与真实结果y计算得到的。
- 这里m是横轴,动态变化。
验证集误差
:同理,是根据验证集结果计算得到的。
- mcv是训练集个数,固定值。
将
Learning Curve
。
下面介绍三种拟合情况的Learning Curve
。
Learning Curve of Just Right
假设Just Right
情况下的线性模型为
下面是训练集个数m不同时,模型拟合训练集的情况。
可见
- 随着训练集数量m的增加,模型遇到的情况就越复杂,在
训练集
上的误差会逐渐增加,但都会保持在较小的一个范围内 - 随着训练集数量m的增加,模型见多识广,所以模型在
验证集
上的误差就逐渐减少,且越来越接近训练集误差
所以Just Right
情况下的Learning Curve
如下图所示
同理,画出Learning Curve
后,如果满足上面的条件,就说明模型处于Just Right
情况。说明模型的结构正确,接下来就不用调整结构参数,调节模型其它参数(正则化参数@H_301_1349@
Learning Curve of High Bias
假设High Bias
情况下的线性模型为
下面是训练集个数m不同时,模型拟合训练集的情况。
可见
所以High Bias
情况下的Learning Curve
如下图所示
同理,画出Learning Curve
后,如果满足上面的条件,就说明模型处于High Bias
情况。说明模型的结构不正确,接下来就应该先调整结构参数(增加新feature,增加多项式项,减小正则化参数,增加神经网络隐层神经元个数)。
Learning Curve of High Variance
假设High Variance
情况下的线性模型为
下面是训练集个数m不同时,模型拟合训练集的情况。
可见
- 随着训练集数量m的增加,模型在
训练集
上的误差会逐渐增加(不可能拟合的天衣无缝),但由于模型的拟合能力较强,所以误差都会很小 - 随着训练集数量m的增加,模型在
验证集
上的误差会有所下降,但由于模型拟拟合能力强,把训练集
上的毛刺都拟合了,所以误差依然很大,且与训练集误差
有较大的差距。但验证集误差
会随着m的增加而减少
所以High Variance
情况下的Learning Curve
如下图所示
同理,画出Learning Curve
后,如果满足上面的条件,就说明模型处于High Variance
情况。说明模型的结构不正确,接下来就应该先调整结构参数(减小feature数量,增加正则化参数,减小神经网络隐层神经元个数)。High Variance
情况下,也可以采用增加m的方法使误差下降。
结论
综上,我们可以发现,对机器学习算法进行调优,首先要根据Learning Curve
来判断模型处于哪种拟合情况,从而判断模型结构是否正确。调整时,先进行模型结构调整(feature数量,多项式元素),让模型处于Just Right
的情况,再调整非结构参数(正则化参数)。
所以,下面给出开头给出问题的解答
- 增加训练集: Fix High Variance
- 减少特征维度(从已有的特征中挑选出一部分): Fix High Variance
- 增加新特征: Fix High Bias
- 增加多项式元素(比如将特征平方后叠加到原特征上,相当于增加了非线性的输入): Fix High Bias
- 减小正则化参数的
λ 值: Fix High Bias - 增大正则化参数的
λ 值: Fix High Variance
实例分析
下图是未经调优模型的Learning Curve
,训练模型用到的Feature是1维的。
可见训练集误差曲线变动较大,随着训练集数量m的增加还一直增加,误差较大。且训练集误差接近验证集误差。这说明模型处于High Bias
的状态。所以我们将一维的Feature做乘方后扩充到8维,得出的Learning Curve
见下图。
此时训练集误差随着m增加都维持在一个较小的范围,且验证集误差也随着m的增加而下降,训练集误差与验证集误差都较小,这就说明通过添加多项式特征,将模型的High Bias
状态调整到了Just Right
状态。此时模型的结构到达了正常状态。
将模型结构调整正确后,接下来再为模型调整正则化参数