用于机器学习的梯度下降线性回归教程

随机梯度下降是机器学习中一种重要且广泛使用的算法。

在本帖中,您将了解如何通过最小化训练数据集上的误差来使用随机梯度下降为简单的线性回归模型学习系数。

阅读本文后,您将了解

  • 简单线性回归模型的形式。
  • 梯度下降与随机梯度下降的区别
  • 如何使用随机梯度下降学习简单的线性回归模型。

通过我的新书《精通机器学习算法》来启动您的项目,其中包含分步教程以及所有示例的Excel电子表格文件。

让我们开始吧。

  • 2021年2月更新:修正了预测值中的拼写错误。
Linear Regression Tutorial Using Gradient Descent for Machine Learning

用于机器学习的梯度下降线性回归教程
照片由Stig Nygaard拍摄,部分权利保留。

教程数据集

我们使用的数据集是完全虚构的。

这是原始数据。属性 x 是输入变量,y 是我们要预测的输出变量。如果我们获得更多数据,我们将只有 x 值,并且我们会对预测 y 值感兴趣。

下面是 x 与 y 的简单散点图。

Plot of the Dataset for Simple Linear Regression

用于简单线性回归的数据集图

我们可以看到 x 和 y 之间的关系有点线性。也就是说,我们可能可以在图的左下角到右上角画一条对角线来大致描述数据之间的关系。这表明对这个小数据集使用线性回归可能是合适的。

获取您的免费算法思维导图

Machine Learning Algorithms Mind Map

方便的机器学习算法思维导图样本。

我创建了一份方便的思维导图,其中包含60多种按类型组织的算法。

下载、打印并使用它。


还可以独家访问机器学习算法电子邮件迷你课程。

 

 

简单线性回归

当我们只有一个输入属性(x)并想使用线性回归时,这被称为简单线性回归。

使用简单线性回归,我们希望按如下方式建模数据

y = B0 + B1 * x

这是一条线,其中 y 是我们想要预测的输出变量,x 是我们已知的输入变量,B0 和 B1 是我们需要估计的系数。

B0 被称为截距,因为它决定了线在 y 轴上的截距。在机器学习中,我们可以称之为偏差,因为它会加到我们进行的所有预测上。B1 项被称为斜率,因为它定义了线的斜率,或者 x 在我们添加偏差之前如何转换为 y 值。

该模型被称为简单线性回归,因为它只有一个输入变量(x)。如果存在更多输入变量(例如 x1、x2 等),则称为多元回归。

随机梯度下降

梯度下降是通过沿着成本函数的梯度来最小化函数的过程。

这涉及知道成本的形式以及其导数,以便从给定点知道梯度并可以朝该方向移动,例如朝向最小值向下移动。

在机器学习中,我们可以使用一种称为随机梯度下降的类似技术来最小化模型在训练数据上的误差。

其工作原理是每个训练实例一次仅展示给模型。模型对训练实例进行预测,计算误差,并更新模型以减少下一次预测的误差。

此过程可用于查找模型中导致模型在训练数据上误差最小的系数集。每次迭代,系数(在机器学习语言中称为权重 w)都会使用以下方程进行更新

w = w – alpha * delta

其中 w 是正在优化的系数或权重,alpha 是您必须配置的学习率(例如 0.1),gradient 是模型在训练数据上归因于该权重的误差。

使用随机梯度下降进行简单线性回归

简单线性回归中使用的系数可以通过随机梯度下降找到。

线性回归是一个线性系统,系数可以通过线性代数进行解析计算。在实践中(在大多数情况下),随机梯度下降不用于计算线性回归的系数。

线性回归为学习随机梯度下降提供了一个有用的练习,随机梯度下降是机器学习算法通过最小化成本函数来使用的重要算法。

如上所述,我们的线性回归模型定义如下

y = B0 + B1 * x

梯度下降迭代 #1

让我们从两个系数的值都为 0.0 开始。

B0 = 0.0

B1 = 0.0

y = 0.0 + 0.0 * x

我们可以按如下方式计算预测误差

error = p(i) – y(i)

其中 p(i) 是我们数据集中第 i 个实例的预测值,y(i) 是数据集中第 i 个实例的第 i 个输出变量。

