首页 存档 技术 查看内容

从零开始在Python中使用随机梯度下降法实现线性回归

2018-3-30 13:00 |来自: 互联网 927 0

摘要: Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。 Jason Brownlee,2016年10月28日发布于Algorithms From Scratch 优化是许多机器学习算法的核心。在机器学习中,优化算法的目的是在给定一个训练 ...


Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

Jason Brownlee,2016年10月28日发布于Algorithms From Scratch

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

在机器学习中,优化算法的目的是在给定一个训练数据集时找到一组合适的模型参数。

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

在本教程中,您将了解如何在Python中从零开始用随机梯度下降法优化线性回归算法。

完成本教程后,你会知道:

  • 如何利用随机梯度下降法估算线性回归系数。

  • 如何对多元线性回归进行预测。

  • 如何用随机梯度下降法实现线性回归来对新数据进行预测。

那我们就开始吧。


从零开始在Python中使用随机梯度下降法实现线性回归

照片由star5112提供,保留部分权利。

描述

在本节中,我们将介绍线性回归,随机梯度下降法和葡萄酒质量数据集在本教程中的应用。

多元线性回归分析

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

令人有些困惑的是,这种需要预测真实值的问题被称为回归问题。

线性回归是一种用直线来模拟输入和输出值之间关系的技术.。在二维以上空间内,这条直线可以看作是平面或超平面。

预测时,需要一组输入值用以预测输出值。

每个输入属性(x)使用系数(b)加权,而学习算法的目的是找到一组使预测结果(Y)尽可能好的系数。


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

随机梯度下降法

梯度下降是通过沿着代价函数的梯度来找到函数最小值的过程.。

这个过程需要知道代价的形式,以及导数。这样在一个给定的点上你知道的它梯度,并可以按照梯度的方向移动,例如下坡来找到最小值。

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

这种优化算法的工作原理是,每个训练实例只对模型展示一次。该模型对训练实例进行预测,计算误差并对模型进行更新,以减少下一步预测的误差。这个过程要重复地迭代固定的次数。

此过程可以用来找到模型的一组系数,使训练数据的模型的误差最小。每次迭代中,机器学习语言中的系数(b)使用下面的方程更新:


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

葡萄酒的质量数据集

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

此数据集包含了4898个白葡萄酒的细节,包括测量的酸度和pH值。我们的目标是使用这些客观数据来预测葡萄酒质量,并用0-10分打分。

下面是这个数据集的前五个记录的样本。


数据集必须统一到0和1之间的值,因为每个属性有不同的单位,所以他们的比例也不同。

通过预测平均值(零规则算法)来统一数据集,这样可以使标准差(RMSE)至少减小到0.148。

你可以在UCI Machine Learning Repository更多地了解数据集。

你可以下载数据集并把它以winequality-white.csv的文件名存储到你的工作目录中。你需要把文件开始部分的头信息并把“;”值转换为“,”以满足CSV格式的要求。

教程

本教程分为3个部分:

1.预测。

2.估算系数。

3.预测葡萄酒质量。

这将为你自己的预测建模问题提供一个基础参考,下面我们开始用随机梯度下降法实现线性回归。

1.预测

第一步是开发一个可以作出预测的函数。

这一步会在两个地方有所应用,一是评估随机梯度下降法的候选系数,二是在建模完成后用测试数据或新数据开始预测时。

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

第一个系数总是截距,也被称为偏置或b0,因为它是独立的,对任何一个特定的输入值没什么关联。


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


下面是这个数据集的图。


为线性回归的编造的小型数据集

我们也可以使用以前准备的系数来预测这个数据集。

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


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


或者,用我们选择的特定系数值:



现在,我们准备应用随机梯度下降法,以优化我们的系数值。

2.估算系数

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

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

  • 学习率:用于每次更新时每次校正时,**系数调整的大小。

  • Epochs即在更新系数时运行训练数据的次数。(译注:1个epoch等于使用训练数据集中的全部样本训练一次,可理解为一个训练周期)

