研究|数据预处理|归一化 (标准化)

1. 概要


数据预处理在众多深度学习算法中都起着重要作用,实际情况中,将数据做归一化和白化处理后,很多算法能够发挥最佳效果。然而除非对这些算法有丰富的使用经验,否则预处理的精确参数并非显而易见。

2. 数据归一化及其应用


数据预处理中,标准的第一步是数据归一化。虽然这里有一系列可行的方法,但是这一步通常是根据数据的具体情况而明确选择的。特征归一化常用的方法包含如下几种:

  • 简单缩放
  • 逐样本均值消减(也称为移除直流分量)
  • 特征标准化(使数据集中所有特征都具有零均值和单位方差)

一般做机器学习应用的时候大部分时间是花费在特征处理上,其中很关键的一步就是对特征数据进行归一化,为什么要归一化呢?很多同学并未搞清楚,维基百科给出的解释:

  • 归一化后加快了梯度下降求最优解的速度;
  • 归一化有可能提高精度;

加快梯度下降求解速度

如下图所示,蓝色的圈圈图代表的是两个特征的等高线。其中左图两个特征X1和X2的区间相差非常大,X1区间是[0,2000],X2区间是[1,5],其所形成的等高线非常尖。当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;

normal

而右图对两个原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。

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

归一化有可能提高精度

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

简单缩放 | min-max标准化(Min-max normalization) | 离差标准化


在简单缩放中,我们的目的是通过对数据的每一个维度的值进行重新调节(这些维度可能是相互独立的),使得最终的数据向量落在 [0,1]或[ − 1,1] 的区间内(根据数据情况而定)。这对后续的处理十分重要,因为很多默认参数(如 PCA-白化中的 epsilon)都假定数据已被缩放到合理区间。 例子:在处理自然图像时,我们获得的像素值在 [0,255] 区间中,常用的处理是将这些像素值除以 255,使它们缩放到 [0,1] 中.

这种算法是对原始数据的线性变换,使结果落到[0,1]区间,转换函数如下:

  • x = (x - min)/(max - min)
    • max: 样本数据的最大值
    • min: 为样本数据的最小值

适用场景

这种归一化方法比较适用在数值比较集中的情况。但是,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定,实际使用中可以用经验常量值来替代max和min。而且当有新数据加入时,可能导致max和min的变化,需要重新定义。

在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。

标准差标准化 | z-score 0均值标准化(zero-mean normalization)


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

  • x = (x - u)/σ
    • u: 所有样本数据的均值
    • σ: 为所有样本数据的标准差。

在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。

非线性归一化


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

3. 使用 sklearn 来做归一化


 
 
1
# built-in
2
import time
3
import operator
4
import collections
5
import datetime as dt
6
from functools import wraps
7
​
8
# 3-party
9
import pandas as pd
10
pd.options.display.max_columns = 100
11
pd.options.display.max_rows = 300
12
​
13
import numpy as np
14
import scipy
15
import scipy.stats
16
​
17
import seaborn
18
from matplotlib import pylab
19
import matplotlib.pyplot as plt
20
​
21
import sklearn
22
import sklearn.preprocessing
23
​
24
from CAL.PyCAL import *
25
​
26
# personal lib
27
from lib import lib
查看全部
 
 
1
scaler = sklearn.preprocessing.MinMaxScaler()
2
data = np.array(range(100))
3
data = data.astype(float)
4
data_scaler = scaler.fit_transform(data)
5
print list(data)
6
print list(data_scaler)
查看全部
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, 56.0, 57.0, 58.0, 59.0, 60.0, 61.0, 62.0, 63.0, 64.0, 65.0, 66.0, 67.0, 68.0, 69.0, 70.0, 71.0, 72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 79.0, 80.0, 81.0, 82.0, 83.0, 84.0, 85.0, 86.0, 87.0, 88.0, 89.0, 90.0, 91.0, 92.0, 93.0, 94.0, 95.0, 96.0, 97.0, 98.0, 99.0]
[0.0, 0.010101010101010102, 0.020202020202020204, 0.030303030303030304, 0.040404040404040407, 0.050505050505050511, 0.060606060606060608, 0.070707070707070718, 0.080808080808080815, 0.090909090909090912, 0.10101010101010102, 0.11111111111111112, 0.12121212121212122, 0.13131313131313133, 0.14141414141414144, 0.15151515151515152, 0.16161616161616163, 0.17171717171717174, 0.18181818181818182, 0.19191919191919193, 0.20202020202020204, 0.21212121212121213, 0.22222222222222224, 0.23232323232323235, 0.24242424242424243, 0.25252525252525254, 0.26262626262626265, 0.27272727272727276, 0.28282828282828287, 0.29292929292929293, 0.30303030303030304, 0.31313131313131315, 0.32323232323232326, 0.33333333333333337, 0.34343434343434348, 0.35353535353535359, 0.36363636363636365, 0.37373737373737376, 0.38383838383838387, 0.39393939393939398, 0.40404040404040409, 0.4141414141414142, 0.42424242424242425, 0.43434343434343436, 0.44444444444444448, 0.45454545454545459, 0.4646464646464647, 0.47474747474747481, 0.48484848484848486, 0.49494949494949497, 0.50505050505050508, 0.51515151515151525, 0.5252525252525253, 0.53535353535353536, 0.54545454545454553, 0.55555555555555558, 0.56565656565656575, 0.5757575757575758, 0.58585858585858586, 0.59595959595959602, 0.60606060606060608, 0.61616161616161624, 0.6262626262626263, 0.63636363636363646, 0.64646464646464652, 0.65656565656565657, 0.66666666666666674, 0.6767676767676768, 0.68686868686868696, 0.69696969696969702, 0.70707070707070718, 0.71717171717171724, 0.72727272727272729, 0.73737373737373746, 0.74747474747474751, 0.75757575757575768, 0.76767676767676774, 0.77777777777777779, 0.78787878787878796, 0.79797979797979801, 0.80808080808080818, 0.81818181818181823, 0.8282828282828284, 0.83838383838383845, 0.84848484848484851, 0.85858585858585867, 0.86868686868686873, 0.8787878787878789, 0.88888888888888895, 0.89898989898989912, 0.90909090909090917, 0.91919191919191923, 0.92929292929292939, 0.93939393939393945, 0.94949494949494961, 0.95959595959595967, 0.96969696969696972, 0.97979797979797989, 0.98989898989898994, 1.0]
posted on 2018-01-10 14:32  莫水千流  阅读(7235)  评论(0)    收藏  举报