参与:linjing、吴攀 许多机器学习算法的核心是优化。优化算法用于在机器学习中为给定训练集找出合理的模型参数设置。机器学习最常见的优化算法是随机梯度下降(SGD:stochastic gradient descent)。 本教程将指导大家用 Python 实现随机梯度下降对线性回归算法的优化。通过本教程的学习,你将了解到: 如何用随机梯度下降估计线性回归系数 如何对多元线性回归做预测 如何用带随机梯度下降的线性回归算法对新数据做预测 说明 本文将对线性回归、随即梯度下降方法以及本教程所使用的葡萄酒品质数据集做一个集中阐释。 多元线性回归 线性回归是一种用于预测真实值的方法。让人困惑的是,atv,这些需要预测真实值的问题被称为回归问题(regression problems)。 线性回归是一种用直线对输入输出值进行建模的方法。在超过二维的空间里,这条直线被想象成一个平面或者超平面(hyperplane)。预测即是通过对输入值的组合对输出值进行预判。 y = b0 + b1 * x1 + b2 * x2 + ... 系数 (b) 用于对每个输入属性 (x) 进行加权,而学习算法的目的正是寻找一组能导出好的预测值 (y) 的系数。这些系数可以使用随机梯度下降的方法找到。 随机梯度下降 梯度下降(Gradient Descent)是遵循成本函数的梯度来最小化一个函数的过程。这个过程涉及到对成本形式以及其衍生形式的认知,使得我们可以从已知的给定点朝既定方向移动。比如向下朝最小值移动。 在机器学习中,我们可以利用随机梯度下降的方法来最小化训练模型中的误差,即每次迭代时完成一次评估和更新。 这种优化算法的工作原理是模型每看到一个训练实例,就对其作出预测,并重复迭代该过程到一定的次数。这个流程可以用于找出能导致训练数据最小误差的模型的系数。用机器学习的术语来讲,就是每次迭代过程都用如下等式更新系数(b)。 b = b - learning_rate * error * x 其中 b 是系数或者被优化的权重,learing_rate 需手动设定(如 0.01),error 是取决于权重的训练数据模型的预测误差,x 是输入值。 葡萄酒品质数据集 开发了具有梯度下降的线性回归算法之后,我们可以将其运用到一个关于葡萄酒品质的数据集当中。这个数据集囊括了 4898 种白葡萄酒的测量标准,包括酸度和 ph 值。目的是用这些客观标准来预测葡萄酒的品质,分为 0 到 10 级。 下表给出了 5 个数据样本。 7,0.27,0.36,20.7,0.045,45,170,1.001,3,0.45,8.8,6 6.3,0.3,0.34,1.6,0.049,14,132,0.994,3.3,0.49,9.5,6 8.1,0.28,0.4,6.9,0.05,30,97,0.9951,3.26,0.44,10.1,6 7.2,0.23,0.32,8.5,0.058,47,186,0.9956,3.19,0.4,9.9,6 7.2,0.23,0.32,8.5,0.058,47,186,0.9956,3.19,0.4,9.9,6 所有数据需归一化为 0-1 之间的值。每种属性标准单位不同,因而有不同的缩放尺度。通过预测该归一化数据集的平均值(零规则算法),达到了 0.148 的基准方均根差(RMSE)。 该数据集详情请参阅 UCI Machine Learning Repository:+Quality 下载该数据集并将其保存到当前工作目录,文件名为 winequality-white.csv。(注意:文件开头的头信息需去除,用作分隔符的 『;』 需改为符合 CSV 格式的 『,』。) 教程 本教程分为三个部分: 1. 预测 2. 估计系数 3. 葡萄酒品质预测 这将能让你了解在你自己的预测建模问题上实现和应用带有随机梯度下降的线性回归的基础。 1. 预测 首先建立一个用于预测的函数。这将用于对随机梯度下降的候选系数的评估,且模型确定之后也需要这个函数。我们会在测试集或者新的数据上用该函数来进行预测。 函数 predict() 如下所示,用于预测给定了一组系数的行的输出值。 第一个系数始终为截距,也称为偏差或 b0,因其相对独立且不与特定的输入值相关。
我们可以用一个小的数据集对这个函数进行测试。 x, y 1, 1 2, 3 4, 3 3, 2 5, 5 下图是一小部分数据:
线性回归的部分转换数据 我们也可用之前准备好的系数为这个数据集做预测。predict() 函数测试如下。
单个输入值 (x) 和两个系数(b0 和 b1)。用于建模该问题的预测方程为: y = b0 + b1 * x 或者,手动选择特定系数: y = 0.4 + 0.8 * x 运行此函数,我们将得到一个相当接近预测值的输出值(y)。 Expected=1.000, Predicted=1.200 Expected=3.000, Predicted=2.000 Expected=3.000, Predicted=3.600 Expected=2.000, Predicted=2.800 Expected=5.000, Predicted=4.400 现在我们可以用随机梯度下降来优化我们的系数值了。 2. 估计系数 我们可以使用随机梯度下降来为我们的训练数据估计系数值。随机阶梯下降需要两个设定参数: 学习率(Learning Rate):用于限制每次更新时被修正的系数的数量。 Epochs:更新系数的同时运行训练集的次数。 这两个值和数据集都是函数的参数。我们的这个函数将执行三个遍历循环: 1. 单次 epoch 循环 2. 单次 epoch 中训练集中的每行循环 3. 单次 epoch 中每个系数循环并为每一行更新它 (责任编辑:本港台直播) |