来源:原始 Jupyter Notebook。内容已转换为网页阅读格式;下载原文件。
经过前面的学习,我们来看一个使用线性回归解决真实问题的实例:使用线性回归检测水泥质量(案例来源)。
已知类似于下面这样的水泥成分样本数据,如何得到一个水泥质量预测模型,能预测出水泥的好坏?

其中,每一行代表一个样本,1-7 列是每立方米混合物中各个成分的重量(单位:千克),第 8 列是已使用天数,第 9 列 是该行水泥样本的强度(单位:MPa)。前 8 列 是水泥的输入属性,最后 1 列是输出,我们要让机器学习这些样本后得到一个模型,这个模型可以输入样本表格之外的数据,预测出水泥的强度。很显然,这是一个回归问题。
我们假设该模型为线性模型,用线性回归去解决该问题,我们可以使用正规方程法或梯度下降法,上文中采用的是梯度下降法。
不过在计算之前,我们观察到部分这样的样本数据:

可以发现不同维度的数值范围差异会很大,塑化剂维度和粗粒料的维度值范围分别是 10 左右和 1000 多 ,如此大的差异如果用梯度下降,会使得不同方向的下降速度差异很大,迭代算法可能收敛得很慢甚至不收敛。如果直接将该样本送入训练,会使目标函数的形状太"扁",在找到最优解前,梯度下降的过程不仅是曲折的,也是非常耗时的,如下面图 3 所示,如果特征差异太大,就会像左图一样,在求最优解时,会得到一个窄长的椭圆形,导致在梯度下降时,梯度的方向为垂直等高线的方向而走之字形路线,这样会使迭代很慢;而如果特征差异不大,如右图会形成一个近似的圆形,则迭代就会很快。

所以如果求解使用迭代算法,需要在计算前把不同的特征缩放到同一个范围内,比如控制在 [-1 1] 内。这个特征数据缩放的过程就是数据归一化。
标准化和归一化
在实际的运用中我们选取的特征,比如长度,重量,面积等等,通常单位和范围都不同,这会导致梯度下降算法变慢,所以我们要将特征缩放到相对统一的范围内。通常的方法有 标准化(Standardization) 和 归一化(Normalization)。
标准化是把数据变成符合标准的正态分布,由 中心极限定理 可知,当数据量足够大时,无论原来的数据是何种分布,都可以通过下面的更新公式转变成正态分布:
归一化对梯度下降算法很友好,可以让算法最终收敛并且提高训练速度和精度,归一化的更新公式为: