有多少人工,就有多少智能

Sklearn之数据预处理——StandardScaler

为什么要进行归一化?

机器学习模型被互联网行业广泛应用,一般做机器学习应用的时候大部分时间是花费在特征处理上,其中很关键的一步就是对特征数据进行归一化,为什么要归一化呢?维基百科给出的解释:

  • 归一化后加快了梯度下降求最优解的速度;

如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛甚至不能收敛。

  • 归一化有可能提高精度;

一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。

哪些机器学习算法不需要(需要)做归一化?

 概率模型(树形模型)不需要归一化因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率如决策树、RF。而像Adaboost、SVM、LR、Knn、KMeans之类的最优化问题就需要归一化。

StandardScaler原理

作用:去均值和方差归一化。且是针对每一个特征维度来做的,而不是针对样本。 

标准差标准化(standardScale)使得经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:

             

其中μ为所有样本数据的均值,σ为所有样本数据的标准差。

  • 下面使用numpy来实现一个矩阵的标准差标准化
  1. import numpy as np
  2.  
  3.  x_np = np.array([[1.5, -1., 2.],
  4.  [2., 0., 0.]])
  5.  mean = np.mean(x_np, axis=0)
  6.  std = np.std(x_np, axis=0)
  7.  print('矩阵初值为:{}'.format(x_np))
  8.  print('该矩阵的均值为:{}\n 该矩阵的标准差为:{}'.format(mean,std))
  9.  another_trans_data = x_np - mean
  10.  another_trans_data = another_trans_data / std
  11.  print('标准差标准化的矩阵为:{}'.format(another_trans_data))
  1.  矩阵初值为:[[ 1.5 -1. 2. ]
  2.  [ 2. 0. 0. ]]
  3.  该矩阵的均值为: [ 1.75 -0.5 1. ]
  4.  该矩阵的标准差为:[0.25 0.5 1. ]
  5.  标准差标准化的矩阵为:[[-1. -1. 1.]
  6.  [ 1. 1. -1.]]

经结果验证,新值符合 --->(旧值-均值)/ 标准差 .

  • 下面使用sklearn提供的StandardScaler方法
  1.  from sklearn.preprocessing import StandardScaler # 标准化工具
  2.  import numpy as np
  3.   
  4.  x_np = np.array([[1.5, -1., 2.],
  5.  [2., 0., 0.]])
  6.  scaler = StandardScaler()
  7.  x_train = scaler.fit_transform(x_np)
  8.  print('矩阵初值为:{}'.format(x_np))
  9.  print('该矩阵的均值为:{}\n 该矩阵的标准差为:{}'.format(scaler.mean_,np.sqrt(scaler.var_)))
  10.  print('标准差标准化的矩阵为:{}'.format(x_train))
  1.  矩阵初值为:[[ 1.5 -1. 2. ]
  2.  [ 2. 0. 0. ]]
  3.  该矩阵的均值为: [ 1.75 -0.5 1. ]
  4.  该矩阵的标准差为:[0.25 0.5 1. ]
  5.  标准差标准化的矩阵为:[[-1. -1. 1.]
  6.  [ 1. 1. -1.]]

可以发现,sklearn的标准化工具实例化后会有两个属性,一个是mean_(均值),一个var_(方差)。最后的结果和使用numpy是一样的。

其他的归一化类型

  • 线性归一化

这种归一化方法比较适用在数值比较集中的情况。这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量值来替代max和min。

  • 非线性归一化 

经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。

posted @ 2021-01-10 09:56  lvdongjie-avatarx  阅读(523)  评论(0编辑  收藏  举报