Python機器學習-資料預處理技術 標準化處理、歸一化、二值化、獨熱編碼、標記編碼總結
資料預處理技術
機器是看不懂絕大部分原始資料的,為了讓讓機器看懂,需要將原始資料進行預處理。
引入模組和資料
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]])
#第0軸長度為3,第1軸長度為4
1
2
3
4
5
6
7
知識前備
線性變換的特徵向量(本徵向量)是一個非簡併的向量,其方向在該變換下不變。該向量在此變換下縮放的比例稱為其特徵值(本徵值)。
一個線性變換通常可以由其特徵值和特徵向量完全描述。特徵空間是相同特徵值的特徵向量的集合
特徵向量外文名 Eigenvector
公式:Av=λv (A:矩陣(即變換),v:特徵向量(在滿足等式的情況下),λ:特徵值(在滿足等式的情況下))
標準化處理
即保證特徵均值為0(均值移除)
資料標準化主要功能就是消除變數間的量綱關係,從而使資料具有可比性,一般標準化採用的是Z標準化,即均值為0,方差為1
data_standardized=preprocessing.scale(data)
print ("原始data\n",data)
print ("\n經過標準化處理的data\n",data_standardized)
print ("\n原始:mean = ",data.mean(axis=0))
print ("\n經過標準化處理:mean = ",data_standardized.mean(axis=0))
print ("\n原始:std deviation = ",data.std(axis=0))
print ("\n進過標準化處理:std deviation = ",data_standardized.std(axis=0))
1
2
3
4
5
6
7
8
程式碼執行結果:
原始data
[[ 3. -1.5 2. -5.4]
[ 0. 4. 0.3 2.1]
[ 1. 3.3 -1.9 -4.3]]
經過標準化處理的data
[[ 1.33630621 -1.40451644 1.16920677 -0.86687558]
[-1.06904497 0.84543708 0.10439346 1.40111286]
[-0.26726124 0.55907936 -1.27360023 -0.53423728]]
原始:mean = [ 1.33333333 1.93333333 0.13333333 -2.53333333]
經過標準化處理:mean = [ 5.55111512e-17 -1.11022302e-16 0.00000000e+00 -7.40148683e-17]
原始:std deviation = [ 1.24721913 2.44449495 1.596524 3.30689515]
進過標準化處理:std deviation = [ 1. 1. 1. 1.]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
範圍縮放
資料中的數值變化範圍可能會很大,將範圍縮放到合適的大小是非常重要的。
data_scaler=preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled=data_scaler.fit_transform(data)
print ("原始:\n",data)
print("\n經過範圍縮放:\n",data_scaled)
1
2
3
4
程式碼執行結果:
原始:
[[ 3. -1.5 2. -5.4]
[ 0. 4. 0.3 2.1]
[ 1. 3.3 -1.9 -4.3]]
經過範圍縮放:
[[ 1. 0. 1. 0. ]
[ 0. 1. 0.56410256 1. ]
[ 0.33333333 0.87272727 0. 0.14666667]]
1
2
3
4
5
6
7
8
9
歸一化
歸一化和標準化的區別
歸一化特點
對不同特徵維度的伸縮變換的目的是使各個特徵維度對目標函式的影響權重是一致的,即使得那些扁平分佈的資料伸縮變換成類圓形。
這也就改變了原始資料的一個分佈。
好處:
1 提高迭代求解的收斂速度
2 提高迭代求解的精度
標準化特點
對不同特徵維度的伸縮變換的目的是使得不同度量之間的特徵具有可比性。同時不改變原始資料的分佈。
好處:
1 使得不同度量之間的特徵具有可比性,對目標函式的影響體現在幾何分佈上,而不是數值上
2 不改變原始資料的分佈。
data_normalized=preprocessing.normalize(data,norm='l1')
print("原始:\n",data)
print("歸一化後:\n",data_normalized)
1
2
3
4
程式碼執行結果:
原始:
[[ 3. -1.5 2. -5.4]
[ 0. 4. 0.3 2.1]
[ 1. 3.3 -1.9 -4.3]]
歸一化後:
[[ 0.25210084 -0.12605042 0.16806723 -0.45378151]
[ 0. 0.625 0.046875 0.328125 ]
[ 0.0952381 0.31428571 -0.18095238 -0.40952381]]
1
2
3
4
5
6
7
8
二值化
將數值特徵向量轉換為布林型別向量。
data_binarized=preprocessing.Binarizer(threshold=1.4).transform(data)#小於等於1.4的為0,其餘為1
print("原始:\n",data)
print("二值化:\n",data_binarized)
1
2
3
程式碼執行結果:
原始:
[[ 3. -1.5 2. -5.4]
[ 0. 4. 0.3 2.1]
[ 1. 3.3 -1.9 -4.3]]
二值化:
[[ 1. 0. 1. 0.]
[ 0. 1. 0. 1.]
[ 0. 1. 0. 0.]]
1
2
3
4
5
6
7
8
獨熱編碼
對矩陣由上至下通過遍歷每一行,若該行有n個不同數值,則在獨熱編碼中佔有n個只能是0或1且只能1個1.
好處是將稀疏散亂的矩陣收緊。
encoder=preprocessing.OneHotEncoder()
encoder.fit([[0,2,1,12],[1,3,5,3],[2,3,2,12],[1,2,4,3]])
encoded_vector=encoder.transform([[2,3,5,3]]) #注意是[[ ]]
print(type(encoded_vector))
print ("encoded_vector =\n ",encoded_vector)
print ("encoded_vector = ",encoded_vector.toarray())
1
2
3
4
5
6
程式碼執行結果:
<class 'scipy.sparse.csr.csr_matrix'>
encoded_vector =
(0, 9) 1.0
(0, 8) 1.0
(0, 4) 1.0
(0, 2) 1.0
encoded_vector = [[ 0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
1
2
3
4
5
6
7
標記編碼
#(1).建立標記編碼器
label_encoder=preprocessing.LabelEncoder()
#(2) 用資料訓練編碼器
data=['name','id','health','weight','high','grade']
label_encoder.fit(data)
for i,item in enumerate(label_encoder.classes_):
print("%7s--->%d"%(item,i))
labels=['name','grade']
encoded_labels=label_encoder.transform(labels)
print("\nlabels = ",labels)
print("encoded labels = ",encoded_labels)
encoded_labels=[1,2,5,3]
labels=label_encoder.inverse_transform(encoded_labels)
print("\nencoded labels",encoded_labels)
print("labels",labels)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
程式碼執行結果:
grade--->0
health--->1
high--->2
id--->3
name--->4
weight--->5
labels = ['name', 'grade']
encoded labels = [4 0]
encoded labels [1, 2, 5, 3]
labels ['health' 'high' 'weight' 'id']