吴恩达机器学习作业翻译5——bias vs variance

程序设计练习5:正则化线性回归和偏差vs方差

介绍

    在这个练习中,你将实现正则化线性回归并用它来研究具有不同偏差方差属性的模型。在开始这个练习之前,我们强烈建议你观看视频讲座并完成相关主题的复习问题。

    要开始练习,你需要下载起始代码并将其内容解压缩到你希望完成练习的目录中。如果需要,请在开始本练习之前使用Octave/MATLAB中的cd命令更改到此目录。

    你也可以在课程网站的“环境设置说明”中找到安装Octave/MATLAB的说明。

本练习中包含的文件

ex5.m - 指导你完成本次练习的Octave/MATLAB脚本
ex5data1.mat - 数据集
submit.m - 提交作业的脚本
featureNormalize.m - 特征归一化函数
fmincg.m - 函数最小化例程(类似于fminunc)
plotFit.m - 绘制多项式拟合
trainLinearReg.m - 用你的代价函数训练线性回归
[*] linearRegCostFunction.m - 正则化线性回归代价函数
[*] learningCurve.m - 生成学习曲线
[*] polyFeatures.m - 将数据映射到多项式特征空间
[*] validationCurve.m - 生成交叉验证曲线

* 表示你要完成的文件

    在整个练习中,你将使用ex5.m脚本。这些脚本为后面的问题设置数据集,并调用你将要编写的函数。你无需修改它们两个,你只需按照本作业中的说明修改其他文件中的功能。

在哪里寻求帮助

    本课程的练习使用非常适合数值计算的高级编程语言Octave或MATLAB。如果你没有安装Octave或MATLAB,请参阅课程网站上“环境设置说明”中的安装说明。

    在Octave/MATLAB命令行中输入help紧跟函数名称会显示内建的函数说明。比如输入help plot会显示绘图函数的帮助信息。更多Octave和MATLAB的函数说明请在Octave官网MATLAB官网查阅。

    我们也非常鼓励使用在线讨论与其他学生讨论练习。但是,不要查看任何源代码或与他人共享源代码。


1、正则化线性回归

    在练习的前半部分,你将使用水库水位的变化实现正则化线性回归来预测大坝的出水量。在下半部分中,你将对调试学习算法进行一些诊断,并检查偏差vs方差的影响。

    提供的ex5.m脚本将指导你完成本次练习。

1.1 可视化数据集

    我们将从可视化包含水位变化(x)和流出大坝的水量(y)的历史记录的数据集开始。

    这个数据集分为三个部分:

  • 你的模型将要学习的训练集:X, y
  • 确定正则化参数的交叉验证集:Xval, yval
  • 用于评估性能的测试集。这些是你的模型在训练期间不知道的“不可见”样本:Xtest、ytest

    然后ex5.m将绘制训练集(图1)。在接下来的部分中,你将实现线性回归,并使用它将直线拟合到数据中,并绘制学习曲线。在此之后,你将实现多项式回归,以便更好地匹配数据。


Figure 1: Data

1.2 正则化线性回归代价函数

    回顾一下,正则化线性回归代价函数如下:

    其中λ是一个正则化参数,它控制正则化程度(因此,有助于防止过度拟合)。正则化项对总成本J进行了惩罚。随着模型参数$θ_j$的大小增加,惩罚也增加。 请注意,你不应该将$θ_0$项正则化。 (在Octave/MATLAB中,$θ_0$项表示为theta(1),因为Octave/MATLAB中的索引从1开始)。

    你现在应该完成linearRegCostFunction.m中的代码。你的任务是写一个函数来计算正则化线性回归代价函数。如果可能的话,试着向量化你的代码并且避免写循环。当你完成之后,ex5.m会使用初始化的theta([1; 1])调用你的函数。你应该期望输出值为303.993。

            ==你现在应该提交答案==

1.3 正则化线性回归梯度

    相应地,$θ_j$的正则化线性回归成本的偏导数定义为

    在linearRegCostFunction.m中添加代码来计算梯度,并在grad变量中返回它。当你完成后,ex5.m将会使用初始化的theta([1; 1])调用你的梯度函数。你应该期望看到[-15.30; 598.250]的梯度。

            ==你现在应该提交答案==

1.4 拟合线性回归

    一旦你的代价函数和梯度函数正确运行之后,ex5.m接下来会运行trainLinearReg.m中的代码来计算θ的最优值。该训练函数使用fmincg优化代价函数。

    在这部分中,我们设置正则化参数λ为0。因为我们目前线性回归的实现是尝试拟合一个2维的θ,正则化对于如此低维度的θ将不会非常有用。在练习的后面部分,你将使用带正则化的多项式回归。

    最后,ex5.m脚本应该绘制最拟合的直线,结果如图2所示。最佳拟合线告诉我们该模型不是很适合数据集,因为数据具有非线性模式。 虽然如图所示可视化最佳拟合是调试学习算法的一种可能方法,但是可视化数据和模型并不总是那么容易。 在下一节中,你将实现一个函数来生成学习曲线,这些曲线可以帮助你调试学习算法,即使数据不容易可视化。


