即feature scaling

当样本的一个特征与另一个特征之间的数值差距过大,样本之间的距离计算容易被大数值(较大的量纲)的特征主导,直接计算距离会导致不能均衡反映每一个特征对于样本之间距离计算的重要程度,如下图所示。
image.pngimage.png
所以需要将数据进行归一化。

解决方案

将所有的数据映射到同一尺度(量纲)中

最值归一化(normalization)

把所有数据映射到0-1之间

数据归一化 - 图3

该方法受适用于有明显边界的情况(成绩),明显边界指的是数据样本之间的差值,不是特别大。即大家都比较均匀的分布在一个空间内。而不是一群人在一小块地方,一个人在特别远的一个地方(收入)。也就是受outliter(离群点)影响比较大。否则归一化后会形成有偏的数据。

自己实现案例:
  1. import numpy as np
  2. x = np.random.randint(1, 100, size=100)
  3. new_x = (x - np.mean(x)) / (np.max(x) - np.min(x))
  4. print(x)
  5. print(new_x)

image.pngimage.png
对于矩阵的话就把特征一列一列取出来就行

sklearn实现

from sklean.preprocession import MinMaxScaler

均值方差归一化/标准化(standardization)

把所有的数据归一到均值为0,方差为1的分布中。适用于数据分布没有明显的边界:即有可能存在极端数据值。也同样也适用于有明显边界的情况。
所以一般来说,我们 直接使用这个万能的标准化 就可以了。
公式:

数据归一化 - 图6

S指的是方差,注意的是,不论是标准化还是最值归一化,他们都是对单列数据进行归一化。

sklearn实现案例

标准化

类实现
  1. import numpy as np
  2. class StandardScaler:
  3. def __init__(self):
  4. self.mean_ = None
  5. self.mean_ = None
  6. def fit(self,X):
  7. """根据训练数据集X获得数据的均值和方差"""
  8. assert X.ndim == 2, "The dimension of X must be 2"
  9. self.mean_ = np.array([np.mean(X[:i]) for i in range(X.shape[1])])
  10. self.scale_ = np.array([np.std(X[:i]) for i in range(X.shape[1])])
  11. return self
  12. def transform(self, X):
  13. """将X根据这个StandardScaler进行均值方差归一化处理"""
  14. assert X.ndim == 2, "The dimension of X must be 2"
  15. assert self.mean_ is not None and self.scale_ is not None,\
  16. "must fit before transform!"
  17. assert X.shape[1] == len(self.mean_),\
  18. "the feature number of X must be eqal to mean_ and std_"
  19. resX = np.empty(shape=X.shape, dtype=float)
  20. for col in range(X.shape(1)):
  21. resX[:col] = (X[:,col] - self.mean_[col]) / self.std_[col]
  22. return resX

测试数据集如何归一化

  • 真实环境很有可能无法得到所有测试数据的均值和方差,比如真实环境每次来一个样本,你怎么计算均值和方差?
  • 对数据的归一化也是算法的一部分,即
    • 所以归一化时使用训练数据集的均值和方差进行归一化