在跳转到代码进行调试之前,请执行以下几个步骤。
让我们想象一下,这是一个美好的下午,你已经为你的模型写了一个更好的算法,你希望它会带给你正确的结果。此时,如果您在预测中发现了一些非常错误的信息,那么您就是在正确的位置。
在进入解决方案之前,让我们看一下将要使用的一些术语。
训练集:您为算法提供输入,以便训练它并找到最适合您的数据。
交叉验证集(CV):使用您的训练示例预测模型中错误的数据集。
测试集:这是您要在其中测试模型并找出其准确性的数据集。
一般来说,如果你获得训练集,你可以将上述训练集分为3个部分,其中60%用于训练,20%用于验证集,20%用于测试集(这只是一种划分方法,你可以选择这样做或者不这样做)。
现在,根据您选择的数据集,您输入的功能、正则化参数等,您可能遇到以下情况之一:
高偏差(低配):如果你的假设在训练集上表现不佳且未能概括新的例子,那么它就会遭受高度偏见。
高方差(过度拟合):如果您的假设在训练集中表现良好,但对于验证或任何新示例表现不佳,就会受到高方差的影响。
线性回归的典型偏差- 方差权衡(假设我们预测房价只有一个特征,如房子的大小)如下图所示。绘制的图形仅沿X轴显示X(训练示例)的一个特征,沿y轴输出(训练示例)。图(a)显示假设与训练集的拟合程度,但由于角度大,因此无法概括新的例子。图(c)表明该假设不适合训练数据集,也未能概括。图(b)显示了最适合我们的训练集以及验证集的最佳拟合,因为它随着房屋大小的增加而缓慢增长。
如果你已经理解了上述问题,那就让我们处理它们,看看如何解决它们。
如何解决高方差:通过使用正则化或通过增加训练样本的数量可以解决高方差。正则化确保假设的参数(最佳拟合的θ)低,以便可以避免角度,并且我们得到一个概括得很好的假设。
下图显示了房屋价格与房屋面积的成本函数,并采用了正则化。蓝色曲线显示假设的过度拟合,该假设对训练集表现良好但未能概括。另一方面,品红色曲线显示正常化的作用。它对于训练和新示例都表现良好。
如果增加训练样例的数量,曲线会发现很难采用角度形状,因此可以很好地推广。
如何解决高偏差:可以通过增加训练示例的特征数量来解决高偏差,例如在房子的大小上增加多项式特征,或引入更多特征,如房屋位置、BHK数量等等。这样可以防止曲线直线拟合,从而在训练和新示例中表现良好。
下图给出了不同的高偏差模型。
注意:
在高偏差情况下,增加训练集不会有太大的帮助。
应该避免使正则化参数(lambda)的值过高,因为它会对我们的θ参数造成严重的损失,并导致欠拟合。
现在,如果您想知道如何在我的代码中实现这些概念,那么您真的需要了解学习曲线!
学习曲线
为了理解学习曲线,让我们看一下典型的高偏差曲线并对其进行分析。
上图显示了仅具有一个特征的线性回归的高偏差学习曲线。学习曲线沿y轴绘制有误差(在训练集和交叉验证中),沿x轴绘制m(训练样本的数量)。从图中可以明显看出,如果m非常小,则训练误差非常小,但验证误差(CV)非常高,因为我们没有很好地训练数据集来进行推广。随着我们增加m的值,训练误差会增加,因为直线拟合不能再对大量数据集执行,但验证误差会减小,因为我们可以比以前更好地推广它(因为它已被训练)。在进一步增加m时,训练和验证集的误差都会饱和,因为无论您输入了多少数据集,直线拟合都无法适应这么多数据集。
如何编写这个概念:让我们看看上面提到的概念的代码。我已经在Matlab / Octave环境中编写了代码,但如果我们想要学习这个概念,这不是问题。
我们运行从1到多个训练样例(m)的循环。X是包含所有训练样例的原始矩阵。Xt包含'i'个训练样例,Yt包含它们相应的输出(这里是房子的价格)。然后我们将Xt,Yt和正则化参数(lambda)传递给trainLinearReg函数,该函数返回给定数量的训练样例的最佳拟合(theta值)并将其存储在theta中。最后,我们计算“i”个训练样例的误差矩阵。error_train(i)包含“i”个训练样例的训练集中的错误。error_val(i)包含'iith'迭代的验证集中的错误。您可能会注意到,与训练集不同,我们在每次迭代时都会传递整个验证集。要计算训练集或验证集的误差,我们只需将lambda作为零传递给linearRegCostFunction即可使用cost函数。
当您同时使用错误矩阵(训练和验证)时,您应该绘制它们以使其可视化。
plot函数从1到m取值,并绘制相应数量的训练样例的error_train和error_val。实施此操作后,您将获得类似于上图所示的高偏差曲线。
对于高方差,您将得到类似于下图所示的曲线。
注意:
与高偏差情况不同,验证错误和训练错误之间存在差距。
增加训练样例或正则化参数的数量可以帮助避免高方差。
到目前为止,您可以识别是否处于高偏差或高方差状态,这是调试代码的一个良好开端。
调整正则化参数(lambda):
我想告诉你的最后一件事是关于正则化参数lambda。特别是,没有正则化(λ= 0)的模型很好地适合训练集。相反,具有过多正则化的模型不适合训练集和测试集。'λ'的良好选择可以很好地适应数据。如果你跟着我,你可以很容易地找到你模型的lambda的最佳值。我们必须做与学习曲线相同的事情,即我们必须绘制“错误”和训练样例数之间的图表。但是,这次我们必须改变参数lambda并在训练和验证集中看到相应的错误。错误即训练和验证都很低的区域将为我们提供λ的最佳值。让我们看看这个概念背后的代码。
向量lambda_vec是一个向量,包含我们将要采用的lambda的各种值,并循环它以找到训练集和validaiton集中的相应错误。让我们看一下这个概念的图表,并尝试理解它是如何工作的。
从图中可以明显看出,lambda值约为100可能是训练模型的好选择,因为此时交叉验证和训练集都具有较低的误差值。在这一点上,我们已经看到了许多可能使我们的算法表现不佳的错误,以及我们如何消除这些问题。
练习合并所有这些概念并制作一个你自己的模型。
结论
因此,学习曲线有助于纠正高偏差、高方差以及模型中的正则化参数,从而节省大量时间。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69927062/viewspace-3147340/ ,如需转载,请注明出处,否则将追究法律责任。