一、標准化
API函數:scaler()或者StandardScaler()
數據集標准化對有些機器學習算法是很有必要的手段,只所以進行標准化,是因為兩個原因:其一,對於同一特征中,最大最小值之差過大,將數據縮放在合適的范圍,比如手機包月流量使用情況,有些數值是500M,有些是1G;其二、有些機器學習算法中目標函數的基礎為假設特征均值為0,方差在同一介數的情況,sklearn官網說這類算法比如:SVM的RBF內核或線性模型的l1和l2正則化,如果某些特征的方差比其它的特征方差大幾個數量級別,A方差是1,B特征方差是1000,那么會導致B特征對此算法占主導地位,導致學習器不是你所期望的結果。
標准化公式:(X - X_mean)/X_std; 計算時對每個屬性/每列分別進行。
API函數一:sklearn.preprocessing.scale(X, axis=0, with_mean=True,with_std=True,copy=True)
變量注解:
X:{array-like, sparse matrix}
axis:默認值為0,為0表示分別標准化每個特征(按列),為1表示對每個樣本進行標准化(按行)
with_mean和with_std:分別表示數據均值規范為0,方差規范為1
用例:
from sklearn import preprocessing import numpy as np X_train = np.array([[ 1., -1., 100.], [ 10., 0., 0.], [ 0., 1., -1.]]) X_scaler = preprocessing.scale(X_train) #X_scaler輸出結果 array([[-0.59299945, -1.22474487, 1.41416106], [ 1.4083737 , 0. , -0.69652709], [-0.81537425, 1.22474487, -0.71763397]])
從上述結果可見,標准化后,數據之間差值沒那么離譜
API函數二、sklearn.preprocessing.
StandardScaler
(copy=True, with_mean=True, with_std=True)
變量注釋同上;
StandardScaler函數平時工作基本都用這個,其提供了fit和transform方法,fit可用於訓練數據集,transform可用於測試數據集,使用方便
用例:
scaler = preprocessing.StandardScaler().fit(X_train) X_test = X_train scaler_result = scaler.transform(X_test) #scaler_result 結果 array([[-0.59299945, -1.22474487, 1.41416106], [ 1.4083737 , 0. , -0.69652709], [-0.81537425, 1.22474487, -0.71763397]]
1.1 縮放到一定的范圍
一種標准化是將特征縮放到給定的最小值和最大值之間,可以使用MinMaxScaler ()和MaxAbsScaler()或者(minmax_scaler、maxabs_scaler),通常在0和1之間;
使用這種方法的好處:
- 1、對於方差非常小的屬性可以增強其穩定性;
- 2、維持稀疏矩陣中為0的條目。
先介紹第一個函數:
sklearn.preprocessing.
MinMaxScaler
(feature_range=(0, 1), copy=True)
計算公式:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) X_scaled = X_std * (max - min) + min
另一種函數形式:sklearn.preprocessing.
minmax_scale
(X, feature_range=(0, 1), axis=0, copy=True),意思相同
變量注釋:
feature_range:默認(min,max)為(0,1),即最大最小值為1、0
用例:
from sklearn import preprocessing import numpy as np X_train = np.array([[ 1., -1., 100.], [ 0.9, 0., 0.], [ 0.9, 1., -1.]]) minMaxScaler = preprocessing.MinMaxScaler() minMax = minMaxScaler.fit(X_train) minMax.transform(X_train) #輸出結果 array([[ 1. , 0. , 1. ], [ 0. , 0.5 , 0.00990099], [ 0. , 1. , 0. ]])
上述X_train 中的數據使用minMaxScaler方法進行處理后,可見,在原有數值差異比較大的列,數據差異依然存在。
API函數二、MaxAbsScaler()只不過是用特征的值除以該特征的最大值而已,其取值范圍是[-1,1]。
用例:
from sklearn import preprocessing import numpy as np X_train = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) max_abs_scaler = preprocessing.MaxAbsScaler() X_train_maxabs = max_abs_scaler.fit(X_train) X_train_maxabs.transform(X_train) #輸出結果 array([[ 0.5, -1. , 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
1.2 稀疏數據的縮放
MaxAbsScaler 以及maxabs_scaler是專為縮放數據而設計的,並且是縮放數據的推薦方法。但是,scale和 StandardScaler也能夠接受 scipy.sparse
作為輸入,只要參數 with_mean=False
被准確傳入它的構造器。否則會出現 ValueError
的錯誤,因為默認的中心化會破壞稀疏性,並且經常會因為分配過多的內存而使執行崩潰
1.3 縮放離群值的數據
如果你的數據包含許多異常值,使用均值和方差縮放可能並不是一個很好的選擇,可以使用RobustScaler或robust_scaler。但是特征工程有異常值存在時,一般要探測性的分析去發掘異常值。
二、歸一化或者正則化(Normalization)
歸一化 是 縮放單個樣本以具有單位范數 的過程。如果你計划使用二次形式(如點積或任何其他核函數)來量化任何樣本間的相似度,則此過程將非常有用。
API函數:sklearn.preprocessing.
Normalizer
(norm='l2', copy=True) 或者 sklearn.preprocessing.
normalize
(X, norm='l2', axis=1, copy=True, return_norm=False)
參數norm設置采用何種方式進行歸一化,默認l2
同時:函數normalizer以及類Normalizer接收 來自scipy.sparse的密集類數組數據和稀疏矩陣 作為輸入。
用例:
from sklearn import preprocessing import numpy as np X_train = np.array([[ 1., -1., 100.], [ 0.9, 0., 0.], [ 0.9, 1., -1.]]) norm = preprocessing.Normalizer() #此處的fit其實並未實際意義的,不使用fit,直接norm對象調用transform函數也可以
#因為每個樣本被當做是獨立於其他樣本的,所以fit
方法是無用的 norm_fit = norm.fit(X_train) norm_fit.transform(X_train) #輸出結果為 array([[ 0.009999 , -0.009999 , 0.99990001], [ 1. , 0. , 0. ], [ 0.53689499, 0.59654999, -0.59654999]])
三、二值化(Binarization)
API函數:sklearn.preprocessing.
Binarizer
(threshold=0.0, copy=True)
其中參數threshold表示小於等於0.0的數表示為0,大於0.0的數據表示為1。
用例:
from sklearn import preprocessing import numpy as np X_train = np.array([[ 1., -1., 100.], [ 0.9, 0., 0.], [ 0.9, 1., -1.]]) binarizer = preprocessing.Binarizer(threshold= 0.9) binarizer.transform(X_train) #輸出結果 array([[ 1., 0., 1.], [ 0., 0., 0.], [ 0., 1., 0.]])
相比於 StandScaler和Normalizer類的情況,預處理模塊提供了一個相似的函數 binarizer,以便不需要轉換接口時使用。
binarizer及Binarizer接收 來自scipy.sparse的密集類數組數據以及稀疏矩陣作為輸入
四、分類特征編碼(Encoding categorical features)
API函數:sklearn.preprocessing.
OneHotEncoder
(n_values='auto', categorical_features='all', dtype=<type 'numpy.float64'>, sparse=True, handle_unknown='error')
其實就是大名鼎鼎的one-hot編碼,該函數需注意參數是n_values,可以顯示指定每個特征被編碼為幾列,也就是某個特征取值個數;
用例:
from sklearn import preprocessing import numpy as np enc = preprocessing.OneHotEncoder(n_values=[2, 3, 4]) # 注意到第二、三個特征是不全的 # features enc.fit([[1, 2, 3], [0, 2, 0]]) enc.transform([[1, 0, 0]]).toarray() #輸出結果 array([[ 0., 1., 1., 0., 0., 1., 0., 0., 0.]])
上面的例子中,指定了第一個特征有兩個取值,第二個特征有三個取值,第四個特征有4個取值;
五、缺失值填補( Imputation of missing values)
因為各種各樣的原因,真實世界中的許多數據集都包含缺失數據,這類數據經常被編碼成空格、NaNs,或者是其他的占位符。但是這樣的數據集並不能scikit-learn學習算法兼容,因為大多的學習算法都默認假設數組中的元素都是數值,因而所有的元素都有自己的意義。 使用不完整的數據集的一個基本策略就是舍棄掉整行或整列包含缺失值的數據。但是這樣就付出了舍棄可能有價值數據(即使是不完整的 )的代價。 處理缺失數值的一個更好的策略就是從已有的數據推斷出缺失的數值。
Imputer類提供了估算缺失值的基本策略,使用缺失值所在的行/列中的平均值、中位數或者眾數來填充。這個類也支持不同的缺失值編碼。
API函數:sklearn.preprocessing.
Imputer
(missing_values='NaN', strategy='mean', axis=0, verbose=0, copy=True)
參數missing_values:integer or “NaN”, optional (default=”NaN”),什么值表示的是空值
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]] imp.transform(X) #輸出結果為: array([[ 4. , 2. ], [ 6. , 3.66666667], [ 7. , 6. ]])
另外:
標准化和歸一化何時使用呢:
標准化何時使用前面說了一下,對於歸一化,歸一化(Normalization)處理數據針對的是行樣本,在數據樣本向量進行點乘運算或其它核函數計算相似性時,擁有統一的標准(權重)時使用;