现在,我们可以使用我们起始系数为第一个训练实例计算 y 的预测值

x=1, y=1

p(i) = 0.0 + 0.0 * 1

p(i) = 0

使用预测输出,我们可以计算我们的误差

error = 0 – 1

error = -1

我们现在可以在梯度下降方程中使用此误差来更新权重。我们将从更新截距开始,因为它更容易。

我们可以说 B0 应该对所有误差负责。也就是说,更新权重将仅使用误差作为梯度。我们可以按如下方式计算 B0 系数的更新

B0(t+1) = B0(t) – alpha * error

其中 B0(t+1) 是我们将在下一个训练实例中使用的更新后的系数,B0(t) 是 B0 的当前值,alpha 是我们的学习率,error 是我们为训练实例计算的误差。让我们使用 0.01 的小学习率,并将值代入方程以计算 B0 的新且略有优化的值

B0(t+1) = 0.0 – 0.01 * -1.0

B0(t+1) = 0.01

现在,让我们看看更新 B1 的值。我们使用相同的方程,只是有一个小的变化。误差会根据导致它的输入进行过滤。我们可以使用以下方程更新 B1

B1(t+1) = B1(t) – alpha * error * x

其中 B1(t+1) 是更新后的系数,B1(t) 是当前版本的系数,alpha 是上面描述的相同学习率,error 是上面计算的相同误差,x 是输入值。

我们可以将我们的数字代入方程并计算 B1 的更新值

B1(t+1) = 0.0 – 0.01 * -1 * 1

B1(t+1) = 0.01

我们刚刚完成了梯度下降的第一次迭代,并将权重更新为 B0=0.01 和 B1=0.01。此过程必须对我们数据集中的其余 4 个实例重复。

一次通过训练数据集称为一个 epoch。

梯度下降迭代 #20

我们跳到后面。

您可以再重复此过程 19 次。这是训练数据暴露给模型并更新系数的 4 个完整 epoch。

这是您应该看到的 20 次迭代中所有系数值的列表

我认为 20 次迭代或 4 个 epoch 是一个不错的整数,也是一个可以停止的好地方。如果您愿意,可以继续。

您的值应该非常接近,但由于不同的电子表格程序和不同的精度,可能会略有差异。您可以将每对系数重新代入简单线性回归方程。这很有用,因为我们可以为每个训练实例计算一个预测,进而计算误差。

下图显示了随着学习过程的进行,每个系数集的误差。这是一个有用的图,因为它表明误差随着每次迭代而减小,并在最后开始有一些波动。

Linear Regression Gradient Descent Error versus Iteration

线性回归梯度下降误差与迭代次数的关系

您可以看到,我们的最终系数值为 B0=0.230897491 和 B1=0.7904386102

让我们将它们代入我们的简单线性回归模型,并为我们训练数据集中的每个点进行预测。

我们可以再次绘制数据集,并叠加这些预测(x vs y 和 x vs prediction)。通过 5 个预测值画一条线,可以让我们大致了解模型与训练数据的拟合程度。

Simple Linear Regression Model

简单线性回归模型

总结

在本帖中,您了解了简单线性回归模型以及如何使用随机梯度下降对其进行训练。

您完成了梯度下降更新规则的应用。您还学习了如何使用学习到的线性回归模型进行预测。

您对这篇帖子或随机梯度下降的简单线性回归有任何疑问吗?请留言提问,我会尽力回答。

了解机器学习算法的工作原理!

Mater Machine Learning Algorithms

几分钟内了解算法如何工作

...只需算术和简单示例

在我的新电子书中探索如何实现
精通机器学习算法

它涵盖了**10种顶级算法**的**解释**和**示例**,例如:
_线性回归_、_k-近邻_、_支持向量机_等等...

最后,揭开
机器学习算法的神秘面纱

跳过学术理论。只看结果。

查看内容

