Part1-机器学习应用中的建议
决定下一步该做什么
调试学习算法
假设对于房价预测模型中,已经完成了正则化线性回归,也就是完成了最小化代价函数\(J\)的值 \(J(\theta)=\frac{1}{2m}[\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\lambda\sum_{j=1}^m\theta_j^2]\)
然而,当在新的房屋数据上进行测试时,产生了巨大的误差,则接下来应该怎么办?
- 获取更多了训练样本
- 尝试更小的特征集
- 尝试更多的特征
- 尝试增加多项式特征
- 尝试减小\(\lambda\)
- 尝试增大\(\lambda\)
机器学习诊断法
诊断法:是一种测试方法,可以这种测试方法来了解算法哪里出了问题,这通常指导出如何最好地改进算法效果
这种诊断法的执行和实现需要花费时间,但这时间花的是非常值得的。
评估假设
当我们确定学习算法的参数时,我们考虑的是选择参数,来使训练误差最小化,有人认为,得到一个很小的训练误差一定是一件好事,但我们已经知道,仅仅是因为这个假设具有很小的训练误差,并不能说明它一定是一个好的假设,比如过拟合的情况,那么,如何判断一个假设是否是过拟合呢?
对于简单的模型,我们可以直接画出假设函数,然后观察,但通常情况下,特征其实并不止一个,当特征多的时候,通常画假设函数来观察,就变得很难甚至不可能了。因为需要其它方法。
对于一组数据集,我们需要将数据分成两部分,第一部分将成为训练集,第二部分将成为测试集,按照7:3的比例,假定训练集数量为\(m\),而测试集数量为\(m_{test}\),但如果数据不是随机排列的,最好还是打乱顺序,或者使用一种随机的顺序构建新数据。
训练/测试过程
对于线性回归
- 对训练集进行学习得到参数\(\theta\)(最小化训练误差\(J(\theta)\))
- 计算测试集误差\(J_{test}(\theta) =\frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_\theta(x_{test}^{(i)})-y_{test}^{(i)})^2\)
同理,对于逻辑回归:
从训练集训练参数\(\theta\)
计算测试集误差\(J_{test}(\theta)=-\frac{1}{m_{test}}\sum_{i=1}^{m_{test}}y_{test}^{(i)}\log h_\theta(x_{test}^{(i)})+(1-y_{test}^{(i)})\log (1-h_\theta(x_{test}^{(i)}))\)
另一种形式的测试度量,叫做错误分类(也被称为0/1分类错误)
\(err(h_\theta(x),y)=\left\{ \begin{aligned} &1 \ ,(h_\theta(x) \ge 0.5,y=0 或h_\theta<0.5,y=1) \\ &0 \ ,(其它) \end{aligned} \right.\)
\(test\ error=\frac{1}{m_{test}}\sum_{i=1}^{m_{test}}err(h_\theta(x_{test}^{(i)}),y^{(i)})\)
模型选择和训练/验证/测试集
模型选择:对于一个数据集最合适的多项式次数、怎样选用正确的特征来构造学习算法、如何选择学习算法中的正则化参数\(\lambda\)等,这类问题叫做模型选择问题
模型选择:
1.\(h_\theta(x)=\theta_0+\theta_1x\) (d=1)
2.\(h_\theta(x)=\theta_0+\theta_1x+\theta_2x^2\) (d=2)
3.\(h_\theta(x)=\theta_0+\theta_1x+\cdots+\theta_3x^3\) (d=3)
\(\cdots\) (\(\cdots\))
10.\(h_\theta(x)=\theta_0+\theta_1x+\cdots+\theta_{10}x^{10}\) (d=10)
(d = 多项式次数(dgree of polynomial))
具体地说,比如想要选择一个模型,就是选择一个多项式次数,从这10个模型中选择一个,拟合这个模型并估计这个模型对新样本的泛化能力,则可以:
首先选择第一个模型,然后最小化训练误差,这样就会得到一个参数向量\(\theta^{(1)}\),然后选择第二个模型,最小化训练误差,再得到一个参数向量\(\theta^{(2)}\),依次类推,直到\(\theta^{(10)}\),再求得\(J_{test}(\theta^{(1)})\),\(J_{test}^{(2)}\),\(\cdots\),\(J_{test}^{(10)}\),从这些模型中选出最好的一个,假设d=5时最好,则:
选择\(\theta_0+\cdots+\theta_5x^5\)
那么,该如何评估这个模型的泛化能力?可以用\(J_{test}(\theta^{(5)})\)
但这样也会有一个问题:因为对于参数\(d\),我们是在测试集上拟合得出,同时也是在测试集上进行评估,这样就不公平了(就好比测试集在一场比赛中,既当选手,又当裁判)。
假设评估
为了解决模型选择出现的问题?我们通常会采用如下的方法来评估一个假设:
给定一个数据集,不再将它分成训练集和测试集,而是把它分为三个部分,第一部分和之前一样,作为训练集,然后第二部分称为交叉验证集(Cross validation set(cv), 最后一部分称为测试集,这三部分比例是:\(m:m_{cv}:m_{test}=6:2:2\),这些比值可以稍微调整,但这种分法是最典型的比例。
训练/验证/测试错误
训练错误:\(J_{train}(\theta)=\frac{1}{2m} \sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2\)
交叉验证错误:\(J_{cv}(\theta)=\frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}}(h_\theta(x_{cv}^{(i)})-y_{cv}^{(i)})^2\)
测试错误:\(J_{test}(\theta)=\frac{1}{2m_{test}}\sum_{i=1}^{m_{test}}(h_\theta(x_{test}^{(i)})-y_{test}^{(i)})^2\)
再针对上述的模型选择问题,我们要做的是,用验证集或者说是交叉验证集来选择模型,而不是用原来的测试集,具体来说,首先,我们要选择第一个模型,然后最小化代价函数,得到对应的参数\(\theta^{(1)}\),同理计算出\(\theta^{(2)},\cdots,\theta^{(10)}\),然后在交叉验证集来测试,然后计算出\(J_{cv}(\theta^{(1)}),J(\theta^{(2)}),\cdots,J(\theta^{(10)})\),根据在交叉验证集上的误差,选择最佳模型,假设四次多项式对应的误差验证误差最小(d=4),那么在这种情况下,然后再用\(J_{test}(\theta^{(4)})\)来估计模型的泛化误差。
诊断偏差和方差
偏差/方差
如图,对于几种拟合情况,分别对应偏差和方差情况如图:
具体来说,我们沿用之前所使用的训练误差和验证误差的定义 ,绘制出误差随\(d\)的变化曲线如图
对于训练误差,随着\(d\)的增加,是趋于下降的;
对于验证误差,随着\(d\)的增加,是先减少后增大的
具体来说,假设我们得出了一个学习算法,但这个算法并没有表现的像我们希望的那么好,则应该如何判断出现的是高偏差问题还是高方差问题。
对应于上图中,如果是拐点左边的,\(d\)较小时,则属于高偏差问题;如果是拐点右边的,\(d\)较大,则属于高方差问题
偏差(欠拟合):\(J_{train}(\theta)\)较大,\(J_{vc}(\theta)\)也大
方差(过拟合):\(J_{train}(\theta)\)较小,\(J_{vc}(\theta)\)较大
正则化和偏差/方差
对于正则化线性回归中,假设:
\(h_\theta(x)=\theta_0+\theta_1x+\theta_2x^2+\theta_3x^3+\theta_4x^4\)
\(J(\theta)=\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2+\frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2\)

选择正则化参数\(\lambda\)
假设在使用正则化的情形中,定义\(J_{train}(\theta)=\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2\)为另一种不同的形式,与此类似,定义\(J_{cv}(\theta),J_{test}(\theta)\)
然后:
1.尝试\(\lambda=0\),然后求出\(\min J(\theta)\)对应的\(\theta^{(1)}\),然后使用交叉验证集来进行评价
2.尝试\(\lambda=0.01\),同理
3.尝试\(\lambda=0.02,同理\)
4.尝试\(\lambda=0.04\),同理
5.尝试\(\lambda=0.08\),同理
\(\cdots\)
12.尝试\(\lambda=10(10.24 \approx10)\),同理
然后选择最佳\(J_cv(\theta^{(i)})\)对应的\(\theta^{(i)}\)
最后,计算它在测试集上的表现\(J_{test}(\theta^{(i)})\)
对于各种误差随\(\lambda\)变化关系,如下图
学习曲线
为了绘制一条学习曲线,我们通常先绘制出\(J_{train}\)或\(J_{cv}\),要将其绘制一个关于参数\(m\)的函数。
如图,假设只有一个训练样本,并且假设用二次函数来拟合,由于只有一个样本,拟合的结果明显会很好,只要用二次函数拟合,对于一个目标训练样本,其误差一定为0,如果有两个样本,二次也能很好的拟合,如果三个样本,也一样,当样本数据更大,如四个时,二次函数就不能很好的拟合了,当样本起来越多时,拟合效果也会渐渐变差。
总结一下,当训练样本容量m很小的时候,训练误差也会很小,随着训练集容量的增大,平均训练误差也在增大。如图:
而对于交叉验证集的情况,如图:
高偏差
假如假设出现了高偏差问题,则当训练样本逐渐增大时,误差变化可能如图所示:
对于交叉验证集误差,随着样本数量增加,误差减小,当样本数量增大到某个值时,就会找到那条最有可能拟合数据的线,并且即使再增加样本数量,效果还是相差不大;
对于训练集误差,在高偏差情况下,训练误差会逐渐增大,最后接近交叉验证误差,这是因为参数比较少,又有很多数据,当样本数量较大时,二种误差就会非常接近
结论:如果一个学习算法有高偏差,则随着我们增加训练样本,交叉验证误差不会明显下降了,基本变成平的了,如果处于高偏差情况下,则选用更多的训练数据对于改善算法表现无益。
高方差
当学习算法出现高方差时,则当训练样本逐渐增大时,误差变化可能如图所示:
对于训练误差,随着训练集数据增加,可能仍然会过拟合,但对数据的拟合变得更加困难了,所以随着训练集样本容量的增大,误差也会随之增大,但总的来说,还是相对较小的;
对于交叉验证误差,在高方差情况下,由于函数的过拟合,因此交叉验证误差会一直都很大,
总结:如果一个算法有高方差,则随着我们增大训练集的样本数,训练误差会越来越大,验证误差会越来越小,因此,使用更多的训练数据,对于高方差情况下,对改进算法是有帮助的,同样对于知道算法是否处理高方差情况下,也是有用的。
决定接下来做什么
回到最开始的调试机器学习算法中,如何判断对于各个方法的选择,哪些是有效的呢?
- 获取更多了训练样本 (可用于解决高方差问题)
- 尝试更小的特征集 (可用于解决高方差问题)
- 尝试更多的特征 (可用于解决高偏差问题)
- 尝试增加多项式特征 (可用于解决高偏差问题)
- 尝试减小\(\lambda\) (可用于解决高偏差问题)
- 尝试增大\(\lambda\) (可用于解决高方差问题)
神经网络和过拟合
对于小的、简单的神经网络(参数更少,更容易欠拟合),计算量较小
对于大的、复杂的神经网络(参数更多,更容易过拟合),计算量很大,使用正则化项\(\lambda\)来解决过拟合