【火爐煉AI】機器學習001-資料預處理技術(均值移除,範圍縮放,歸一化,二值化,獨熱編碼)

煉丹老頑童發表於2018-08-03

【火爐煉AI】機器學習001-資料預處理技術(均值移除,範圍縮放,歸一化,二值化,獨熱編碼)

(【本文所使用的Python庫和版本號】: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

資料預處理的必要性:在真實世界中,經常需要處理大量的原始資料,這些原始資料是機器學習演算法無法理解的,所以為了讓機器學習演算法理解原始資料,需要對資料進行預處理。

最常用的資料預處理技術:


1. 均值移除(Mean removal)

把每個特徵的平均值移除,以保證特徵均值為0(即標準化處理),這樣做可以消除特徵彼此間的偏差。

###########對資料集進行Normalization#########################
import numpy as np
from sklearn import preprocessing

data=np.array([[3, -1.5, 2, -5.4],
               [0, 4,-0.3,2.1],
               [1, 3.3, -1.9, -4.3]]) # 原始資料矩陣 shape=(3,4)

data_standardized=preprocessing.scale(data)

print(data_standardized.shape)
print('Mean={}'.format(data_standardized.mean(axis=0)))
print('Mean2={}'.format(np.mean(data_standardized,axis=0)))
print('standardized: ')
print(data_standardized)
print('STD={}'.format(np.std(data_standardized,axis=0)))
複製程式碼

-------------------------------------輸---------出--------------------------------

(3, 4) Mean=[ 5.55111512e-17 -1.11022302e-16 -7.40148683e-17 -7.40148683e-17] Mean2=[ 5.55111512e-17 -1.11022302e-16 -7.40148683e-17 -7.40148683e-17] standardized: [[ 1.33630621 -1.40451644 1.29110641 -0.86687558] [-1.06904497 0.84543708 -0.14577008 1.40111286] [-0.26726124 0.55907936 -1.14533633 -0.53423728]] STD=[1. 1. 1. 1.]

--------------------------------------------完-------------------------------------

########################小**********結###############################

1, 值移除之後的矩陣每一列的均值約為0,而std為1。這樣做的目的是確保每一個特徵列的數值都在類似的資料範圍之間,防止某一個特徵列資料天然的數值太大而一家獨大。

2, 可以直接呼叫preprocessing模組中成熟的scale方法來對一個numpy 矩陣進行均值移除。

3, 求一個numpy矩陣的平均值(或std,min,max等)至少有兩種方法,如程式碼中第9行和第10行所示。

#################################################################


2. 範圍縮放(Scaling)

必要性:資料點中每個特徵列的數值範圍可能變化很大,因此,有時需要將特徵列的數值範圍縮放到合理的大小。

###########對資料集進行範圍縮放#########################
import numpy as np
from sklearn import preprocessing

data=np.array([[3, -1.5, 2, -5.4],
               [0, 4,-0.3,2.1],
               [1, 3.3, -1.9, -4.3]]) # 原始資料矩陣 shape=(3,4)

data_scaler=preprocessing.MinMaxScaler(feature_range=(0,1)) # 縮放到(0,1)之間
data_scaled=data_scaler.fit_transform(data)

print('scaled matrix: *********************************')
print(data_scaled)
複製程式碼

-------------------------------------輸---------出--------------------------------

scaled matrix: ********************************* [[1. 0. 1. 0. ] [0. 1. 0.41025641 1. ] [0.33333333 0.87272727 0. 0.14666667]]

--------------------------------------------完-------------------------------------

########################小**********結###############################

1. 值移除之後的矩陣每一列的均值約為0,而std為1。這樣做的目的是確保每一個特徵列的數值都在類似的資料範圍之間,防止某一個特徵列資料天然的數值太大而一家獨大。

2. 可以直接呼叫preprocessing模組中成熟的scale方法來對一個numpy 矩陣進行均值移除。

3. 求一個numpy矩陣的平均值(或std,min,max等)至少有兩種方法,如程式碼中第9行和第10行所示

#################################################################


3. 歸一化(Normalization)

用於需要對特徵向量的值進行調整時,以保證每個特徵向量的值都縮放到相同的數值範圍。機器學習中最常用的歸一化形式就是將特徵向量調整為L1範數,使特徵向量的數值之和為1.

###########對資料集進行Normalization#########################
import numpy as np
from sklearn import preprocessing

data=np.array([[3, -1.5, 2, -5.4],
               [0, 4,-0.3,2.1],
               [1, 3.3, -1.9, -4.3]]) # 原始資料矩陣 shape=(3,4)

data_L1_normalized=preprocessing.normalize(data,norm='l1')
print('L1 normalized matrix: *********************************')
print(data_L1_normalized)
print('sum of matrix: {}'.format(np.sum(data_L1_normalized)))

data_L2_normalized=preprocessing.normalize(data) # 預設:l2
print('L2 normalized matrix: *********************************')
print(data_L2_normalized)
print('sum of matrix: {}'.format(np.sum(data_L2_normalized)))
複製程式碼

-------------------------------------輸---------出--------------------------------

L1 normalized matrix: ********************************* [[ 0.25210084 -0.12605042 0.16806723 -0.45378151] [ 0. 0.625 -0.046875 0.328125 ] [ 0.0952381 0.31428571 -0.18095238 -0.40952381]] sum of matrix: 0.5656337535014005 L2 normalized matrix: ********************************* [[ 0.45017448 -0.22508724 0.30011632 -0.81031406] [ 0. 0.88345221 -0.06625892 0.46381241] [ 0.17152381 0.56602858 -0.32589524 -0.73755239]] sum of matrix: 0.6699999596689536

--------------------------------------------完-------------------------------------

########################小**********結###############################

1,Normaliztion之後所有的特徵向量的值都縮放到同一個數值範圍,可以確保資料點沒有因為特徵的基本性質而產生的較大差異,即確保所有資料點都處於同一個資料量,提高不同特徵資料的可比性。

2,注意和均值移除的區別:均值移除是對每一個特徵列都縮放到類似的數值範圍,每一個特徵列的均值為0,而Normalization是將全域性所有數值都縮放到同一個數值範圍。

#################################################################


4. 二值化(Binarization)

二值化用於將數值特徵向量轉換為布林型別向量。

###########對資料集進行Binarization#########################
import numpy as np
from sklearn import preprocessing

data=np.array([[3, -1.5, 2, -5.4],
               [0, 4,-0.3,2.1],
               [1, 3.3, -1.9, -4.3]]) # 原始資料矩陣 shape=(3,4)

data_binarized=preprocessing.Binarizer(threshold=1.4).transform(data)
print('binarized matrix: *********************************')
print(data_binarized)
複製程式碼

-------------------------------------輸---------出--------------------------------

binarized matrix: ********************************* [[1. 0. 1. 0.] [0. 1. 0. 1.] [0. 1. 0. 0.]]

--------------------------------------------完-------------------------------------

########################小**********結###############################

1,二值化之後的資料點都是0或者1,所以叫做二值化。

2,計算方法是,將所有大於threshold的資料都改為1,小於等於threshold的都設為0。

3,經常用於出現某種特徵(比如設為1),或者沒有出現某種特徵(設為0)的應用場合。

#################################################################


5. 獨熱編碼(One-Hot Encoding)

通常,需要處理的數值都是稀疏地,散亂地分佈在空間中,但我們並不需要儲存這些大數值,這時就需要使用獨熱編碼,獨熱編碼實際上是一種收緊特徵向量的工具。

###########對資料集進行獨熱編碼#########################
import numpy as np
from sklearn import preprocessing

data=np.array([[0,2,1,12],
               [1,3,5,3],
               [2,3,2,12],
               [1,2,4,3]]) # 原始資料矩陣 shape=(4,4)

encoder=preprocessing.OneHotEncoder()
encoder.fit(data)
encoded_vector=encoder.transform([[2,3,5,3]]).toarray()
print('one-hot encoded matrix: *********************************')
print(encoded_vector.shape)
print(encoded_vector)
複製程式碼

-------------------------------------輸---------出--------------------------------

one-hot encoded matrix: ********************************* (1, 11) [[0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]

--------------------------------------------完-------------------------------------

########################小**********結###############################

1,獨熱編碼可以縮小特徵向量的維度,將稀疏的,散亂的資料集(比如程式碼塊中的data,shape=(4,4))收縮為11維緻密矩陣(如輸出結果,shape=(1,11))。

2,編碼方式為:根據原始資料集data構建編碼器encoder,用編碼器來對新資料進行編碼。比如,第0列有三個不同值(0,1,2),故而有三個維度,即0=100,1=010,2=001;同理,第1列有兩個不同值(2,3),故而只有兩個維度,即2=10,3=01;同理,第2列有四個不同值(1,5,2,4),故而有四個維度,即1=1000,2=0100,4=0010,5=0001同理,第3列有兩個不同值(3,12),故而只有兩個維度,即3=10,12=01。所以在面對新資料[[2,3,5,3]]時,第0列的2就對應於001,第二列的3對應於01,第三列的5對應於0001,第四列的3對應於10,連線起來後就是輸出的這個(1,11)矩陣,即為讀了編碼後的緻密矩陣。

3,如果面對的新資料不存在上面的編碼器中,比如[[2,3,5,4]]時,4不存在於第3列(只有兩個離散值3和12),則輸出為00,連線起來後是[[0. 0. 1. 0. 1. 0. 0. 0. 1. 0. 0.]],注意倒數第二個數字變成了0

#################################################################


注:本部分程式碼已經全部上傳到(我的github)上,歡迎下載。

參考資料:

1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯

相關文章