本文主要是對照scikit-learn的preprocessing章節結合代碼簡單的回顧下預處理技術的幾種方法,主要包括標準化、數據最大最小縮放處理、正則化、特徵二值化和數據缺失值處理。html
均值公式:apache
$$\bar{x}=\frac{1}{n} \sum_{i=1}^{n} x_{i}$$函數
方差公式:spa
$$s^{2}=\frac{1}{n} \sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{2}$$.net
0-範數,向量中非零元素的個數。code
1-範數:orm
$$\|X\|=\sum_{i=1}^{n}\left|x_{i}\right|$$htm
2-範數:blog
$$\|X\|_{2}=\left(\sum_{i=1}^{n} x_{i}^{2}\right)^{\frac{1}{2}}$$token
p-範數的計算公式:
$$\|X\|_{p}=\left(|x 1|^{p}+|x 2|^{p}+\ldots+|x n|^{p}\right)^{\frac{1}{p}}$$
實際操做中,常常忽略特徵數據的分佈形狀,移除每一個特徵均值,劃分離散特徵的標準差,從而等級化,進而實現數據中心化。(作機率論的題常常用這招啊)
可是,當單個特徵的樣本取值相差甚大或明顯不聽從高斯正態分佈時,標準化表現的效果較差。
公式爲:(X-X_mean)/X_std 計算時對每一個屬性/每列分別進行.
將數據按其屬性(按列進行)減去其均值,而後除以其方差。最後獲得的結果是,對每一個屬性/每列來講全部數據都彙集在0附近,方差值爲1。
方法一:使用sklearn.preprocessing.scale()函數
from sklearn import preprocessing import numpy as np X = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) X_mean = X.mean(axis=0) #calculate mean X_std = X.std(axis=0) #calculate variance X1 = (X-X_mean)/X_std #standardize X X_scale = preprocessing.scale(X) #use function preprocessing.scale to standardize X
最後X_scale的值和X1的值是同樣的
方法2:sklearn.preprocessing.StandardScaler類
from sklearn import preprocessing import numpy as np X = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) scaler = preprocessing.StandardScaler() X_scaled = scaler.fit_transform(X)
這兩個方法獲得最後的結果都是同樣的。
另外一種經常使用的方法是將屬性縮放到一個指定的最大值和最小值(一般是1-0)之間,這能夠經過preprocessing.MinMaxScaler類來實現。
使用這種方法的目的包括:
下面將數據縮至0-1之間,採用MinMaxScaler函數
from sklearn import preprocessing import numpy as np X = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) min_max_scaler = preprocessing.MinMaxScaler() X_minMax = min_max_scaler.fit_transform(X) X_minMax
array([[0.5 , 0. , 1. ], [1. , 0.5 , 0.33333333], [0. , 1. , 0. ]])
正則化的過程是將每一個樣本縮放到單位範數(每一個樣本的範數爲1),若是要使用如二次型(點積)或者其它核方法計算兩個樣本之間的類似性這個方法會頗有用。
該方法是文本分類和聚類分析中常用的向量空間模型(Vector Space Model)的基礎.
Normalization主要思想是對每一個樣本計算其p-範數,而後對該樣本中每一個元素除以該範數,這樣處理的結果是使得每一個處理後樣本的p-範數(l1-norm,l2-norm)等於1。
方法1:使用sklearn.preprocessing.normalize()函數
from sklearn import preprocessing import numpy as np X = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) X_normalized = preprocessing.normalize(X, norm='l2') X_normalized
方法2:sklearn.preprocessing.StandardScaler類
from sklearn import preprocessing import numpy as np X = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) normalizer = preprocessing.Normalizer() normalizer.transform(X)
兩種方法的結果相同:
array([[ 0.40824829, -0.40824829, 0.81649658], [ 1. , 0. , 0. ], [ 0. , 0.70710678, -0.70710678]])
特徵的二值化主要是爲了將數據特徵轉變成boolean變量。
from sklearn import preprocessing import numpy as np X = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) binarizer = preprocessing.Binarizer() binarizer.transform(X)
Binarizer函數也能夠設定一個閾值,結果數據值大於閾值的爲1,小於閾值的爲0,實例代碼以下:
//只需加一個參數
binarizer = preprocessing.Binarizer(threshold=1.1)
現實中的數據集都包含有缺失值,要麼是空白的,要麼使用NaNs或者其它的符號替代。
這些數據沒法直接使用scikit-learn分類器直接訓練,因此須要進行處理。
幸運地是,sklearn中的Imputer類提供了一些基本的方法來處理缺失值,如使用均值、中位值或者缺失值所在列中頻繁出現的值來替換。
import numpy as np from sklearn.preprocessing import 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]] print(imp.transform(X))
Imputer類一樣支持稀疏矩陣(即含有大量的0):
import scipy.sparse as sp X = sp.csc_matrix([[1, 2], [0, 3], [7, 6]]) imp = Imputer(missing_values=0, strategy='mean', axis=0) imp.fit(X) X_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]]) print(imp.transform(X_test))
更多的請到scikit-learn的官方文檔中查看
參考連接:https://blog.csdn.net/Dream_angel_Z/article/details/49406573