Python机器学习(原书第3版)
上QQ阅读APP看书,第一时间看更新

4.4 保持相同的特征缩放

特征缩放(feature scaling)是预处理环节中很容易被遗忘的关键步骤。决策树随机森林是机器学习算法中为数不多的不需要进行特征缩放的算法。这两种算法不受特征缩放的影响。然而,大多数其他的机器学习和优化算法,在特征缩放相同的情况下表现更佳,正如在第2章中实现梯度下降优化算法时所见到的那样。

可以用一个简单的例子说明特征缩放的重要性。假设有两个特征,一个特征的测量范围是1到10,而另一个特征则是在1到100000的范围。

在第2章中,对于Adaline的平方误差函数,你很自然会说算法主要聚焦在优化误差较大的第二个特征的权重。另一个例子是用欧氏距离度量的k-近邻(KNN)算法,样本之间的计算距离将由第二个特征轴主导。

可以用归一化标准化两种常见的方法来统一不同的特征缩放。这些术语不严格而且还经常用在不同的领域,所以要根据场景来判断其具体含义。标准化通常指的是把特征重新缩放到区间[0,1],这是最小-最大缩放(min-max scaling)的特例。为了使数据标准化,我们可以简单地对每个特征列的数据应用最小-最大缩放,其中样本x(i)的新值095-b1可以计算如下:

095-01

在这里,x(i)为某个特定样本,xmin为特征列的最小值,xmax为特征列的最大值。

在sciki-learn中实现最小-最大缩放的具体代码如下:

095-02

虽然通过最小-最大缩放实现归一化是一种常用技术,对需要有界区间值的问题很有用,但是标准化对于许多机器学习算法来说更为实用,特别是梯度下降等优化算法。原因是在第3章中,诸如逻辑回归和支持向量机之类的许多线性模型,把权重值初始化为0或接近0的随机值。通过标准化,我们可以把特征列的中心点设在均值为0且标准差为1的位置,这样特征列就呈标准正态分布(均值为0,方差为1),可以使学习权重更加容易。此外,标准化保持了关于异常值的有用信息,使算法对异常值不敏感,这与最小-最大缩放把数据缩到有限值域不同。

我们可以把标准化的过程用下述等式来表示:

095-03

在这里μx是某个特定特征列的样本均值,σx为相应的标准差。

表4-2说明了标准化和归一化这两个常用特征缩放技术之间的区别,该表是由0到5的数字组成的简单样本数据集。

表4-2 标准化和归一化的区别

095-04

执行下面的代码示例可以完成表中数据的标准化和归一化:

095-05

scikit-learn也有与MinMaxScaler函数相似的标准化类:

095-06

再次强调,我们只在训练数据集上用StandardScaler类拟合过一次,然后用这些参数来转换测试数据集或任何新数据点。

scikit-learn还提供了其他诸如RobustScaler这样更高级的特征缩放方法。如果我们正在处理包含许多异常值的小型数据集,那么RobustScaler特别有用,我们建议读者使用它。类似地,如果机器学习算法应用于容易过拟合的数据集,那么RobustScaler可能是一个不错的选择。我们分别在每个特征列上运行RobustScaler,根据数据集的第1和第3四分位数(分别是第25和第75分位数)删除中间值并缩放数据集,使得更多的极值和异常值变得不太明显。有兴趣的读者可以从scikit-learn官方文档中找到有关RobustScaler的更多信息:https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.RobustScaler.html。