0%

Part1-机器学习应用中的建议

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\)

image-20210712151243248
image-20210712151243248

选择正则化参数\(\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\)来解决过拟合