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

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]
原文地址:https://www.cnblogs.com/zhoug2020/p/8258432.html