Python數據預處理 - 歸一化與標準化

目錄

歸一化

數據歸一化的背景介紹

MinMaxScaler:歸一到 [ 0,1 ] 

MaxAbsScaler:歸一到 [ -1,1 ] 

標準化

去均值,方差規模化



歸一化

數據歸一化的背景介紹

在之前做聚類分析的時候我們發現,聚類的效果往往特別受其中一列數據的影響,使得原本應該散佈在二維平面圖上的點,變成聚集在一條線上的點,可想而知,其聚類效果肯定不理想。

左圖:爲所有數據都歸一化之後的聚類分析散點圖;

右圖:爲其中一列是合同金額,並且沒有歸一化數據的散點圖;

歸一化方法有兩種形式,一種是把數變爲(0,1)之間的小數,一種是把有量綱表達式變爲無量綱表達式,成爲純量。後者常見於微波之中,也就是電路分析、信號系統、電磁波傳輸等,研究物理的人會比較熟悉。而像我們這些普通的數據分析師的日常工作中,不太會遇見需要歸一化爲無量綱表達式的情況,因此只討論歸一化到 [0,1] 的情況。

歸一化一般是把數據映射到 [ 0,1 ] ,但也有歸一到  [ -1,1 ] 的情況,兩種情況在Python中分別可以通過MinMaxScaler 或者 MaxAbsScaler方法來實現。

 

MinMaxScaler:歸一到 [ 0,1 ] 

原理

X_scaled = \frac{ (X - X.min(axis=0)) }{ (X.max(axis=0) - X.min(axis=0))} \cdot (max - min)+min

從原理中我們注意到有一個axis=0,這表示MinMaxScaler方法默認是對每一列做這樣的歸一化操作,這也比較符合實際應用。

eg:將數據歸一到 [ 0,1 ] 

from sklearn import preprocessing
import numpy as np

x = np.array([[3., -1., 2., 613.],
              [2., 0., 0., 232],
              [0., 1., -1., 113],
              [1., 2., -3., 489]])

min_max_scaler = preprocessing.MinMaxScaler()
x_minmax = min_max_scaler.fit_transform(x)
print(x_minmax)

運行結果:

[[1.         0.         1.         1.        ]
 [0.66666667 0.33333333 0.6        0.238     ]
 [0.         0.66666667 0.4        0.        ]
 [0.33333333 1.         0.         0.752     ]] 

如果有新的測試數據進來,也想做同樣的轉換,那麼將新的測試數據添加到原數據末尾即可

from sklearn import preprocessing
import pandas as pd

min_max_scaler = preprocessing.MinMaxScaler()

x = ([[3., -1., 2., 613.],
              [2., 0., 0., 232],
              [0., 1., -1., 113],
              [1., 2., -3., 489]])#原數據

y = [7., 1., -4., 987]#新的測試數據
x.append(y)#將y添加到x的末尾
print('x :\n', x)
x_minmax = min_max_scaler.fit_transform(x)
print('x_minmax :\n', x_minmax)

運行結果:

x :
 [[3.0, -1.0, 2.0, 613.0], [2.0, 0.0, 0.0, 232], [0.0, 1.0, -1.0, 113], [1.0, 2.0, -3.0, 489], [7.0, 1.0, -4.0, 987]]
x_minmax :
 [[0.42857143 0.         1.         0.57208238]
 [0.28571429 0.33333333 0.66666667 0.13615561]
 [0.         0.66666667 0.5        0.        ]
 [0.14285714 1.         0.16666667 0.43020595]
 [1.         0.66666667 0.         1.        ]]

每一列特徵中的最小值變成了0,最大值變成了1.

 


MaxAbsScaler:歸一到 [ -1,1 ] 

原理與MinMaxScaler相似,

from sklearn import preprocessing
import numpy as np

x = np.array([[3., -1., 2., 613.],
              [2., 0., 0., 232],
              [0., 1., -1., 113],
              [1., 2., -3., 489]])
max_abs_scaler = preprocessing.MaxAbsScaler()
x_train_maxsbs = max_abs_scaler.fit_transform(x)
x_train_maxsbs

運行結果:

array([[ 1.        , -0.5       ,  0.66666667,  1.        ],
       [ 0.66666667,  0.        ,  0.        ,  0.37846656],
       [ 0.        ,  0.5       , -0.33333333,  0.18433931],
       [ 0.33333333,  1.        , -1.        ,  0.79771615]])

 如果有新的測試數據進來,和原來的表一起進行歸一化:

from sklearn import preprocessing
import pandas as pd

max_abs_scaler = preprocessing.MaxAbsScaler()

x = ([[3., -1., 2., 613.],
              [2., 0., 0., 232],
              [0., 1., -1., 113],
              [1., 2., -3., 489]])#原數據

y = [5., 1., -4., 888]#新的測試數據
x.append(y)
print('x :\n', x)
x_train_maxsbs = max_abs_scaler.fit_transform(x)
print('x_train_maxsbs :\n', x_train_maxsbs)

運行結果:

x :
 [[3.0, -1.0, 2.0, 613.0], [2.0, 0.0, 0.0, 232], [0.0, 1.0, -1.0, 113], [1.0, 2.0, -3.0, 489], [5.0, 1.0, -4.0, 888]]
x_train_maxsbs :
 [[ 0.6        -0.5         0.5         0.69031532]
 [ 0.4         0.          0.          0.26126126]
 [ 0.          0.5        -0.25        0.12725225]
 [ 0.2         1.         -0.75        0.55067568]
 [ 1.          0.5        -1.          1.        ]]

 


標準化

去均值,方差規模化

數據分析的過程中,比如線性規劃這一類的分析,如果有些特徵的數值遠遠高於或低於其他數值,通常稱之爲獨立點、異常值或噪點,那麼對於受噪點影響較大的模型就無法正確地去學習其他特徵。如下圖所示(左圖爲受噪點影響,右圖爲無噪點影響的曲線擬合)

      

Standardization標準化:將特徵數據的分佈調整成標準正太分佈,也叫高斯分佈,過程爲兩步:去均值的中心化(均值變爲0);方差的規模化(方差變爲1)。

在sklearn.preprocessing中有一個scale方法,可以實現數據標準化,該方法默認按照列進行標準化。

from sklearn import preprocessing
import numpy as np

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

print("標準化之前的方差:", x.mean(axis=0))
print("標準化之前的標準差:", x.std(axis=0))

#標準化
x_scale = preprocessing.scale(x)
print("\n------------------\n標準化結果:\n", x_scale)
print("\n標準化之後的方差:", x_scale.mean(axis=0))
print("標準化之後的標準差:", x_scale.std(axis=0))

運行結果:

標準化之前的方差: [ 1.   0.5 -0.5  0.5]
標準化之前的標準差: [0.70710678 1.11803399 1.80277564 1.80277564]

------------------
標準化結果:
 [[ 0.         -1.34164079  1.38675049  1.38675049]
 [ 1.41421356 -0.4472136   0.2773501  -1.38675049]
 [-1.41421356  0.4472136  -0.2773501  -0.2773501 ]
 [ 0.          1.34164079 -1.38675049  0.2773501 ]]

標準化之後的方差: [0. 0. 0. 0.]
標準化之後的標準差: [1. 1. 1. 1.]

 

OVER!

其他數據預處理方法

拉格朗日插值法補充缺失值

連續數據離散化(等寬、等頻、聚類離散)

清洗你見過的各種類型的重複​​​​​​​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章