歸一化:把變量變為0-1之間的數。標准化:變為均值為0,標准差為1。正則化:即對矩陣加懲罰,求l1或l2范數,然后除以這個范數,自定義正則化函數,也是用矩陣除以這個正則化函數的值。。應該對總的范數變小就是加懲罰。
0.參考文獻
關於使用sklearn進行數據預處理 —— 歸一化/標准化/正則化
2017.6.3更新:
數據標准化/歸一化normalization
歸一化與標准化
2017.6.3更新:
數據標准化/歸一化normalization
歸一化與標准化
1.標准化
用的最多的是 z-score標准化
公式為 (X - mean)/ std1
計算時對每個屬性(每列)分別進行。
將數據按其屬性(一般是按列)減去其均值,並除以其標准差,得到的結果是,對每個屬性來說,所有數據都聚集在0附近,方差為1.
實現方式:
1. 使用sklearn.preprocessing.scale()函數,可以直接將給定數據進行標准化。
將數據按其屬性(一般是按列)減去其均值,並除以其標准差,得到的結果是,對每個屬性來說,所有數據都聚集在0附近,方差為1.
實現方式:
1. 使用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])123456789101112131415
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])123456789101112131415
2.
使用sklearn.preprocessing.StandardScaler類,使用該類的好處在於可以保存訓練集中的參數(均值、方差)直接使用其對象轉換測試集數據。
使用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.transform(X)
array([[ 0. ..., -1.22..., 1.33...],
[ 1.22..., 0. ..., -0.26...],
[-1.22..., 1.22..., -1.06...]])123456789
>>>scaler
StandardScaler(copy=True,with_mean=True,with_std=True)
>>>scaler.mean_
>array([1,0,0.33])
>>>scaler.transform(X)
array([[ 0. ..., -1.22..., 1.33...],
[ 1.22..., 0. ..., -0.26...],
[-1.22..., 1.22..., -1.06...]])123456789
2. 歸一化
將屬性縮放到一個指定范圍(比如0-1)
另一種常用的方法是將屬性縮放到一個指定的最大值和最小值之間,這可以通過preprocessing.MinMaxScaler類實現。
使用這種方法的目的包括:
1. 把數變為(0,1)之間的小數,方便數據處理
2. 把有量綱表達式變為無量綱表達式
歸一化的好處:
另一種常用的方法是將屬性縮放到一個指定的最大值和最小值之間,這可以通過preprocessing.MinMaxScaler類實現。
使用這種方法的目的包括:
1. 把數變為(0,1)之間的小數,方便數據處理
2. 把有量綱表達式變為無量綱表達式
歸一化的好處:
提升模型收斂速度
如下圖,x1的取值為0-2000,而x2的取值為1-5,假如只有這兩個特征,對其進行優化時,會得到一個窄長的橢圓形,導致在梯度下降時,梯度的方向為垂直等高線的方向而走之字形路線,這樣會使迭代很慢,相比之下,右圖的迭代就會很快
提升模型的精度
歸一化的另一好處是提高精度,這在涉及到一些距離計算的算法時效果顯著,比如算法要計算歐氏距離,上圖中x2的取值范圍比較小,涉及到距離計算時其對結果的影響遠比x1帶來的小,所以這就會造成精度的損失。所以歸一化很有必要,他可以讓各個特征對結果做出的貢獻相同
歸一化的另一好處是提高精度,這在涉及到一些距離計算的算法時效果顯著,比如算法要計算歐氏距離,上圖中x2的取值范圍比較小,涉及到距離計算時其對結果的影響遠比x1帶來的小,所以這就會造成精度的損失。所以歸一化很有必要,他可以讓各個特征對結果做出的貢獻相同
1.對於方差非常小的屬性可以增強其穩定性
2.維持稀疏矩陣中為0的條目
常見的歸一化方法:
min-max標准化(Min-max normalization)
也叫 離差標准化
(x-min)/(max-min)
(x-min)/(max-min)
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)
>>> X_train_minmax
array([[ 0.5 , 0. , 1. ],
[ 1. , 0.5 , 0.33333333],
[ 0. , 1. , 0. ]])
#將相同的縮放應用到測試集數據中
X_test = np.array([[-3, -1, 4]])
X_test_minmax = min_max_scler.transform(X_test)
>>> X_test_minmax
array([[-1.5 , 0. , 1.66666667]])
[2,0,0],
[0,1,-1]])
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
>>> X_train_minmax
array([[ 0.5 , 0. , 1. ],
[ 1. , 0.5 , 0.33333333],
[ 0. , 1. , 0. ]])
#將相同的縮放應用到測試集數據中
X_test = np.array([[-3, -1, 4]])
X_test_minmax = min_max_scler.transform(X_test)
>>> X_test_minmax
array([[-1.5 , 0. , 1.66666667]])
#縮放因子等屬性
>>>min_max_scaler.scale_
array([0.5, 0.5, 0.33])
>>>min_max_scaler.min_
array([0, 0.5, 0.33])
>>>min_max_scaler.scale_
array([0.5, 0.5, 0.33])
>>>min_max_scaler.min_
array([0, 0.5, 0.33])
在構造對象時也可以直接指定最大最小值的范圍:feature_range=(min, max),此時公式變為:
X_std = (X - X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))
X_scaled= X_std/(max-min)+min
12345678910111213141516171819202122232425
X_std = (X - X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))
X_scaled= X_std/(max-min)+min
12345678910111213141516171819202122232425
log歸一化
max為樣本數據最大值,並且所有的數據都要大於等於1,這樣才能落到[0,1]范圍內。
3.正則化(Normalization)
正則化:將每個樣本縮放到單位范數(每個樣本的范數為1),如果后面要使用如二次型(點積)或者其他核函數方法計算兩個樣本之間的相似性,這個方法會很有用。
Normalization主要思想是對每個樣本計算其p-范數,然后對該樣本中每個元素除以該范數,這樣處理的結果是是的每個處理后樣本的p-范數(L1-norm, L2-norm)等於1。
p-范數的計算公式:||x||p=(|x1|^p+|x2|^p+…+|xn|^p)^(1/p)
該方法主要應用在文本分類和聚類中。例如,對於兩個TF-IDF向量的I2-norm進行點積,就可以得到這兩個向量的余弦相似性。
Normalization主要思想是對每個樣本計算其p-范數,然后對該樣本中每個元素除以該范數,這樣處理的結果是是的每個處理后樣本的p-范數(L1-norm, L2-norm)等於1。
p-范數的計算公式:||x||p=(|x1|^p+|x2|^p+…+|xn|^p)^(1/p)
該方法主要應用在文本分類和聚類中。例如,對於兩個TF-IDF向量的I2-norm進行點積,就可以得到這兩個向量的余弦相似性。
1.可以使用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...]])12345678
[ 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...]])12345678
怎么算出來的呢?
按行算:
[1,-1,2]的L2范數是(1^2+(-1)^2+2^2)^(1/2)=6^(1/2)=2.45
第一行的每個元素除以L2范數,得到:
[1/2.45, -1/2.45, 2/2.45] = [0.4, -0.4, 0.8..]
第二行和第一行一樣,也是算自己的L2范數:(2^2+0^2+0^2)^(1/2)=2,
[ 2/2, 0/2, 0/2]=[1,0,0]……123456
[1,-1,2]的L2范數是(1^2+(-1)^2+2^2)^(1/2)=6^(1/2)=2.45
第一行的每個元素除以L2范數,得到:
[1/2.45, -1/2.45, 2/2.45] = [0.4, -0.4, 0.8..]
第二行和第一行一樣,也是算自己的L2范數:(2^2+0^2+0^2)^(1/2)=2,
[ 2/2, 0/2, 0/2]=[1,0,0]……123456
2.可以使用processing.Normalizer()類實現對訓練集合測試集的擬合和轉換:
normalizer = preprocessing.Normalizer().fit(X) # fit does nothing
>>>normalizer
Normalizer(copy=True, norm='l2')
>>>normalizer
Normalizer(copy=True, norm='l2')
>>>normalizer.transform(X)
array([[ 0.40..., -0.40..., 0.81...],
[ 1. ..., 0. ..., 0. ...],
[ 0. ..., 0.70..., -0.70...]])
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. ...]])
---------------------
作者:power0405hf
來源:CSDN
原文:https://blog.csdn.net/power0405hf/article/details/53456162
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
array([[-0.70..., 0.70..., 0. ...]])
---------------------
作者:power0405hf
來源:CSDN
原文:https://blog.csdn.net/power0405hf/article/details/53456162
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!