机器学习中的数据预处理---数据归一化

原文链接:https://www.lizenghai.com/archives/20262.html https://blog.csdn.net/csmqq/article/details/51461696

数据归一化

数据归一化处理就是将所有数据都映射到同一尺度
  • 最值归一化
  • 均值方差归一化

最值归一化

最值归一化(normalization)把所有数据映射到0-1之间。

使用这种标准化方法的原因是,有时数据集的标准差非常非常小,有时数据中有很多很多零(稀疏数据)需要保存住0元素。

xscale=xxminxmaxxminx_{scale}=\frac{x-x_{min}}{x_{max}-x_{min}}xscale​=xmax​−xmin​x−xmin​​

import numpy as np

import matplotlib.pyplot as plt

x = np.random.randint(0,100,size=100)

(x-np.min(x)) / (np.max(x)-np.min(x))

最值归一化把数据缩放至给定的最小值与最大值之间,通常是0与1之间,可用MinMaxScaler实现。或者将最大的绝对值缩放至单位大小,可用MaxAbsScaler实现。

MinMaxScaler(最小最大值标准化)

公式:

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) ;

X_scaler = X_std/ (max - min) + min
#例子:将数据缩放至[0, 1]间。训练过程: fit_transform()

X_train = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])

min_max_scaler = preprocessing.MinMaxScaler() 

X_train_minmax = min_max_scaler.fit_transform(X_train)  

#out: array([[ 0.5       ,  0.        ,  1.        ], 
[ 1.        ,  0.5       ,  0.33333333],        
[ 0.        ,  1.        ,  0.        ]])

#将上述得到的scale参数应用至测试数据
X_test = np.array([[ -3., -1., 4.]])  

X_test_minmax = min_max_scaler.transform(X_test) #out: array([[-1.5 ,  0. , 1.66666667]])

#可以用以下方法查看scaler的属性
min_max_scaler.scale_        #out: array([ 0.5 ,  0.5,  0.33...])
min_max_scaler.min_         #out: array([ 0.,  0.5,  0.33...])

MaxAbsScaler(绝对值最大标准化)

与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。

X_train = np.array([[ 1., -1.,  2.],
                     [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
                    
max_abs_scaler = preprocessing.MaxAbsScaler()

X_train_maxabs = max_abs_scaler.fit_transform(X_train)

# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])

X_test = np.array([[ -3., -1.,  4.]])

X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])

max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])

均值方差归一化

均值方差归一化是把所有数据归一到均值为0方差为1的分布中:
xscale=xxmeansx_{scale}=\frac{x-x_{mean}}{s}xscale​=sx−xmean​​

from sklearn import preprocessing 

import numpy as np  

X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])  

X_scaled = preprocessing.scale(X) 

#output :X_scaled = [[ 0.         -1.22474487  1.33630621]
 				 [ 1.22474487  0.         -0.26726124]
 				 [-1.22474487  1.22474487 -1.06904497]]
 				  				 
#scaled之后的数据零均值,单位方差
X_scaled.mean(axis = 0)  # column mean: array([ 0.,  0.,  0.])  

X_scaled.std(axis = 0)  #column standard deviation: array([ 1.,  1.,  1.])

StandardScaler计算训练集的平均值和标准差,以便测试数据集使用相同的变换。

scaler = preprocessing.StandardScaler().fit(X)    #out: StandardScaler(copy=True, with_mean=True, with_std=True)

scaler.mean_   #out: array([ 1.,  0. ,  0.33333333])  

scaler.std_    #out: array([ 0.81649658,  0.81649658,  1.24721913]) 

#测试将该scaler用于输入数据,变换之后得到的结果同上
scaler.transform(X) #out: array([[ 0., -1.22474487,  1.33630621],        [ 1.22474487, 0. , -0.26726124],  [-1.22474487,1.22474487, -1.06904497]])  

scaler.transform([[-1., 1., 0.]])  #scale the new data, out: array([[-2.44948974,  1.22474487, -0.26726124]])

学习总结来源:
机器学习系列(九)——数据归一化及Sklearn中的Scaler
机器学习中的数据预处理(sklearn preprocessing)

上一篇:Python学习


下一篇:微信QQ发送消息时间提示