10.应用机器学习的建议

10 应用机器学习的建议

10.1 决定下步做什么

当我们想要改进一种算法的效果时,我们该做什么样的尝试?哪些是有意义的呢?

我们通常可以在以下几种方向进行尝试:1. 获取更多的训练数据 2. 尝试更少特征 3. 尝试更多特征 4. 尝试添加多项式特征 5. 减小$\lambda$ 6. 增大$\lambda$.

image-20250206195003818

接下来将介绍一些诊断法,让我们清楚如何选择更有效的方法。节省时间

机器学习诊断法的定义:

image-20250206195351622

10.2 评估一个假设

当代价函数很小时,不一定这个假设就是好的,可能是过拟合。

那么我们如何判断是否发生了过拟合呢?当特征数较少时,我们可以画图来观察。当特征数较多时,我们可以划分出训练集和测试集

当数据不是随机分布的,我们最好先打乱,或者随机选择70%数据作为训练集,剩下的30%作为测试集。当数据是随机分布的,可以选择前70%数据作为训练集,剩下的30%作为测试集。

image-20250206200353378

训练的过程大致如下:

1.对于回归问题。例如线性回归。先使用训练集进行训练(最小化代价函数,学习参数$\theta$),再使用测试集计算测试误差:

image-20250206201409259

2.对于分类问题。例如逻辑回归。过程同上,只是代价函数不同:

image-20250206201511718

还有一种简单的测试误差,叫做错分率(0/1错分率):分类预测结果$h_\theta$(x)错误,则$err$值为1;如果预测正确,则$err$值为0. 整体的测试误差为所有$err$的均值.

image-20250206201634983

10.3 模型选择 和 训练/验证/测试集

产生过拟合的一个原因是:我们在训练集上训练得到参数$\theta$,得到的训练误差,通常不能作为对实际泛化误差的一个好的估测。

当需要确定最合适的多项式次数,那么怎样选用正确的特征来构造学习算法;或者当需要选择学习算法中正则化参数$\lambda$,这类问题被叫做模型选择问题。

假设针对$x$有10个模型:一次多项式到十次多项式。对于每个多项式,在训练集上训练出$\theta$。然后在测试集上计算误差,选择最小的$J_{test}(\theta^{(i)})$. 因此选择d=5这个模型。

image-20250206204714973

但这里有个问题:我们选的这个模型,就是能够最好地拟合测试集的参数d的值及多项式的度。因此,再使用同样的测试集来评价假设,显然很不公平,很可能导致过拟合。说白了由于模型选择的加入,原来的测试集也被用来拟合参数而非真正的测试假设函数的误差。

所以,我们将数据集分为6:2:2三部分,分别为训练集、验证集、测试集。

image-20250206204753411

同样我们可以得到在每个集合上误差计算公式:

image-20250206204814550

现在我们是用 验证集计算误差,分别得到$ J_{cv}(θ^{(1)}),…J_{cv}(θ^{(10)})$,发现 $J_{cv}(θ^{(4)}) $的值最小,因此选择 d=4 这个模型,最后在测试集上进行预测,能得到一个更理想的泛化误差。

image-20250206211043912

总结一句话,测试集不能参与调参(不能参与选最终模型)就完了。

10.4 诊断偏差与方差

若我们的学习算法表现不好,无非是偏差过大或者是方差过大。即欠拟合或过拟合。弄清楚是什么问题有助于我们来改进学习算法。

偏差bias大,为欠拟合underfitting;方差variance大,为过拟合overfitting.

image-20250207195754961

当我们使用不同次数的多项式去拟合的时候,根据训练误差和验证误差的定义,我们可以画出训练误差、验证误差随多项式次数$d$的变化曲线。随着$d$的增大,会更好地拟合训练数据,$J_{train}(\theta)$不断下降。当$d$很大时,可能出现过拟合,$J_{cv}(\theta)$也很大;当$d$在某个合适值的时候,$J_{cv}(\theta)$值最小。

image-20250207193909039

如何区分是高偏差(欠拟合)or 高方差(过拟合)?

曲线左侧区域为高偏差(欠拟合),$J_{train}(\theta)$很高,$J_{cv}(\theta)\approx J_{train}(\theta)$. 曲线右侧区域为高方差(过拟合),$J_{train}(\theta)$很小,$J_{cv}(\theta)>> J_{train}(\theta)$