Figure 2: Linear Fit

2、偏差-方差

    机器学习中的一个重要概念是偏差 – 方差权衡。 具有高偏差的模型对于数据来说不够复杂并且倾向于拟合,而具有高方差的模型过度拟合训练数据。

    在本练习的这一部分中,你将在学习曲线上绘制训练和测试误差,以诊断偏差-方差问题。

2.1 学习曲线

    你现在将完成生成用于调试学习算法曲线的代码。回想一下,学习曲线将训练和交叉验证错误绘制为训练集大小的函数。 你的工作是填写learningCurve.m,以便它返回训练集和交叉验证集的误差向量。

    为绘制学习曲线,我们需要不同训练集大小的训练和交叉验证集误差。 要获得不同的训练集大小,你应该使用原始训练集X的不同子集。具体来说,对于训练集大小为i,你应该使用前面的第i个示例(即X(1:i,:)和y(1:i))。

    你可以使用trainLinearReg函数找到θ参数。注意,lambda是作为参数传递给learningCurve函数的。在学习到θ参数之后,你应该在训练集和交叉验证集上计算误差。回顾一下对于一个数据集的训练误差:

    特别要注意的是,训练误差不包括正则化项。 计算训练误差的一种方法是使用现有的成本函数,并仅在使用它来计算训练误差和交叉验证误差时将λ设置为0。 在计算训练集误差时,请确保在训练子集上计算它(即X(1:n,:)和y(1:n))(而不是整个训练集)。 但是,对于交叉验证错误,你应该在整个交叉验证集上计算它。 你应该将计算出的错误存储在向量error_train和error_val中。

    当你完成后,ex5.m将打印学习曲线并生成类似于图3的图。


Figure 3: Linear regression learning curve

            ==你现在应该提交答案==

    在图3中可以观察到,当训练示例的数量增加时,训练错误和交叉验证错误都很高。这反映了模型中的一个高偏差问题——线性回归模型过于简单,无法很好地拟合我们的数据集。在下一节中,你将实现多项式回归,以便为该数据集更好地拟合模型。

3、多项式回归

    我们线性模型的问题是它对于数据来说太简单了并导致欠拟合(高偏差)。在练习的这一部分,你会通过添加更多特性来解决这个问题。

    对于使用多项式回归,我们的假设形式为:

    注意,通过定义$x_1$ = $(waterLevel)$$x_2$ = $(waterLevel)^2$
,…,$x_p$ = $(waterLevel)^p$ ,我们得到一个线性回归模型,其中特征是原始(waterLevel)的各种幂。

    现在你将在数据集中使用现有特征x的更高次幂添加更多的特征项。这部分你的任务是完成polyFeatures.m的代码,该函数将大小为m×1的原始训练集X映射到其更高的幂。具体地,当大小为m×1的训练集X被传递到函数中时,函数应返回am×p矩阵X_poly,其中第一列包含原始值X,第二列包含X的2次幂,第三列包含X的3次幂,以此列推。注意,这个函数中你不需要考虑X的0次幂。

    现在你有一个函数可以将特征映射到更高的维度,并且ex5.m的第6部分会将它应用到训练集、测试集合交叉验证集上(截至目前还没使用过)。

            ==你现在应该提交答案==

3.1 学习多项式回归

    在你完成polyFeatures.m之后,ex5.m脚本将继续使用线性回归成本函数训练多项式回归。请记住,即使我们在特征向量中有多项式项,我们仍然在解决线性回归优化问题。多项式项只是变成了我们可以用于线性回归的特征。我们使用的是与在本练习的前一部分中编写的相同的成本函数和梯度。

    对于这部分练习,你将使用一个8次多项式。事实证明,如果我们直接对预测数据进行培训,那么由于特征会严重缩放,因此效果不佳(例如:一个x=40的样本会有一个特征项$x_8$= $40^8$= 6.5 * $10^{12}$)。因此,需要使用特征规范化。

    在为多项式回归学习θ参数之前,ex5.m会先调用featureNormalize并且规范化训练集的特征,分别存储mu和参数sigma。我们已经为你实现了这个功能,并且和第一个练习的函数相同。

    在学习参数θ之后,你应该看到为λ= 0的多项式回归生成的两个图(图4,5)。


Figure 4: Polynomial fit, λ=0


Figure 5: Polynomial learning curve, λ = 0

    从图4中,你应该看到多项式拟合能够很好地跟踪数据点—因此,获得了较低的训练误差。然而,多项式拟合是非常复杂的,甚至在极端情况下下降。这说明多项式回归模型对训练数据拟合过度,不能很好地推广。

    为了更好地理解非正则化(λ= 0)模型的问题,你可以看到学习曲线(图5)显示了低训练误差较低但交叉验证误差较高的相同效果。 训练和交叉验证错误之间存在差距,表明存在高方差问题。

    克服过度拟合(高方差)问题的一种方法是在模型中添加正则化。在下一节中,你会尝试不同的λ参数,看看正则化会导致一个更好的模型。

3.2 可选(不评分)练习:调整正则化参数

    在本节中,你将观察正则化参数如何影响正则化多项式回归的偏差-方差。你应该现在修改ex5.m中的lambda参数。并尝试λ=1,100。对于每个值,脚本都应该生成一个多项式拟合数据,并生成一条学习曲线。

    对于λ=1,你应该看到一个多项式拟合,它很好地跟随数据趋势(图6)和一个学习曲线(图7),表明交叉验证和训练误差都收敛到一个相对较低的值。 这表明λ=1正则化多项式回归模型没有高偏差或高方差问题。 实际上,它在偏差和方差之间实现了良好的平衡。

    对于λ=100,你应该看到不符合数据的多项式拟合(图8)。在这种情况下,正则化过多,模型无法拟合训练数据。

            ==可选练习不需要提交作业==


Figure 6: Polynomial fit, λ = 1


Figure 7: Polynomial learning curve, λ = 1


Figure 8: Polynomial fit, λ = 100

3.3 使用交叉验证机选择λ

    前面部分的练习,你观察到的值λ可以在培训和交叉验证集上显著影响正规化多项式回归的结果。特别是,一个模型没有正规化(λ=0)适合训练集,但不能泛化。相反,具有过多正则化(λ= 100)的模型不适合训练集和测试集。 λ的良好选择(例如,λ= 1)可以提供对数据的良好拟合。

    在本节中,你将实现一个自动方法来选择λ参数。 具体而言,你将使用交叉验证集来评估每个λ值的好坏程度。 在使用交叉验证集选择最佳λ值之后,我们可以在测试集上评估模型,以估计模型在实际看不见的数据上的表现。

    你的任务是完成validationCurve.m中的代码。 具体来说,你应该使用trainLinearReg函数来使用不同的λ值训练模型,并计算训练误差和交叉验证误差。 你应该在以下范围内尝试λ:{0,0.001,0.003,0.01,0.03,0.1,0.3,1,3,10}。


Figure 9: Selecting λ using a cross validation set

    完成代码后,ex5.m的下一部分将运行你可以绘制交叉验证曲线误差的函数。你可以选择要使用的λ参数。 你应该看到类似于图9的图。在此图中,我们可以看到λ的最佳值约为3。由于数据集的训练和验证分割中的随机性,交叉验证误差有时可能低于训练误差。

            ==你现在可以提交答案==

3.4 可选(不评分)练习:计算测试集误差

    在本练习的前一部分中,你实现了代码来计算正则化参数λ的各种值的交叉验证错误。 但是,为了更好地指示模型在现实世界中的性能,重要的是评估测试集上的“最终”模型,该模型未在训练集的任何部分中使用(也就是说,它既不用于选择λ参数,也不学习模型参数θ)。

    对于本可选(不评分)练习,你应该使用你发现的最佳λ计算测试误差。在我们的交叉验证中,我们获得了λ=3的测试误差3.8599。

            ==可选练习不需要提交作业==

3.5 可选(不评分)练习:用随机选择的样本绘制学习曲线

    在实践中,特别是对于小型训练集,当你绘制学习曲线以调试算法时,通常有助于对多组随机选择的示例进行平均以确定训练误差和交叉验证误差。

    具体而言,要确定i个样本的训练误差和交叉验证误差,你应首先从训练集中随机选择i个样本,并从交叉验证集中随机选择i个样本。 然后,你将使用随机选择的训练集学习参数θ,并在随机选择的训练集和交叉验证集上评估参数θ。 然后应重复上述步骤多次(比如50),并且应使用平均误差来确定i个样本的训练误差和交叉验证误差。

    对于此可选(不评分)练习,你应该实施上述策略来计算学习曲线。 作为参考,图10示出了我们针对λ= 0.01的多项式回归获得的学习曲线。 由于随机选择了样本,你的数字可能略有不同。


Figure 10: Optional (ungraded) exercise: Learning curve with randomly
selected examples

提交和评分

    在完成任务的各个模块后,请务必使用提交系统向我们的服务器提交你的作业。以下是这个练习的每个部分如何得分的细则。

    你可以多次提交,但我们只考虑最高分。

点个赞呗:程序员虾说 » 吴恩达机器学习作业翻译5——bias vs variance

赞 (6) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

请作者喝杯咖啡~

支付宝扫一扫打赏

微信扫一扫打赏