96 条关于使用梯度下降进行机器学习线性回归的回复

  1. Tadele 2016年11月10日晚上7:50 #

    上帝保佑你和你家人。你的职责非常清晰,请继续保持。

    我主耶稣保佑你的思想和你的职责。我无话可说了。

  2. effa 2016年11月15日下午2:53 #

    你解释得很清楚。非常感谢。

    • Jason Brownlee 2016年11月16日上午9:24 #

      谢谢你的美言 effa。我很高兴你觉得这篇帖子有用。

  3. sphurti 2016年11月28日上午4:46 #

    我开始对 epoch 和 iteration 感到困惑。epoch 或 iteration 是否取决于训练数据集中的观测数量?

    • sphurti 2016年11月28日上午5:06 #

      我的数据集是 (year,cost)= [(2005,40.15), (2006,49.8), (2007,60), (2008,75), (2009,83), (2010,90), (2011,111), (2012,128). (2013,128), (2014,138), (2015,160),(2016,175) 我想应用带有随机梯度下降的线性回归。我应该设置多少 epoch 或 iteration?

    • Jason Brownlee 2016年11月28日上午8:46 #

      一个 epoch 是完整遍历一次训练数据集。

      迭代可能是一个 epoch,也可能是一个训练观测值(训练数据中的一行)的更新,具体取决于上下文(训练迭代 vs 更新迭代)。

  4. Alex 2016年12月5日晚上11:13 #

    你好 Jason,我正在研究具有多个响应变量的逻辑回归的随机梯度下降,并且遇到了困难。

    我尝试使用相同的公式,但对误差项进行了不同的计算 [error=Y-(1/1+exp(-BX))]

    我已将此代入您提供的方程,但系数似乎没有收敛。我是否遗漏了什么? A

  5. Serb 2016年12月25日早上7:33 #

    嗨,Jason,

    在更新过程中,参数 m(训练示例数)在哪里?在其他教程中是这样的

    B0(t+1) = B0(t) – alpha / m * error
    B1(t+1) = B1(t) – alpha / m * error * x

    • Jason Brownlee 2016年12月26日早上7:43 #

      我不确定你的意思 Serb。上面没有“m”。

  6. Serb 2016年12月26日早上8:28 #

    是的,我看到没有 m,但它应该在那里。因为成本函数定义如下

    J(B0, B1) = 1/(2*m) * (p(i) – y(i))^2

    为了确定参数 B0 和 B1,需要使用梯度下降来最小化此函数并找到成本函数相对于 B0 和 B1 的偏导数。最后您将得到 B0 和 B1 的方程,其中有“m”。

  7. Daniel Deychakiwsky 2017年1月27日早上4:02 #

    Jason,

    您提到了这些权重更新方程

    B0(t+1) = B0(t) – alpha / m * error
    B1(t+1) = B1(t) – alpha / m * error * x

    B0 代表我们将要创建的回归线的斜率,B1 代表截距。

    在其他教程中,我看到有人(https://www.youtube.com/watch?v=JsX0D92q1EI&t=16s)将 x 乘以斜率权重更新计算,而不是像这样乘以截距

    B0(t+1) = B0(t) – alpha / m * error * x
    B1(t+1) = B1(t) – alpha / m * error

    您能否解释一下这是否不正确,或者我错在哪里了?

    • Jason Brownlee 2017年1月27日中午12:20 #

      嗨,丹尼尔,

      本文使用的更新方程基于教科书《人工智能:一种现代方法》第 18.6.1 节单变量线性回归第 718 页的方程。有关推导,请参阅此参考文献。

      我无法评论 YouTube 视频中的方程。

    • Charles M. 2017年11月14日晚上9:28 #

      嗨,丹尼尔,

      我相信您可能将随机梯度下降和批量梯度下降混淆了。

      在批量梯度下降中,您计算所有示例的总误差,然后除以示例数以得到“平均误差”。

      另一方面,在随机梯度下降中,就像本文一样,您一次处理一个示例,因此无需除以示例数来计算平均值。

      希望这有帮助。

  8. Akash 2017年2月11日晚上9:46 #

    你能否为逻辑回归写一篇类似的帖子,让我们实际看到梯度下降的一些迭代?
    谢谢。

  9. pavan 2017年2月24日晚上11:08 #

    当我尝试计算第二个示例时,我得到的数值是 .03 和 0.06,而不是图片中显示的数值……请帮助我

  10. pavan 2017年2月24日晚上11:09 #

    我的意思是,在第二次迭代中,我得到的数值是 0.03 和 0.06,而不是 0.0397 0.0694。请尽快帮助我

  11. Jenny Ischakov 2017年4月23日晚上10:47 #

    你好,收敛点在哪里?我们如何知道它就是函数的最小值点?您在计算 B0=0.230897491 和 B1=0.7904386102 处停止了计算。然后计算了预测值。您能否解释一下为什么它会停在这些 B0 B1 值上?应该是 error=0?我们如何看到它?谢谢!

    • Jason Brownlee 2017年4月24日早上5:35 #

      很好的问题。

      您可以评估每次更新后的系数,以了解模型的误差。

      然后您可以使用模型误差来确定何时停止更新模型,例如当误差水平趋于平稳并停止下降时。

      • Belal C 2017年4月26日凌晨12:51 #

        感谢 Jason 的帖子/教程!关于 Jenny 关于模型何时收敛的问题——在您显示的图中,误差似乎每迭代一次就越来越接近零(我认为我们可以说它在被最小化)。我想确认两点

        1 – 您绘制的误差是模型误差(通过评估系数并与正确值进行比较计算)对吗?

        2 – 我们经常看到绘制误差与迭代次数的图,其中误差随时间减小(http://i42.tinypic.com/dvmt6o.png);您图中的误差是否只是以不同的比例绘制?或者为什么大多数训练图都有误差从一个正数减小到零?

        非常感谢您的澄清,再次感谢您的教程!

        Belal

        • Jason Brownlee 2017年4月26日早上6:23 #

          误差是在数据上计算的,以及模型在进行预测时犯了多少错误。

  12. Vasu Sharma 2017年4月27日下午3:48 #

    非常感谢您写了这么好的帖子,我有一个关于使用 B0 和 B1 值计算 y 坐标的疑问。根据我的计算,我们使用 y=B0+B1*x (来计算预测的 y),但是考虑到 B0=0.230897491 和 B1=0.7904386102,第一个实例(x=1,y=1)的答案应该是 y(predicted)=1.0213361012 (因为 y=(0.230897491)+(0.7904386102)*1),但在您的帖子中是 0.9551001992。所以是我做错了什么还是我理解错了?
    如果我有什么遗漏,请指导我!

    • Azhaar 2017年6月15日下午3:35 #

      我也遇到了同样的问题。

      • Athif 2017年6月22日凌晨12:41 #

        B0=0.230897491 和 B1=0.7904386102 的值实际上是第 21 次迭代的值,所以是错误的。如果您查看这些值的图,您会注意到第 20 次迭代的值分别是 0.219858174 和 0.7352420252。代入这些值可以得到正确的预测(.95…)。可能是小小的笔误 🙂

  13. Yasir 2017年6月6日晚上11:02 #

    如果有人想了解更多关于简单线性回归的知识,请访问以下链接 http://yasirchoudhary.blogspot.in/2017/06/linear-regression.html?m=1

  14. Athif 2017年6月18日早上5:41 #

    非常感谢!
    终于明白了。

  15. Sonia arya 2017年6月18日晚上5:51 #

    如何找到给定训练集(x,y)的 theta 0 和 theta 1 值?这样线性回归就能完美拟合数据?

    • Jason Brownlee 2017年6月19日早上8:42 #

      除非数据是人为设计的,否则模型很少能完美拟合数据。

      如果数据可以放入内存,使用线性代数方法将提供更稳健的估计。

      模型是一种权衡。

  16. Khushi 2018年1月27日晚上11:02 #

    SGD 和反向传播是相同的吗?在将图像分类到两个类别(例如猫和狗)时,模型是否在进行线性回归?如果不是,这将属于什么分类?

    • Jason Brownlee 2018年1月28日早上8:24 #

      不,梯度下降是一种搜索算法,反向传播是估算神经网络中误差的一种方法。

  17. Eric 2018年1月29日 下午12:53 #

    布朗利博士:绝对是一个很棒的教程!我能够重现相同的结果。这个算法可以修改以处理多个参数吗?我正在尝试理解多参数的线性回归,但我找到的教程都使用 Excel 或其他工具,这些工具将实际算法黑盒化了。

  18. Ged 2018年3月19日 晚上10:27 #

    我错过了这里的导数吗?

  19. Bhagirath 2018年3月29日 上午7:41 #

    我读了这篇文章,但对于梯度下降和随机梯度下降在此特定示例中的区别不是非常清楚。您已经展示了在随机梯度下降中,我们一次取一个样本并更新系数。但在梯度下降的情况下会发生什么?

  20. Jason 2018年4月25日 上午9:48 #

    为什么您选择不平方损失函数中的距离之和?在我的课上,我们做了与您概述的几乎相同的事情,除了那一部分,以使函数可微。

  21. Nachiket Patki 2018年12月15日 上午3:30 #

    对于 b0=0.01, b1=0.01 的值,对应的 x 和 y 值是 1。当我们把它们代入线性方程时,我们得到 y_predict=0.01+0.01*1,我没有得到第一个值 0.95。我做错了什么吗?
    请告诉我

    • Jason Brownlee 2018年12月15日 上午6:15 #

      该预测是在模型使用系数 B0=0.230897491 和 B1=0.7904386102 学习之后进行的。

  22. Sudeep Pandey 2018年12月24日 上午2:54 #

    你好 Jason,
    我应该如何为我的模型确定学习率,有什么建议吗?

    • Jason Brownlee 2018年12月24日 上午5:30 #

      反复试验,在对数尺度上测试一系列值,例如 [0.1, 0.01, 0.001, …]

  23. kiran kumar reddy 2019年1月24日 上午3:09 #

    当我将 B0 和 B1 值应用于线性回归时,我得到的预测值不同。你能帮我解决这个疑问吗?

  24. Guga 2019年2月16日 上午8:54 #

    Jason,
    感谢您的帖子。它非常具有启发性。
    我想知道如何在您的示例中实现带 mini-batch 的梯度下降。在更新 B1 时,B1(t+1) = B1(t) – alpha * error * x 中的 x 的值是什么?
    仍在 mini-batch 示例中,B0 和 B1 方程中的误差会等于平方误差之和的平方根吗?
    非常感谢。

    • Jason Brownlee 2019年2月17日 上午6:29 #

      使用 batch 时,值会针对 batch/mini-batch 中的所有示例进行平均。

  25. pooja 2019年3月10日 下午4:22 #

    什么是成本函数?

    • Jason Brownlee 2019年3月11日 上午6:47 #

      它是我们用来估算模型误差并寻求在训练过程中最小化的函数。

  26. Harish Fegade 2019年6月6日 上午1:58 #

    嗨,Jason,
    当我们在线性回归中使用梯度下降时,为什么不能在 sklearn 模块中使用 alpha 学习率作为参数?它是必需的,还是背后有其他理论?

  27. Abdul Basit 2019年6月24日 晚上7:33 #

    预测值是从哪里来的?你能分解一下这个步骤:“将值代入简单线性回归模型并为训练数据集中的每个点进行预测。”
    谢谢你

  28. Anubhav Sood 2019年9月3日 上午6:47 #

    非常非常棒的文章。Jason,您的文章非常详细。非常感谢。

  29. manuela 2019年10月3日 上午3:30 #

    谢谢 Jason,您的教程非常有帮助
    我想问您以下问题
    我尝试将梯度下降用于逻辑回归,并使用了这段代码来计算准确率

    def accuracy(self, x, actual_classes, probab_threshold=0.5)
    predicted_classes = (self.predict(x) >= probab_threshold).astype(int)
    predicted_classes = predicted_classes.flatten()
    accuracy = np.mean(predicted_classes == actual_classes)
    return accuracy * 100

    我想获得用于获得此结果的混淆矩阵,因为 sklearn 的混淆矩阵给出的准确率值不同。

    • Jason Brownlee 2019年10月3日 上午6:53 #

      是的,sklearn 不使用梯度下降,它使用不同的优化算法,因此会给出不同的结果。

      • manuela 2019年10月3日 上午7:22 #

        感谢您的快速回复
        那么在这种情况下,如果我们想计算精确率和召回率,该如何做呢?
        是否有不同的方法?因为我需要将算法结果与其他机器学习分类器的结果进行比较。

        • Jason Brownlee 2019年10月3日 下午1:25 #

          您必须计算误差,例如 MAE 或 MSE 或 RMSE。

          • manuela 2019年10月3日 晚上7:02 #

            好的,非常感谢

          • Jason Brownlee 2019年10月4日 上午5:40 #

            不客气。

  30. Nikhil 2019年10月17日 下午4:51 #

    使用梯度下降进行线性回归有哪些缺点?

    • Jason Brownlee 2019年10月18日 上午5:47 #

      与最小二乘法解决方案相比,它速度慢且效率低下。

  31. Sameh 2019年11月3日 晚上11:46 #

    你好,我想知道如果我们除了 b0 和 b1 还有其他系数,比如 b2、b3 等,我们如何通过梯度下降找到它们的值?
    它会是
    B2(t+1) = B2(t) – alpha * error * x2
    B3(t+1) = B3(t) – alpha * error * x3
    等等?

    谢谢你

  32. Karan Sehgal 2019年12月31日 上午12:43 #

    嗨,Jason,

    如果我们使用具有 9 到 10 个输入的线性回归算法,那么它是使用线性代数来计算参数值,还是使用梯度下降来计算参数?

    谢谢。

    • Jason Brownlee 2019年12月31日 上午7:33 #

      使用线性代数,除非数据违反线性代数方法的期望或不适合内存。

  33. Sachin Rathi 2020年2月12日 上午11:17 #

    嗨,Jason,

    您是否有任何关于计算多元回归的标准误差和所有统计参数的全面教程?如果没有,请推荐一个好的资源。

  34. Mike Mawira 2020年2月23日 上午2:55 #

    你好 Jason。我们如何计算 20 次迭代的系数?也就是说,从第二次迭代开始,我不明白 BO 和 B1 的值是如何得出的。

  35. Karan 2020年3月5日 晚上11:23 #

    你好,先生,

    感谢这篇清晰的文章。

    我有一个疑问,请。

    为什么我们使用公式
    b0(1) = b0(0) * alpha * error

    同样,为什么我们使用

    b1(1) = b1(0) * alpha * error * x

    为什么我们乘以 x,即 b1 的输入?

    • Jason Brownlee 2020年3月6日 上午5:33 #

      此实现基于《人工智能:一种现代方法》中的描述,我认为是这样。

      您为什么想使用那个公式?

  36. Md. Abbas Ali Khan (AAK) 2020年7月8日 晚上11:26 #

    如何计算 m?

  37. Ajay 2020年7月17日 下午12:16 #

    很好,非常有帮助

  38. ANKUR SHARMA 2020年12月19日 下午5:48 #

    要为简单线性回归实现梯度下降,以下哪个在初始设置中是不需要的?
    1)。定义成本函数
    2)。斜率和截距的更新规则
    3)。斜率和截距的最佳学习率
    4)。斜率和截距的初始猜测……

    • Jason Brownlee 2020年12月20日 上午5:50 #

      这看起来像是个面试题!

      我认为是 3。

  39. Harshit 2020年12月19日 下午5:49 #

    学习率越大收敛越快是真的吗????

    梯度下降的小学习率总是最好的吗????

    • Jason Brownlee 2020年12月20日 上午5:50 #

      没有普遍的最佳学习率,我们必须看看什么最适合给定的目标函数/数据集。

  40. hondellighting 2021年6月1日 晚上8:28 #

    很棒的分享,信息量很大,我一直在寻找。您完整的指导给了我一个精彩的结局。继续努力。

  41. Lucas 2021年8月6日 上午3:07 #

    我如何将其实现到多元线性回归中?

  42. naty 2021年9月19日 晚上11:56 #

    你好,
    我跟着您的方法进行应用,作为练习,我构建了一个代码来测试该方法。我注意到对于 X 值小的点,该方法效果很好,但当存在大量 X 值大的点时,该方法无法收敛,事实上我们遇到了梯度爆炸。
    有没有办法解决这个问题?
    谢谢

    • Adrian Tam
      Adrian Tam 2021年9月20日 下午2:33 #

      线性回归由于其线性度应该最容易执行。但事实上,您看到的场景并非不可能。一种方法是在将数据馈送到模型之前对其进行预处理。在您的情况下,您可能需要对 X 进行归一化以避免极大的范围。

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。