image-20250207195054796

10.5 正则化 和 偏差/方差

接下来讨论正则化项对偏差/方差的影响。

考虑正则化的线性回归模型。当我们要拟合一个多项式时,若$\lambda$的值很大,则参数$\theta$会被惩罚很重,使$\theta \approx 0$, $h_\theta(x)=\theta_0$变为一条直线,高偏差(欠拟合)。若$\lambda$的值很小,正则项不起作用,会得到高方差(过拟合)。

image-20250207201307104

那么如何选择出合适的正则化参数$\lambda$呢?

这里我们定义在训练集、验证集、测试集上的损失函数时,不考虑$\lambda$(为了比较$\lambda$对$\theta$的影响)。训练时用的是$J$(包含正则化项)来求$\theta$,而$J_{train}$和$J_{cv}$只是用来画线说明问题.

image-20250207204707302

我们可以按照步长两倍的方式递增$\lambda$,针对每个$\lambda$最小化代价函数$J(\theta)$, 训练出参数向量$\theta$。然后分别计算对应的$J_{cv}(\theta)$,得到最小的$J_{cv}(\theta^{(5)})$。然后在 test 集合上进行测试。

image-20250207202658411

我们画出$J_{train}(\theta)、J_{cv}(\theta)$随$\lambda$的变化曲线。当$\lambda$小时,正则化程度弱,很容易出现高次多项式,$J_{train}(\theta)$会很小;当$\lambda$大时,正则化程度强,出现欠拟合,$J_{train}(\theta)$会很大。当$\lambda$小时,很容易出现过拟合,$J_{cv}(\theta)$会很大;当$\lambda$大时,正则化程度强,出现欠拟合,$J_{cv}(\theta)$会很大。

image-20250207203850169

10.6 学习曲线

学习曲线可以用于检查学习算法运作是否正常、改进算法表现

m表示训练样本的个数。1.训练误差:当m=3时,人为减少训练数据个数,只用假设拟合这三个训练样本,计算训练误差。当训练样本很少的时候,很容易把训练集拟合到很好。当m增大时,想把每个训练样本都拟合很好会变得困难,所以训练误差会增大。2.验证误差:数据越多,越能获得更好地泛化表现,越能拟合出合适的假设。所以验证误差会下降。

image-20250207212943967

我们来看**高偏差(欠拟合)**的情况:假设使用一次函数来进行拟合。1.训练集误差:当m小时,很容易拟合的很好,$J_{train}(\theta)$很小;当m大时,欠拟合,更难把训练数据拟合很好了,$J_{train}(\theta)$会变大。2.验证集误差:m小时,表现当然不好;随着m增大到某值,几乎拟合出了最佳直线,即使继续增大m,还是会得到一条差不多的直线,此时$J_{cv}(\theta)$曲线几乎水平不再变化。最后,两条曲线会非常接近,因为当参数很少又有很多数据时,训练误差和验证误差会很接近。

观察曲线得知:高偏差情况下$J_{train}(\theta)、J_{cv}(\theta)$都很高,并且更多的训练样本并不能改善。高偏差情形:模型过于简单,数据再多也于事无补。

image-20250207211143411

再来看**高方差(过拟合)**的情况:假设使用100次函数来进行拟合。1.训练集误差:当m小时,很容易拟合的很好,$J_{train}(\theta)$很小;当m大时,更难把训练数据拟合很好了,$J_{train}(\theta)$会变大。2.验证集误差:在高方差情况下假设函数对数据过拟合,因此验证集误差会一直很大。

观察曲线得知:高方差情况下$J_{train}(\theta)<J_{cv}(\theta)$,并且有一定的差距。这时更多的训练样本是能够改善的。

image-20250207212338888

10.7 接下来做什么

每种解决方案对应的问题如下:

image-20250207215928026

小的神经网络,计算量小,但容易欠拟合。大型神经网络。计算量大,可以用正则化项来修正过拟合。如果不知道选择几层hidden layer,可以将数据分为训练集、验证集、测试集之后,比较验证损失$J_{cv}(\theta)$来决定。

image-20250207220031335

10.应用机器学习的建议
http://example.com/2025/02/16/10 应用机器学习的建议/
作者
Dongxuan Liu
发布于
2025年2月16日
许可协议