天天看點

常用資料預處理技術(python實作)一、特征規範化方法1. 均值移除( Mean removal)

一、特征規範化方法

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其他值都是0的K維向量。

#獨熱編碼
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)
           
結果:
           

在上面的示例中,觀察一下每個特征向量的第三個特征,分别是1、 5、 2、 4這4個不重複的值(從小打大),也就是說獨熱編碼向量的長度是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) #反轉标記為原始單詞
           

繼續閱讀