这些,还有训练数据将一起作为函数的参数。

这个函数中,我们有三个循环:

1.在每一个epoch循环。

2.在每一个epoch的训练数据的每一行循环。

3.在每一个系数中循环,并为这个epoch的这一行更新这个系数。

正如你所看到的,我们在每个epoch的训练数据的每一行,都会更新每个系数。

更新系数是由模型的误差决定的。误差是由候选系数算出的预期和期望输出值之间的差值计算得出的。


有一个系数对每个输入属性进行加权,并且系数以固定的方式进行更新,例如:


在列表开头的特殊系数,也称截距或偏置,也以类似的方式更新。但是不需要输入值,因为它与特定的输入值不相关:


现在我们可以把所有这一切放在一起。下面是名为coefficients_sgd()的函数,采用随机梯度下降法为训练数据集计算得到系数值。


你可以看到,我们还额外记录了每个epoch的方差(正值)的总和,以便我们在外部循环中打印出漂亮的信息.。

我们可以在上面编造出的小型数据集中测试这个函数。


我们用一个较小的学习率0.001并对模型进行50次epoch训练,或者说,将系数暴露给整个训练数据集50次。

运行该示例会打印出每个epoch的信息,包含了该epoch的方差总和和该epoch的一组最终系数。


你可以看到,即便在最终的epoch中,误差仍在继续下降。我们可以训练更长的时间(更多的epochs)或增加我们在每个epoch中更新系数的尺度的大小(更高的学习速率)。

快试试吧,看看你能做出什么。

现在,让我们把这个算法应用在真实数据集上。

3.葡萄酒质量预测

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

这个例子中假设数据的CSV文件被复制到当前工作目录中,并且文件名为winequality-white.csv。

首先加载数据集,将字符串值转换为数字,然后将每个列统一化为0到1的之间的值.。这里由辅助函数load_csv()和str_column_to_float()加载和初步处理数据集,并由dataset_minmax()和normalize_dataset()来统一化。

我们将使用k-折交叉验证评估模型对未知数据的性能。(译注:k折即将数据分为k个部分,然后进行训练并交叉验证,详情请自行百度)这意味着,我们将建模并评估k模型,估算的平均模型误差下的性能。将使用标准差来评估每个模型。这些功能由cross_validation_split(),rmse_metric()和evaluate_algorithm()辅助函数中提供。

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

下面是完整的例子。





交叉验证中使用的k值为5,每次迭代中,对每折4898 / 5 = 979.6或低于1000的记录进行评估。在这个小实验中,我们选择了0.01的学习率和50次训练epoch。

你可以尝试自己的配置,看看你是否可以击败我的分数。

运行此示例会打印5个交叉验证的每个折的分数,然后后打印平均标准差。

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


扩展内容

本节列出了本教程的一些扩展内容,如果有兴趣你可以继续探索。

调整示例。调整学习率、epoch数量,甚至准备数据的方法以在葡萄酒数据集中得到更高的分数。
对随机梯度下降进行分批。修改随机梯度算法来在每个epoch之间积累更新,并仅在epoch结尾处成批地更新系数。
附加的回归问题。将此技术应用于UCI machine learning repository的其他回归问题。

你探索过这些扩展内容吗?

请在下面的评论并告诉我。

回顾

在本教程中,你知道了从零开始在Python中使用随机梯度下降法实现线性回归。

你学会了。

  • 如何对多元线性回归问题进行预测。

  • 如何利用随机梯度下降法优化一组系数。

  • 如何将该技术应用于实际的回归预测建模问题。


英文原文:http://machinelearningmastery.com/implement-linear-regression-stochastic-gradient-descent-scratch-python/
译者:Aldrin


本文转载于微信公众号: Python程序员(pythonbuluo),更多微信文章请扫描关注公众号:

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部