1. 首页
  2. 技术文章

Python中如何实现线性回归

许多机器学习算法的核心是优化。

给定训练数据集,机器学习算法使用优化算法来找到一组不错的模型参数。

机器学习中最常用的优化算法是随机梯度下降。

在本教程中,您将发现如何实现随机梯度下降以使用Python从头开始优化线性回归算法。

完成本教程后,您将知道:

  • 如何使用随机梯度下降法估算线性回归系数。
  • 如何对多元线性回归进行预测。
  • 如何实现具有随机梯度下降的线性回归以对新数据进行预测。
如何使用Python从头开始实现具有随机梯度下降的线性回归

如何使用随机梯度渐变实现线性回归

描述

在本节中,我们将描述线性回归,随机梯度下降技术和本教程中使用的葡萄酒质量数据集。

多元线性回归

线性回归是一种用于预测实际值的技术。

令人困惑的是,这些要预测实际值的问题称为回归问题。

线性回归是一种使用直线对输入和输出值之间的关系进行建模的技术。在两个以上的维度中,该直线可以被认为是一个平面或超平面。

作为输入值的组合进行预测以预测输出值。

使用系数(b)对每个输入属性(x)进行加权,学习算法的目标是发现一组可产生良好预测(y)的系数。

可以使用随机梯度下降法找到系数。

随机梯度下降

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

这涉及到了解成本和微分的形式,以便从给定的点知道梯度,并且可以沿该方向移动,例如下坡到最小值。

在机器学习中,我们可以使用一种称为“随机梯度下降”的技术来评估和更新每次迭代的系数,以最大程度地减少模型在训练数据上的误差。

该优化算法的工作方式是一次将每个训练实例显示给模型。该模型对训练实例进行预测,计算误差并更新模型,以减少下一个预测的误差。重复此过程进行固定次数的迭代。

此过程可用于查找模型中的一组系数,这些系数会导致模型在训练数据上的最小误差。每次迭代,使用以下公式更新机器学习语言中的系数(b):

其中b是要优化的系数或权重,learning_rate是必须配置的学习率(例如0.01),error是归因于权重的训练数据对模型的预测误差,x是输入值。

葡萄酒质量数据集

开发具有随机梯度下降的线性回归算法后,我们将使用它来对葡萄酒质量数据集进行建模。

该数据集包含4898种白葡萄酒的详细信息,包括酸度和pH值。目标是使用这些客观的指标来预测葡萄酒的质量(介于0到10之间)。

以下是此数据集中前5条记录的示例。

数据集必须归一化为0到1之间的值,因为每个属性具有不同的单位,进而具有不同的比例。

通过预测归一化数据集的平均值(零规则算法),可以实现0.148的基线均方根误差(RMSE)。

您可以下载数据集并将其保存为当前名称为winequality-white.csv的工作目录。您必须从文件的开头删除标头信息,然后转换“;” 值分隔符为“,”以符合CSV格式。

教程

本教程分为三个部分:

  1. 做出预测。
  2. 估计系数。
  3. 葡萄酒质量预测。

这将为您实施和将线性回归与随机梯度下降应用于您自己的预测建模问题提供基础。

1.做出预测

第一步是开发可以进行预测的功能。

在随机梯度下降中评估候选系数值时以及在模型最终确定后都将需要此方法,我们希望开始对测试数据或新数据进行预测。

下面是一个名为predict()的函数,该函数在给定一组系数的情况下预测一行的输出值。

输入中的第一个系数始终是截距,也称为偏差或b0,因为它是独立的并且不负责特定的输入值。

我们可以设计一个小的数据集来测试我们的预测功能。

下面是该数据集的图。

用于简单线性回归的小型人为数据集

小型人为线性回归数据集

我们还可以使用先前准备的系数对此数据集进行预测。

将所有这些放在一起,我们可以在下面测试我们的predict()函数。

有一个输入值(x)和两个系数值(b0和b1)。我们为此问题建模的预测方程为:

或者,使用我们手动选择的特定系数值作为:

运行此函数,我们可以得到合理接近预期的输出(y)值的预测。

现在,我们准备执行随机梯度下降以优化系数值。

2.估计系数

我们可以使用随机梯度下降来估计训练数据的系数值。

随机梯度下降需要两个参数:

  • 学习率:用于限制每次更新系数时对其进行校正的数量。
  • 时期:更新系数时遍历训练数据的次数。

这些以及训练数据将成为函数的参数。

我们需要在函数中执行3个循环:

  1. 循环遍历每个纪元。
  2. 在训练数据中的每一行上循环一个历元。
  3. 循环遍历每个系数,并将其更新为一个时期中的一行。

如您所见,我们在每个时期更新训练数据中每一行的每个系数。

系数根据模型产生的误差进行更新。将该误差计算为使用候选系数进行的预测与预期输出值之间的差异。

每个输入属性都有一个权重系数,这些系数将以一致的方式进行更新,例如:

列表开头的特殊系数(也称为截距或偏差)以类似的方式更新,除了没有输入外,因为它不与特定的输入值相关联:

现在,我们可以将所有这些放在一起。下面是一个名为coefficients_sgd()的函数,该函数使用随机梯度下降来计算训练数据集的系数值。

您可以看到,此外,我们还跟踪每个时期的平方误差和(正值),这样我们就可以在外循环中打印出一条漂亮的消息。

我们可以从上方在相同的小型人为数据集上测试此功能。

我们使用0.001的小学习率,对模型进行50个时期的训练,或者将50个系数暴露给整个训练数据集。

运行示例将在每个时期打印一条消息,其中包含该时期的平方和和最终系数集。

您可以看到即使在最后一个时期,错误如何继续减少。我们可能会训练更长的时间(更多的时间段),或者增加每次更新系数的数量(更高的学习率)。

进行实验,看看你想出什么。

现在,让我们将此算法应用于真实数据集。

3.葡萄酒品质预测

在本节中,我们将在葡萄酒质量数据集上使用随机梯度下降训练线性回归模型。

该示例假定数据集的CSV副本位于当前工作目录中,文件名为winequality-white.csv

首先加载数据集,将字符串值转换为数字,并将每一列标准化为0到1范围内的值。这可以通过辅助函数load_csv()str_column_to_float()来加载和准备数据集以及dataset_minmax()来实现。normalize_dataset()对其进行规范化。

我们将使用k倍交叉验证来估计学习模型在看不见的数据上的性能。这意味着我们将构建和评估k个模型,并将性能评估为平均模型误差。均方根误差将用于评估每个模型。这些行为在cross_validation_split()rmse_metric()valuate_algorithm ()帮助函数中提供。

我们将使用上面创建的predict()coefficients_sgd()linear_regression_sgd()函数来训练模型。

以下是完整的示例。

使用k值5进行交叉验证,得出每折4,898 / 5 = 979.6或略低于1000条记录,以便在每次迭代时进行评估。通过少量实验选择了0.01和50个训练时期的学习率。

您可以尝试自己的配置,看看是否可以超过我的分数。

运行此示例将打印5个交叉验证折叠中每一个的得分,然后打印均方根均方根误差(RMSE)。

我们可以看到,如果我们只是预测平均值(使用零规则算法),则RMSE(在标准化数据集上)为0.126,低于基线值0.148。

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ1841324605,本站将立刻清除。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

服务热线:130-0886-1890

QR code