1、標准化(中心化)
在許多機器學習執行前,需要對數據集進行標准化處理。因為很對算法假設數據的特征服從標准正態分布。所以如果不對數據標准化,那么算法的效果會很差。
例如,在學習算法的目標函數,都假設數據集的所有特征集中在0附近,並且有相同的方差。如果某個特征的方差遠大於其他特征的方差,那么該特征可能在目標函數占的權重更大,使得算法不能從所有特征中學習。
在實踐中,我們往往忽略了分布的形狀,只需要通過減去每個特征的均值,然后除以非標准特征的標准偏差來轉換數據。
scale方法提供了在一個類似數據的數據集上執行操作的簡便方法:
from sklearn import preprocessing
X_scaled = preprocessing.scale(X)
preprocessing模塊還提供了一種使用類:StandardScaler,主要計算訓練集的均值和標准差,然后應用在測試集的轉換上
scaler = preprocessing.StandardScaler().fit(X)
sscaler.transform(X)
1.1將特征縮放到一個范圍
另一種標准化方法是將特征值縮放到在一個給定的最小值和最大值之間,通常是0~1;或者每個特征的最大絕對值被縮放到單位大小。該方法可以分別通過MinMaxScaler或者MaxAbsScaler實現。
使用范圍:特征對非常小的標准差的魯棒性和希望在稀疏數據中保存零項
Example1:
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
Example2:
max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
1.2稀疏數據縮放
對稀疏數據中心化處理會破壞數據的稀疏性結構,所以很少對稀疏數據中心化。但是如果特征在不同的方差下,依然需要對數據進行縮放。
類MaxAbsScaler和方法maxabs_scale是專門用來對稀疏數據進行縮放的。
1.3、離群點的縮放
如果數據集中包含很多離群點,那么使用數據的均值方差進行縮放的效果不會很好。
在這種情況下,可以使用方法robust_scale和類RobustScaler來進行替換,它們對數據的均值和方差使用更健壯的估計
1.4、中心化核矩陣
如果有一個核K的核矩陣,通過定義的函數phi計算特征空間的點積,使用類KernelCenterer可以變換核矩陣,它包含去除特征空間均值后,再利用phi計算特征空間的內積。
2、歸一化
歸一化是將單個樣本縮放為單位范數的過程。如果使用一個二次形式,例如點積或其他任何內核來量化一對樣本的相似度,這個步驟會很有必要。這個步驟是向量空間模型的基礎,常被用於文本分類和聚類中。
normalize方法提供了快速簡單的方法來對單個array數據集進行歸一化,可以選擇L1或者L2范數。
preprocessing.normalize(X, norm='l2')
preprocessing模塊還提供了類Normalizer,通過方法Transformer API對另一數據集執行同樣的操作。
normalizer = preprocessing.Normalizer().fit(X)
normalizer.transform(X)
注:normalize和Normalizer同樣適用於類似array的稠密的或者稀疏的矩陣。
3、二值化
特征二值化是對數值特征進行閾值化以得到布爾值的過程。這對於假設輸入數據服從多變量伯努利分布的后驗分布的估計是有用的。例如,在sklearn.neural_network.BernoulliRBM的使用時需要二值化。
在文本處理中經常使用二值特征(可能是為了簡化推理過程),例如在計數或者TF-IDF特征值中,使用二值特征能夠更有效。
類Binarizer是專門用於二值化的,例如:
preprocessing.Binarizer().fit(X)或者preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)
preprocessing模塊提供binarize方法來對特征進行二值化處理。
4、種類特征編碼
在很多情況下,特征值不是連續的值而是種類。例如,一個人可能的特征是[male, female]等等,這些特征可以用整數值來進行編碼。
在scikit-learn中,將種類特征用1-of-k或者one-hot編碼。預處理模塊中有OneHotEncoder來對種類特征編碼,通常是m個可能的種類用m個值來表示。例如:
preprocessing.OneHotEncoder()
默認情況下,m值時通過數據集自動推斷出來的。例如,數據集中有2種性別,三種可能的地方,4中可能的瀏覽器。然后在編碼時,在9列的array數組中,前2個數字編碼性別,接下來3個數字編碼地方,最后4個數字編碼瀏覽器。
5、缺失值處理
由於各種原因,許多現實世界的數據集包含缺失值,通常變為為空白、NaN或其他占位符。使用不完整數據集的基本策略是丟棄包含缺失值的整行或整列,然而這樣會丟失可能有價值的數據。一個更好的策略就是從已知的部分數據中推斷出缺失值。
Imputer類提供了基本的策略來填充缺失值,可以用行或者列的均值、中位數或眾數來填充缺失值。例如:
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
X = [[np.nan, 2], [6, np.nan], [7, 6]]
imp.transform(X)
該類還支持稀疏矩陣(將缺失值編碼為0),將稀疏矩陣填充為稠密的矩陣。
6、生成多項式特征
通常,通過考慮輸入數據的非線性特征來增加模型的復雜度是很有用的。一個簡單常用的方法是多項式特征,它可以得到特征的高階和相互作用項。
PolynomialFeatures類可以用來生成多項式特征。
poly = PolynomialFeatures(2)
poly.fit_transform(X)
上述將(X1, X2)轉化為(1, X1, X2, X12, X1X2, X22)
應用范圍:多樣式特征常用於核方法中(SVM, 核PCA)
PS:該內容從sklearn數據預處理模塊整理,具體方法和類的使用可以在sklearn官網上查詢:http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing