在機器學習任務中,經常會對數據進行預處理.如尺度變換,標准化,二值化,正規化.至於采用哪種方法更有效,則與數據分布和采用算法有關.不同算法對數據的假設不同,可能需要不同的變換,而且有時無需進行變換,也可能得到相對更好的效果.因此推薦使用多種數據變換方式,用多個不同算法學習和測試,選擇相對較好的變換方式和算法.
下面對在 Python scikit-learn 庫(也稱 sklearn 庫)中的預處理過程進行介紹:
1. 加載數據集;
2. 將數據集分為用於機器學習的輸入變量和輸出變量;
3. 對輸入變量進行變換(或預處理);
4. 顯示變換結果(可選).
本文采用 scikit-learn 庫自帶的鳶尾花數據集(Iris Plants Database)作為示例.
首先,加載數據集,獲取輸入變量 X 和輸出變量 y ,示例代碼如下:
from sklearn import datasets import numpy as np data = datasets.load_iris() X, y = data.data, data.target np.set_printoptions(precision=3) print ("\n" "Preprocess input variables: " "\n") print ("Raw Data: ") print (X[:5, :])
然后,變換輸入變量 X (類型為 <type 'numpy.ndarray'>),具體變換如下:
尺度變換
將輸入變量變換到某一范圍,如 0 ~ 1 區間.在 sklearn 庫中,使用 MinMaxScaler 類實現.常用於類似梯度下降的優化算法,回歸和神經網絡中的加權輸入,以及類似 K 近鄰的距離度量.示例代碼如下:
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler(feature_range=(0,1)) rescaledX = scaler.fit_transform(X) # Print transformed data
print ("\nRescaled Data: ") print(rescaledX[0:5,:])
標准化
通常適用於高斯分布的輸入變量.具體來說,將輸入變量中的每個屬性值減去其平均值,然后除以標准差,得到標准正態分布的屬性值.在 sklearn庫中,使用 StandardScaler 類實現.常用於假定輸入變量高斯分布的線性回歸,Logistic回歸和線性判決分析.
from sklearn.preprocessing import StandardScaler scaler = StandardScaler().fit(X) standardizedX = scaler.transform(X)
print ("\nStandardized Data: ") print (standardizedX[0:5,:])
正規化
將輸入變量變換為具有單位范數長度的數據.常用的范數有L1,L2,詳見我之前的博文 "數據正規化 (data normalization) 的原理及實現 (Python sklearn)". 在 sklearn 庫中,使用 Normalizer 類實現.常用於含有許多 0 的稀疏數據集,像神經網絡的采用加權輸入的算法和像 K 近鄰采用距離度量的算法.
from sklearn.preprocessing import Normalizer scaler = Normalizer().fit(X) normalizedX = scaler.transform(X) print ("\nNormalized Data: ") print (normalizedX[0:5,:])
二值化
使用門限值,將輸入數據二值化.當輸入變量值大於門限值時,變換為 1;當輸入變量值小於或等於門限值時,變換為 0.在 sklearn 庫中,使用 Binarizer 類實現.常用於獲取清晰的值的概率,產生新的有意義的屬性的特征工程.
from sklearn.preprocessing import Binarizer binarizer = Binarizer(threshold=0.0).fit(X) binaryX = binarizer.transform(X) print ("\nBinarized Data: ") print (binaryX[0:5,:])
參考資料
Jason Brownlee. How To Prepare Your Data For Machine Learning in Python with Scikit-Learn.
https://machinelearningmastery.com/prepare-data-machine-learning-python-scikit-learn/