數據歸一化Scaler-機器學習算法


//2019.08.03下午
#機器學習算法的數據歸一化(feature scaling)
1、數據歸一化的必要性
對於機器學習算法的基礎訓練數據,由於數據類型的不同,其單位及其量綱也是不一樣的,而也正是因為如此,有時它會使得訓練集中每個樣本的不同列數據大小差異較大,即數量級相差比較大,這會導致在機器學習算法中不同列數據的權重很大的差異,數量級大的數據所體現出來的影響會遠遠大於數量級小的數據(比如樣本中不同列數據對k-近鄰算法中歐拉距離大小的影響會因為數據的數量級而存在很大差異)。基於以上的問題,我們需要對於樣本的每一行數據進行歸一化處理,消除其大小尺寸對於算法訓練效果的影響。


圖1
2、數據歸一化的處理方式:
(1)最值歸一化處理方式(normalization)
將樣本每一列屬性數據統一歸一化映射到0-1之間,最常用方法如下:


圖2
這個方法是比較方便簡單的歸一化處理方式,主要適用於具有邊界的數據(比如學生成績,圖片的像素點特征值等)
(2)均值方差歸一化處理方式(standardization)
將數據歸一化到正負數之間,最終處理為均值為0,方差為1的正態分布中,這種處理方式適用於數據分布沒有明顯的邊界,數據中存在一些極端的數據值;而對於明顯存在數據邊界的數據也是比較適合的。


圖3
綜上所述,對於一般的數據分布采用均值方差歸一化的方法是比較普適的。
3、數據歸一化原理代碼實現舉例:
import numpy as np
import matplotlib.pyplot as plt
x=np.random.randint(1,100,(50,2))
print(x)
x=np.array(x,dtype=float)
print(x)
x[:,0]=(x[:,0]-np.min(x[:,0]))/(np.max(x[:,0])-np.min(x[:,0]))
x[:,1]=(x[:,1]-np.min(x[:,1]))/(np.max(x[:,1])-np.min(x[:,1])) #1均值歸一化處理實現
print(x)
plt.figure()
plt.scatter(x[:,0],x[:,1],color="r")
print(np.mean(x[:,0]))
print(np.std(x[:,0]))
print(np.mean(x[:,1]))
print(np.std(x[:,1]))
x[:,0]=(x[:,0]-np.mean(x[:,0]))/(np.std(x[:,0]))
x[:,1]=(x[:,1]-np.mean(x[:,1]))/(np.std(x[:,1])) #2均值方差歸一化處理方式
print(x)
plt.scatter(x[:,0],x[:,1],color="g")
plt.show()
print(np.mean(x[:,0]))
print(np.std(x[:,0]))
print(np.mean(x[:,1]))
print(np.std(x[:,1]))


圖4
4、對於測試數據是用來模擬真實環境下的數據,而真實數據是沒有固定的均值和方差的,因此在對測試數據進行處理的時候不可以利用已有測試數據集的均值與方差進行數據歸一化處理,也需要使用訓練數據集的平均值和方差進行相應的歸一化處理.
5、在scikitlearn中有函數Scaler對於訓練數據和測試數據進行相應的歸一化,其歸一化方式也有多種方式,常用的還是之前講過的均值歸一化MinMaxScaler和均值方差歸一化函數StandardScaler,其歸一化原理如上所講。

具體k-近鄰算法的整體數據歸一化處理、訓練以及預測過程在scikitlearn中調用如下:
import numpy as np
from sklearn import datasets

#導入訓練的數據集
iris=datasets.load_iris()
x=iris.data
y=iris.target #初始化屬性數據和標記數據
print(x[:10])

#對於數據進行相應預處理(分割為訓練集和測試集數據)
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=666)

#1-1對於x_train利用均值方差StandardScaler進行歸一化處理
from sklearn.preprocessing import StandardScaler
standardscaler=StandardScaler()
standardscaler.fit(x_train)
print(standardscaler.mean_) #平均值向量
print(standardscaler.scale_) #標准差向量
print(standardscaler.transform(x_train))
x_train=standardscaler.transform(x_train)
print(x_train)
x_test_standard=standardscaler.transform(x_test)

#導入相應的機器學習算法模塊
from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsClassifier(n_neighbors=3)
knn.fit(x_train,y_train)
print(knn.score(x_test_standard,y_test))

#1-2對於x_train利用均值MinMaxScaler進行歸一化處理(整體過程與上面類似)
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=666)
from sklearn.preprocessing import MinMaxScaler
standardscaler1=MinMaxScaler()
standardscaler1.fit(x_train)
x_train=standardscaler1.transform(x_train)
print(x_train)
x_test_standard1=standardscaler1.transform(x_test)
from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsClassifier(n_neighbors=3)
knn.fit(x_train,y_train)
print(x_test_standard1)
print(knn.score(x_test_standard1,y_test))

運行結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM