特征归一化/标准化

版权声明:本文为博主原创文章,欢迎交流分享,未经博主允许不得转载。 https://blog.csdn.net/qjf42/article/details/82222507

what

特征归一化/标准化(feature scaling/standardization/normalization)是一种把特征变量映射到某个区间的数据前处理方法

  • 因为不同特征的取值范围,单位、量纲各不相同(如,身高可用m或cm),对某些模型来说,可能对结果有影响
  • 这些词是一类操作,可能稍有不同,这里先不做区分

how

基本方法

常见的就两种方法(本质上都是压缩平移):

Min-Max

通常是将特征映射到 [ 0 , 1 ] [0, 1]
x = x m i n ( x ) m a x ( x ) m i n ( x ) x' = \frac {x- min(x)} {max(x)- min(x)}
[ 1 , 1 ] [-1, 1]
x = 2 x m i n ( x ) m a x ( x ) m i n ( x ) 1 = x m i d ( x ) ( m a x ( x ) m i n ( x ) ) / 2 x' = 2 \cdot \frac {x- min(x)} {max(x)- min(x)} - 1 = \frac {x- mid(x)} {(max(x)- min(x))/2}

  • 需要注意的是:对测试集做标准化时, m a x ( x ) , m i n ( x ) max(x), min(x) 仍然用的是训练集中的值,所以结果可能超出范围
(均值/方差)标准化

把样本的均值和标准差变为0, 1
x = x x ˉ s t d ( x ) x' = \frac{x-\bar{x}}{std(x)}

  • 标准化后的数据的均值,标准差正好是(0,1),但是范围不固定
  • 如果特征原本服从正态分布的话,那么标准化之后是标准正分布 N ( 0 , 1 ) N(0,1)

注意点

  • 这里讨论的是对于单变量的处理,区别于whitening(多变量版本,但是还要考虑协方差,消除变量相关性)
  • 在数据的分布比较合理的情况下,这么做是ok的, 但是如果数据包含outlier,如:分布是厚尾的,或数据本身有问题,则均值和方差都会受很大的影响
    • 例: x = [ 0 , 0 , 1 , 1 , 1 , 100 ] x ˉ = 17.17 , σ ^ = 37.05 x=[0,0,1,1,1,100] \rightarrow \bar{x} = 17.17, \hat{\sigma} = 37.05
      min-max: [ 0 , 0 , 0.01 , 0.01 , 0.01 , 1 ] [0 , 0 , 0.01, 0.01, 0.01, 1]
      (均值/方差)标准化: [ 0.46 , 0.46 , 0.44 , 0.44 , 0.44 , 2.24 ] [-0.46 , -0.46 , -0.44, -0.44, -0.44, 2.24]
      可以看到,0,1因为受到outlier 100的影响,在标准化后变得更难区分了
    • 解决这类的第一种方法是挖掘数据中的outlier,手动处理
    • 一种鲁棒性更好的方法是用中位数代替均值,用四分位距(IQR)代替标准差,即: x = x m e d i a n ( x ) I Q R ( x ) x' =\frac{x-median(x)}{IQR(x)}
      • 注意,这是在通过数据难以准确估计其分布参数的情况下采用的办法,所以如果数据分布不是对称的,样本中位数不是均值的无偏估计;四分位距也不同于标准差(实际上,对于正态分布, [ σ , σ ] [-\sigma, \sigma] 内的面积是0.68,非0.5, I Q R 1.35 σ IQR\approx1.35\sigma ,而厚尾的情况下, I Q R < σ IQR < \sigma );因此,标准化后的数据均值和方差并非(0,1)
  • 当需要计算cosine距离时,通常还有另一种标准化(其实是单位化),即: x = x x 2 = x i = 1 d x i 2 x' = \frac{x}{||x||_2} = \frac{x}{\sqrt{\sum_{i=1}^d{x_i^2}}}

when

什么时候需要做标准化?
  • 模型是否是基于距离或距离敏感的?
    • 举个例子,两个特征,分别是身高(单位: 米)和体重(单位: 克),显然后者比前者大好几个数量级,如果直接基于欧式距离聚类,那么后者的作用会远大于前者
    • 所以像KNN,聚类,核方法(如svm中用到的),这些直接基于距离的方法都需要做标准化
    • 说到底,是因为无法权衡特征的重要性,所以就统统打平到一个范围处理(尤其对无监督的来说)
    • PS: 一种自带标准化的距离:马氏距离
  • 模型优化考虑
    • 模型有正则化项(regularization/weight decay)时,显然取值范围大的特征权重容易小一些,这样正则化的约束力就会弱一些,反之也是,导致不平衡
    • 梯度下降对是否标准化也较敏感,尤其是二阶导(Hessian matrix)比较ill-conditioned时(简单理解就是矩阵的最大和最小的特征值绝对值之比很大,导致用一阶导作为当前优化的方向是不合理的),可能出现步子太小走得慢,或步子大"在峡谷震荡"等导致收敛慢的情况
    • 影响参数初始化的效果
      • 如:采用均值为0的正态分布初始化参数时,如果不用中心为0的标准化(如 [ 1 , 1 ] [-1,1] ),甚至二值化采用 { 0 , 1 } \{0,1\} 而不是 { 1 , 1 } \{-1,1\} ),都会导致初始化时分类平面偏离数据点(如: w = [ 0.1 , 0.2 ] , x = [ 100 , 80 ] , y = 0 w=[0.1, 0.2], x=[100, 80], y=0
      • 同时还会有saturation的问题,如sigmoid,tanh激活
反过来说,什么时候不需要?
  • 不需要加正则化时的回归(linear,logistic等),除了可能影响优化时收敛的速度外,做不做标准化没影响
  • tree-based model(如random forest,GBDT(penalty是加在输出上的,与输入无关)),在选特征和切分的时候,因为不考虑值的大小,所以也可以不用标准化

References

  1. scikit-learn doc
  2. SAS faq

猜你喜欢

转载自blog.csdn.net/qjf42/article/details/82222507