特征工程2-归一化

为什么要进行数据归一

特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征, 需要用到一些方法进行无量纲化,使不同规格的数据转换到同一规格

两种常用归一化方法

(1)min-max标准化(线性函数归一化)
定义:即离差标准化,是对原始数据的线性变换,使得结果映射到[0,1]之间,其本质就是将数据变换为[0,1]之间的小数。

转换公式:
特征工程2-归一化
注: 作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’为最终结果,mx,mi分别为指定区间值,默认mx为1,mi为0

API介绍:

sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )#feature_range数据归一化区间,默认(0,1)
* MinMaxScalar.fit_transform(X)
    * X:numpy array格式的数据[n_samples,n_features]
* 返回值:转换后的形状相同的array

编程案例:

#min-max归一化
import pandas as pd
from sklearn.preprocessing import MinMaxScaler

def minmax_demo():
    data = pd.read_csv('dating.txt')
    print(data)
    #1、实例化一个转换器
    transfer = MinMaxScaler(feature_range=(1, 2))
    #调用fit_transform
    data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
    print("minmax归一化结果:\n",data)

"""
     milage     Liters  Consumtime  target
0     40920   8.326976    0.953952       3
1     14488   7.153469    1.673904       2
2     26052   1.441871    0.805124       1
..      ...        ...         ...     ...
997   26575  10.650102    0.866627       3
998   48111   9.134528    0.728045       3
999   43757   7.882601    1.332446       3

[1000 rows x 4 columns]
minmax归一化结果:
[[1.44832535 1.39805139 1.56233353]
[1.15873259 1.34195467 1.98724416]
[1.28542943 1.06892523 1.47449629]
...
[1.29115949 1.50910294 1.51079493]
[1.52711097 1.43665451 1.4290048 ]
[1.47940793 1.3768091  1.78571804]]
"""

(2)、0均值标准化
定义:对原始数据的均值和标准差进行数据的标准化,经处理的数据符合标准正态分布,即均值为0,标准差为1,其实质把量纲表达式变为无量纲表达式。

转换公式:
特征工程2-归一化

注:公式作用于每一列,mean为每一列的平均值, σ为每一列的标准差

API介绍:

sklearn.preprocessing.StandardScaler( )
* 处理之后每列来说所有数据都聚集在均值0附近标准差差为1
* StandardScaler.fit_transform(X)
    * X:numpy array格式的数据[n_samples,n_features]
* 返回值:转换后的形状相同的array

编程案例:

#0均值归一化
import pandas as pd
from sklearn.preprocessing import StandardScaler

def stand_demo():
    data = pd.read_csv("dating.txt")
    print(data)
    #1、实例化一个转换器
    transfer = StandardScaler()
    #2、调用fit_transform
    data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
    print("归一化后数据:\n",data)
    print("每一列特征的平均值:\n",transfer.mean_)
    print("每一列特征的方差:\n",transfer.var_)

"""
     milage     Liters  Consumtime  target
0     40920   8.326976    0.953952       3
1     14488   7.153469    1.673904       2
2     26052   1.441871    0.805124       1
..      ...        ...         ...     ...
997   26575  10.650102    0.866627       3
998   48111   9.134528    0.728045       3
999   43757   7.882601    1.332446       3

[1000 rows x 4 columns]
归一化后数据:
[[ 0.33193158  0.41660188  0.24523407]
[-0.87247784  0.13992897  1.69385734]
[-0.34554872 -1.20667094 -0.05422437]
...
[-0.32171752  0.96431572  0.06952649]
[ 0.65959911  0.60699509 -0.20931587]
[ 0.46120328  0.31183342  1.00680598]]
每一列特征的平均值:
[3.36354210e+04 6.55996083e+00 8.32072997e-01]
每一列特征的方差:
[4.81628039e+08 1.79902874e+01 2.46999554e-01]
"""

异常值对两种归一化方法的影响

特征工程2-归一化
对于min-max而言,如果出现异常点,影响了最大值和最小值,进而对最终的结果产生影响;
对于0均值而言,如果出现异常点,由于具有一定的数据量, 少量的异常点对于平均值的影响并不大,从而方差改变较小。

两种归一化方法的使用场景

(1)在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,0均值方法(Z-score standardization)表现更好。
因为:min-max(线性变换后),其协方差产生了倍数值的缩放,因此这种方式无法消除量纲对方差、协方差的影响,对PCA分析影响巨大;同时,由于量纲的存在,使用不同的量纲、距离的计算结果会不同。
(2)在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用min-max或其他归一化方法。
因为:0均值归一化方法中,新的数据由于对方差进行了归一化,这时候每个维度的量纲其实已经等价了,每个维度都服从均值为0、方差1的正态分布,在计算距离的时候,每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。

参考文献:https://blog.****.net/program_developer/article/details/78637711