資料歸一化,標準化,正則話的聯絡與區別
資料處理的features engineering過程中,常常需要根據演算法的input資料格式對資料進行預處理,對數值性數的表處理可以提高演算法的精度,保證演算法的可信度。常用的資料處理辦法有資料歸一化,標準話和正則話。
1:資料歸一化(Normalization)
1.把資料變為(0,1)之間的小數。主要是為了方便資料處理,因為將資料對映到0~1範圍之內,可以使處理過程更加便捷、快速。
2.把有量綱表示式變換為無量綱表示式,成為純量。經過歸一化處理的資料,處於同一數量級,可以消除指標之間的量綱和量綱單位的影響,提高不同資料指標之間的可比性。
主要演算法:
y=(x-min)/(max-min)
2. 對數函式轉換
y=log10(x)
3.反餘切函式轉換
y=atan(x)*2/PI
sklearn中preprocessing.MinMaxScaler類集成了歸一化方法,可以實現:
1、對於方差非常小的屬性可以增強其穩定性。
2、維持稀疏矩陣中為0的條目。
例子:
>>> from sklearn.preprocessing import MinMaxScaler >>> >>> data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]] >>> scaler = MinMaxScaler() >>> print(scaler.fit(data)) MinMaxScaler(copy=True, feature_range=(0, 1)) >>> print(scaler.data_max_) [ 1. 18.] >>> print(scaler.transform(data)) [[ 0. 0. ] [ 0.25 0.25] [ 0.5 0.5 ] [ 1. 1. ]] >>> print(scaler.transform([[2, 2]])) [[ 1.5 0. ]]
2:標準化(Standardization)
資料的標準化是將資料按比例縮放,使之落入一個小的特定區間。
主要方法:
1.z-score標準化,即零-均值標準化(常用方法)
y=(x-μ)/σ
是一種統計的處理,基於正態分佈的假設,將資料變換為均值為0、標準差為1的標準正態分佈。但即使資料不服從正態分佈,也可以用此法。特別適用於資料的最大值和最小值未知,或存在孤立點。
2.小數定標標準化
y=x/10^j (j確保max(|y|)<1)
通過移動x的小數位置進行標準化
3.對數Logistic模式
y=1/(1+e^(-x))
使用sklearn.preprocessing.scale()函式,可以直接將給定資料進行標準化。
>>> 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)
>>> X_scaled
array([[ 0. ..., -1.22..., 1.33...],
[ 1.22..., 0. ..., -0.26...],
[-1.22..., 1.22..., -1.06...]])
>>>#處理後資料的均值和方差
>>> X_scaled.mean(axis=0)
array([ 0., 0., 0.])
>>> X_scaled.std(axis=0)
array([ 1., 1., 1.])
使用sklearn.preprocessing.StandardScaler類,使用該類的好處在於可以儲存訓練集中的引數(均值、方差)直接使用其物件轉換測試集資料。
>>> scaler = preprocessing.StandardScaler().fit(X)
>>> scaler
StandardScaler(copy=True, with_mean=True, with_std=True)
>>> scaler.mean_
array([ 1. ..., 0. ..., 0.33...])
>>> scaler.std_
array([ 0.81..., 0.81..., 1.24...])
>>> scaler.transform(X)
array([[ 0. ..., -1.22..., 1.33...],
[ 1.22..., 0. ..., -0.26...],
[-1.22..., 1.22..., -1.06...]])
>>>#可以直接使用訓練集對測試集資料進行轉換
>>> scaler.transform([[-1., 1., 0.]])
array([[-2.44..., 1.22..., -0.26...]])
3 正則化(Regularization)
用一組與原不適定問題相“鄰近”的適定問題的解,去逼近原問題的解,這種方法稱為正則化方法。如何建立有效的正則化方法是反問題領域中不適定問題研究的重要內容。通常的正則化方法有基於變分原理的Tikhonov 正則化、各種迭代方法以及其它的一些改進方法。
Normalization主要思想是對每個樣本計算其p-範數,然後對該樣本中每個元素除以該範數,這樣處理的結果是使得每個處理後樣本的p-範數(l1-norm,l2-norm)等於1。
p-範數的計算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p
該方法主要應用於文字分類和聚類中。例如,對於兩個TF-IDF向量的l2-norm進行點積,就可以得到這兩個向量的餘弦相似性。
- 可以使用preprocessing.normalize()函式對指定資料進行轉換:
>>> X = [[ 1., -1., 2.],
... [ 2., 0., 0.],
... [ 0., 1., -1.]]
>>> X_normalized = preprocessing.normalize(X, norm='l2')
>>> X_normalized
array([[ 0.40..., -0.40..., 0.81...],
[ 1. ..., 0. ..., 0. ...],
[ 0. ..., 0.70..., -0.70...]])
- 可以使用processing.Normalizer()類實現對訓練集和測試集的擬合和轉換:
>>> normalizer = preprocessing.Normalizer().fit(X) # fit does nothing
>>> normalizer
Normalizer(copy=True, norm='l2')
>>>
>>> normalizer.transform(X)
array([[ 0.40..., -0.40..., 0.81...],
[ 1. ..., 0. ..., 0. ...],
[ 0. ..., 0.70..., -0.70...]])
>>> normalizer.transform([[-1., 1., 0.]])
array([[-0.70..., 0.70..., 0. ...]])
總的來說,歸一化是為了消除不同資料之間的量綱,方便資料比較和共同處理,比如在神經網路中,歸一化可以加快訓練網路的收斂性;標準化是為了方便資料的下一步處理,而進行的資料縮放等變換,並不是為了方便與其他資料一同處理或比較,比如資料經過零-均值標準化後,更利於使用標準正態分佈的性質,進行處理;正則化而是利用先驗知識,在處理過程中引入正則化因子(regulator),增加引導約束的作用,比如在邏輯迴歸中使用正則化,可有效降低過擬合的現象。
參考:https://www.cnblogs.com/chaosimple/p/4153167.html
https://blog.csdn.net/zyf89531/article/details/45922151