之前学习过,一些算法(比如神经网络和SVM)对数据缩放非常敏感。因此,通常的做法是对特征进行调节,使数据更适合于这些算法。通常来说,这是对数据的一种简单的按照特征的缩放和移动。举例:
import mglearn.plots
import matplotlib.pyplot as plt
mglearn.plots.plot_scaling()
plt.show()
如上图,左侧显示的是一个模拟的有两个特征的二分类数据集。第一个特征位于10-15之间,第二个特征大约位于0-9之间。
右侧的4张图展示了4种数据变换方法,都生成了更加标准的范围。
1、scikit-learn中的StandardScaler确保每个特征的平均值为0,方差为1,使所有特征都位于同一量级,但这种缩放不能保证特征任何特定的最大值与最小值。
2、RobustScaler的工作原理与StandardScaler类似,确保每个特征的统计属性都位于同一范围,但RobustScaler使用的是中位数和四分位数,而不是平均值和方差。这样RobustScaler会忽略与其他点有很大不同的数据点(比如测量误差)。这些与众不同的数据点也叫异常值。可能会给其他缩放方法造成麻烦;
3、MinMaxScaler移动数据,使所有特征都刚好位于0-1之间,对于二维数据集来说,所有的数据都包含在x轴0-1与Y轴0-1组成的矩阵之间;
4、Normalizer用到一种完全不同的缩放方法。它对每个数据点进行缩放,使得特征向量的欧式长度等于1,换句话说,它将一个数据点投射在半径为1 的圆上,这意味着每个数据点的缩放比例都不相同。如果只有数据的方向(或角度)是重要的,而特征向量的长度无关紧要,通常会使用这种归一化。