我们花了很多时间开发机器学习算法。但是在部署之后,如果算法表现不佳,那将是令人沮丧的。问题是如果算法没有按预期工作,下一步该怎么办。什么地方出了错?训练数据量够不够?我们是否使用了正确的功能?我们应该继续收集更多数据吗?我们可以,但那将非常耗时且昂贵。我们应该添加更多功能吗?那也可能很昂贵。往哪个方向走?如果您的机器学习算法不起作用,下一步是什么?有几种选择:获取更多训练数据非常耗时。甚至可能需要几个月的时间才能获得更多研究数据。获得更多训练功能。这也可能需要很多时间。但如果添加一些多项式特征可以工作,那就太酷了。选择一组较小的训练特征。增加正则化项,减少正则化项。那么,您接下来应该尝试哪一个?开始尝试任何事情都不是一个好主意。因为你最终可能会在无用的事情上花费太多时间。您需要先确定问题所在,然后采取相应措施。学习曲线有助于轻松发现问题,从而节省大量时间。学习曲线对于确定如何提高算法性能很有用。这对于确定算法是否存在偏差或欠拟合、方差或过拟合或两者均有帮助。学习曲线的工作原理学习曲线是成本函数的图形。在同一张图中,训练数据的成本函数和交叉验证数据的成本函数提供了对算法的重要见解。提醒一下,这是成本函数的公式:换句话说,它是预测输出减去原始输出的平方除以训练数据量的两倍。要绘制学习曲线,我们需要将这些成本函数绘制为训练数据量(m)的函数。我们不会使用所有训练数据,而是只使用训练数据的较小子集来训练数据。看下图:如果我们使用太少的数据作为训练数据,算法会完美地拟合训练数据,成本函数将返回0。上图清楚地表明,当我们只使用一个时,两个,或者三种数据算法来训练数据,我们可以用很少的数据学习得很好,而且训练成本为零或接近于零。但是,这种算法在其他数据上表现不佳。当您尝试将交叉验证数据拟合到该算法时,它很可能在交叉验证数据上表现不佳。因此,交叉验证数据的成本函数将返回非常高的值。另一方面,当我们将需要越来越多的数据来训练算法时,它将不再完美地拟合训练数据。因此,培训成本会变得更高。此外,由于该算法是在大量数据上训练的,因此它在交叉验证数据上的表现会更好,而交叉验证数据上的成本函数将返回较低的值。以下是创建学习曲线的方法。开发学习算法我将演示如何逐步绘制学习曲线。为了绘制学习曲线,我们首先需要一个机器学习算法。为简单起见,我将使用线性回归算法。首先,我们开发了一个线性回归算法。首先,导入包和数据集。我在这里使用的数据集来自AndrewNg的Coursera机器学习课程。在此数据集中,X值和y值在Excel文件中组织在单独的工作表中。提醒一下,X是我们将用来开发和训练机器学习算法的函数。y是我们需要预测的输出特征。交叉验证数据的X和y值也组织在同一Excel文件的另外两个工作表中。我在本文末尾提供了指向数据集的链接。随意下载数据集并使用它。%matplotlibinlineimportpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltfile=pd.ExcelFile('dataset.xlsx')df=pd.read_excel(file,'Xval',header=None)df.head()同理导入训练集的y值:y=pd.read_excel(file,'yval',header=None)y.head()让我们快速开发线性回归算法。(1)定义假设线性回归使用非常基本的线性方程来做出我们在学校学习的预测。公式如下:Y=C+BX对于机器学习,我们使用不同的术语。这里,“h”是假设或预测值,theta0和theta1是系数,X是输入特征。这里我们已经有了X。我们必须计算“h”并期望它与y的值相匹配。因为我们的目标是能够预测y的值。Theta0和theta1一开始是随机初始化的。我们将通过迭代不断细化theta0和theta1的值。在每次迭代中,我们将使用成本函数和梯度公式来计算更新theta值的成本(2)成本函数和梯度下降成本函数让我们了解我们的预测值与原始值有何不同输出特征。在这里,我们的输出特征是y,预测输出是“h”。所以成本函数会告诉我们“h”偏离“y”的程度。我们希望成本函数值尽可能低。这是成本函数的公式:直到成本函数最小化,我们将不断淘汰算法。在每次迭代中,我们使用梯度下降更新theta值。为了更新theta值,我们将从之前的theta值中减去梯度下降。编码的时候会更清楚。这里,m是训练数据的数量,alpha是学习率。(3)开发线性回归算法以使用上述公式开发假设和成本函数。m=len(df)defhypothesis(theta,X):returntheta[0]+theta[1]*Xdefcost_calc(theta,X,y):return(1/2*m)*np.sum((假设(theta,X)-y)**2)现在,我们将定义梯度下降来优化参数theta0和theta1。在每次迭代中,我们将更新theta值并跟踪成本函数和theta值。最后,它会为每次迭代返回一个以theta值表示的成本列表。代码非常简单。请检查这里。defgradient_descent(theta,X,y,epoch,alpha):cost=[]theta_hist=[]i=0while
