1. 程式人生 > >常用資料預處理技術(python實現)

常用資料預處理技術(python實現)

一、特徵規範化方法

1. 均值移除( Mean removal

把每個特徵的平均值移除,以保證特徵均值為0(即標準化處理)。這樣做可以消除特徵彼此間的偏差(bias),變為均值為0方差為1的資料集。(x-mean)/標準差
#均值移除
from sklearn import preprocessing
data_standardized = preprocessing.scale(data)
print ("\nMean =", data_standardized.mean(axis=0))
print ("Std deviation =", data_standardized.std(axis=0))
2.
範圍縮放( Scaling
資料點中每個特徵的數值範圍可能變化很大,因此,有時將特徵的數值範圍縮放到合理的大小是非常重要的。有些演算法中,數值範圍會極大影響模型效能,需要將不同特徵縮放到同一範圍,去除數值範圍的影響,如SVM。(x-min)/(max-min)
#範圍縮放
data_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
data_scaled = data_scaler.fit_transform(data)
print ("\nMin max scaled data =", data_scaled)

3. 歸一化( Normalization

資料歸一化用於需要對特徵向量的值進行調整時,以保證每個特徵向量的值都縮放到相同的數值範圍。機器學習中最常用的歸一化形式就是將特徵向量調整為L1範數,使特徵向量的數值之和為1。這個方法經常用於確保資料點沒有因為特徵的基本性質而產生較大差異,即確保資料處於同一數量級,提高不同特徵資料的可比性。

data_normalized = preprocessing.normalize(data, norm='l1')
print ("\nL1 normalized data =", data_normalized)

4. 二值化( Binarization

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

#二值化
data_binarized = preprocessing.Binarizer(threshold=1.4).transform(data)
print ("\nBinarized data =", data_binarized)

5. 獨熱編碼
需要處理的數值通常都是稀疏地、散亂地分佈在空間中,然而,我們並不需要儲存這些大數值,這時就需要使用獨熱編碼(One-Hot Encoding)。可以把獨熱編碼看作是一種收緊tighten)特徵向量的工具。它把特徵向量的每個特徵與特徵的非重複總數相對應,通過one-of-k的形式對每個值進行編碼。特徵向量的每個特徵值都按照這種方式編碼,這樣可以更加有效地表示空間。例如,我們需要處理4維向量空間,當給一個特性向量的第n個特徵進行編碼時,編碼器會遍歷每個特徵向量的第n個特徵,然後進行非重複計數。如果非重複計數的值是K,那麼就把這個特徵轉換為只有一個值是1其他值都是0K維向量。
#獨熱編碼
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]]).toarray()
print ("\nEncoded vector =", encoded_vector)
結果:

在上面的示例中,觀察一下每個特徵向量的第三個特徵,分別是15244個不重複的值(從小打大),也就是說獨熱編碼向量的長度是4。如果你需要對5進行編碼,那麼向量就是[0, 1, 0, 0]。向量中只有一個值是1。第二個元素是1,對應的值是5。其他三個天特徵同理。

二、標記編碼方法

將單詞轉換成從0開始的索引值。

#標記編碼
input_classes = ['audi', 'ford', 'audi', 'toyota', 'ford', 'bmw']
label_encoder=preprocessing.labelEncoder() #建立標記編碼器
label_encoder.fit(input_classes) #對標記進行編碼
for i, item in enumerate(label_encoder.classes_): #顯示編碼結果
    print item, '-->', i
    
labels = ['toyota', 'ford', 'audi']
encoded_labels = label_encoder.transform(labels)#轉換新標記

encoded_labels = [2, 1, 0, 3, 1]
decoded_labels = label_encoder.inverse_transform(encoded_labels) #反轉標記為原始單詞