sklearn 中的preprocessing数据预处理
1. sklearn preprocessing
Standardization即標(biāo)準(zhǔn)化,盡量將數(shù)據(jù)轉(zhuǎn)化為均值為零,方差為一的數(shù)據(jù),形如標(biāo)準(zhǔn)正態(tài)分布(高斯分布)。實際中我們會忽略數(shù)據(jù)的分布情況,僅僅是通過改變均值來集中數(shù)據(jù),然后將非連續(xù)特征除以他們的標(biāo)準(zhǔn)差。
1.1 標(biāo)準(zhǔn)化:去均值,方差規(guī)模化
Standardization標(biāo)準(zhǔn)化:將特征數(shù)據(jù)的分布調(diào)整成標(biāo)準(zhǔn)正太分布,也叫高斯分布,也就是使得數(shù)據(jù)的均值為0,方差為1.
標(biāo)準(zhǔn)化的原因在于如果有些特征的方差過大,則會主導(dǎo)目標(biāo)函數(shù)從而使參數(shù)估計器無法正確地去學(xué)習(xí)其他特征。
標(biāo)準(zhǔn)化的過程為兩步:去均值的中心化(均值變?yōu)?);方差的規(guī)模化(方差變?yōu)?)。
(1) 在sklearn.preprocessing中提供了一個scale的方法
In [149]: from sklearn import preprocessingIn [150]: import numpy as npIn [151]: X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])In [152]: X_scaled = preprocessing.scale(X)In [153]: X_scaled Out[153]: array([[ 0. , -1.22474487, 1.33630621],[ 1.22474487, 0. , -0.26726124],[-1.22474487, 1.22474487, -1.06904497]])#scaled之后的數(shù)據(jù)零均值,單位方差 In [154]: X_scaled.mean(axis=0) Out[154]: array([0., 0., 0.]) # # axis=1表示對每一行去做這個操作,axis=0表示對每一列做相同的這個操作 In [155]: X_scaled.std(axis=0) Out[155]: array([1., 1., 1.])(2) StandardScaler計算訓(xùn)練集的平均值和標(biāo)準(zhǔn)差,以便測試數(shù)據(jù)集使用相同的變換
preprocessing這個模塊還提供了一個實用類StandarScaler,它可以在訓(xùn)練數(shù)據(jù)集上做了標(biāo)準(zhǔn)轉(zhuǎn)換操作之后,把相同的轉(zhuǎn)換應(yīng)用到測試訓(xùn)練集中。
這樣就可以對訓(xùn)練數(shù)據(jù),測試數(shù)據(jù)應(yīng)用相同的轉(zhuǎn)換,以后有新的數(shù)據(jù)進(jìn)來也可以直接調(diào)用,不用再重新把數(shù)據(jù)放在一起再計算一次了。
注 :
1)StandardScaler()中可以傳入兩個參數(shù):with_mean,with_std.這兩個都是布爾型的參數(shù),默認(rèn)情況下都是true,但也可以自定義成false.即不要均值中心化或者不要方差規(guī)模化為1.
2)scale和StandardScaler可以用于回歸模型中的目標(biāo)值處理。
(3) 將數(shù)據(jù)特征縮放至某一范圍(from sklearn.preprocessing import MinMaxScaler)
也就是使得特征的分布是在一個給定最小值和最大值的范圍內(nèi)的。一般情況下是在[0,1]之間,或者是特征中絕對值最大的那個數(shù)為1,其他數(shù)以此維標(biāo)準(zhǔn)分布在[[-1,1]之間
以上兩者分別可以通過MinMaxScaler 或者 MaxAbsScaler方法來實現(xiàn)。
之所以需要將特征規(guī)模化到一定的[0,1]范圍內(nèi),是為了對付那些標(biāo)準(zhǔn)差相當(dāng)小的特征并且保留下稀疏數(shù)據(jù)中的0值。
MinMaxScaler(最小最大值標(biāo)準(zhǔn)化)
X_std=(X?X.min(axis=0))(X.max(axis=0)?X.min(axis=0))X\_std = \frac{ (X - X.min(axis=0))}{(X.max(axis=0) - X.min(axis=0))}X_std=(X.max(axis=0)?X.min(axis=0))(X?X.min(axis=0))?
X_scaler=Xstd(max?min)+minX\_scaler =\frac {X_std} {(max - min)} + minX_scaler=(max?min)Xs?td?+min
MaxAbsScaler(絕對值最大標(biāo)準(zhǔn)化)
與上述標(biāo)準(zhǔn)化方法相似,但是它通過除以最大值將訓(xùn)練集縮放至[-1,1]。這意味著數(shù)據(jù)已經(jīng)以0為中心或者是含有非常多0的稀疏數(shù)據(jù)。
In [169]: X_train = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])In [170]: max_abs_scaler = preprocessing.MaxAbsScaler()In [171]: X_train_maxabs =max_abs_scaler.fit_transform(X_train)In [172]: X_train_maxabs Out[172]: array([[ 0.5, -1. , 1. ],[ 1. , 0. , 0. ],[ 0. , 1. , -0.5]])In [173]: X_test = np.array([[ -3., -1., 4.]])In [174]: X_test_maxabs = max_abs_scaler.transform(X_test)In [175]: X_test_maxabs Out[175]: array([[-1.5, -1. , 2. ]])In [176]: max_abs_scaler.scale_ Out[176]: array([2., 1., 2.])(4) 規(guī)模化稀疏數(shù)據(jù)
對稀疏數(shù)據(jù)進(jìn)行去均值的中心化會破壞稀疏的數(shù)據(jù)結(jié)構(gòu)。此時可以用其他方法對稀疏的輸入數(shù)據(jù)進(jìn)行轉(zhuǎn)換,特別是那些特征之間的數(shù)據(jù)規(guī)模不一樣的數(shù)據(jù)。MaxAbsScaler 和 maxabs_scale這兩個方法是專門為稀疏數(shù)據(jù)的規(guī)模化所設(shè)計的。
(5) 規(guī)模化有異常值的數(shù)據(jù)
如果數(shù)據(jù)有許多異常值,那么使用數(shù)據(jù)的均值與方差去做標(biāo)準(zhǔn)化就不行了。
在這里,你可以使用robust_scale 和 RobustScaler這兩個方法。它會根據(jù)中位數(shù)或者四分位數(shù)去中心化數(shù)據(jù)。
更多的數(shù)據(jù)預(yù)處理方法參考官方文檔:http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling
1.2 正則化Normalization
正則化是將樣本在向量空間模型上的一個轉(zhuǎn)換,經(jīng)常被使用在分類與聚類中。
函數(shù)normalize 提供了一個快速有簡單的方式在一個單向量上來實現(xiàn)這正則化的功能。正則化有l(wèi)1,l2等,這些都可以用上:
In [42]: import numpy as np# # 創(chuàng)建一組特征數(shù)據(jù),每一行表示一個樣本,每一列表示一個特征 In [43]: x = np.array([[1., -1., 2.],[2., 0., 0.],[0., 1., -1.]])In [44]: from sklearn import preprocessingIn [45]: x_normalized = preprocessing.normalize(x, norm='l2')In [46]: x Out[46]: array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]])In [47]: x_normalized Out[47]: array([[ 0.40824829, -0.40824829, 0.81649658],[ 1. , 0. , 0. ],[ 0. , 0.70710678, -0.70710678]])# preprocessing這個模塊還提供了一個實用類Normalizer,實用transform方法同樣也可以對新的數(shù)據(jù)進(jìn)行同樣的轉(zhuǎn)換 In [48]: normalizer = preprocessing.Normalizer().fit(x)In [49]: normalizer Out[49]: Normalizer(copy=True, norm='l2')# 對訓(xùn)練數(shù)據(jù)進(jìn)行正則 In [50]: normalizer.transform(x) Out[50]: array([[ 0.40824829, -0.40824829, 0.81649658],[ 1. , 0. , 0. ],[ 0. , 0.70710678, -0.70710678]])# 對新的測試數(shù)據(jù)進(jìn)行正則 In [51]: normalizer.transform([[-1., 1., 0.]]) Out[51]: array([[-0.70710678, 0.70710678, 0. ]])normalize和Normalizer都既可以用在密集數(shù)組也可以用在稀疏矩陣(scipy.sparse)中
1.3 特征的二值化
特征的二值化是指將數(shù)值型的特征數(shù)據(jù)轉(zhuǎn)換成布爾類型的值。可以使用使用類Binarizer。
In [52]: binarizer = preprocessing.Binarizer().fit(x)In [53]: binarizer.transform(x) # 默認(rèn)是根據(jù)0來二值化,大于0的都標(biāo)記為1,小于等于0的都標(biāo)記為0 Out[53]: array([[1., 0., 1.],[1., 0., 0.],[0., 1., 0.]])In [54]: binarizer = preprocessing.Binarizer(threshold=1.5) # 也可以自己設(shè)置這個閥值,只需傳出參數(shù)threshold即可In [55]: binarizer.transform(x) Out[55]: array([[0., 0., 1.],[1., 0., 0.],[0., 0., 0.]])binarize and Binarizer都可以用在密集向量和稀疏矩陣上。
1.4 類別特征編碼
我們知道特征可能是連續(xù)型的也可能是類別型的變量,比如說:
特征一的特征值:[“male”, “female”],
特征二的特征值:[“from Europe”, “from US”, “from Asia”],
特征三的特征值:[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”].
這些類別特征無法直接進(jìn)入模型,它們需要被轉(zhuǎn)換成整數(shù)來表征,比如:
[“male”, “from US”, “uses Internet Explorer”] 對應(yīng)的編碼 [0, 1, 3]
[“female”, “from Asia”, “uses Chrome”] 對應(yīng)的編碼 [1, 2, 1].
.........
然而上面這種表征的方式仍然不能直接為scikit-learn的模型所用,因為模型會把它們當(dāng)成序列型的連續(xù)變量。
要想使得類別型的變量能最終被模型直接使用,可以使用one-of-k編碼或者one-hot編碼。這些都可以通過OneHotEncoder實現(xiàn),它可以將有n種值的一個特征變成n個二元的特征。
In [61]: enc = preprocessing.OneHotEncoder()In [62]: enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) Out[62]: OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,handle_unknown='error', n_values='auto', sparse=True)In [63]: enc.transform([[0,1,3]]).toarray() Out[63]: array([[1., 0., 0., 1., 0., 0., 0., 0., 1.]])In [64]: enc = preprocessing.OneHotEncoder(n_values=[2,3,4])In [65]: enc.fit([[1, 2, 3], [0, 2, 0]]) Out[65]: OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,handle_unknown='error', n_values=[2, 3, 4], sparse=True)In [66]: enc.transform([[1,0,0]]).toarray() Out[66]: array([[0., 1., 1., 0., 0., 1., 0., 0., 0.]])特征1中有(0,1)兩個值,特征2中有(0,1,2)3個值,特征3中有(0,1,2,3)4個值,所以編碼之后總共有9個二元特征。
但也會存在這樣的情況,某些特征中可能對一些值有缺失,比如明明有男女兩個性別,樣本數(shù)據(jù)中都是男性,這樣就會默認(rèn)被判別為只有一類值。這個時候我們可以向OneHotEncoder傳如參數(shù)n_values,用來指明每個特征中的值的總個數(shù),如上enc = preprocessing.OneHotEncoder(n_values=[2,3,4])
1.5 彌補缺失數(shù)據(jù)
在scikit-learn的模型中都是假設(shè)輸入的數(shù)據(jù)是數(shù)值型的,并且都是有意義的,如果有缺失數(shù)據(jù)是通過NAN,或者空值表示的話,就無法識別與計算了。
要彌補缺失值,可以使用均值,中位數(shù),眾數(shù)等等。Imputer這個類可以實現(xiàn)。
In [67]: from sklearn.preprocessing import ImputerIn [68]: imp = Imputer(missing_values='NaN', strategy='mean', axis=0)In [69]: imp.fit([[1, 2], [np.nan, 3], [7, 6]]) Out[69]: Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)In [70]: x = [[np.nan, 2], [6, np.nan], [7, 6]]In [71]: imp.transform(x) Out[71]: array([[4. , 2. ],[6. , 3.66666667],[7. , 6. ]])In [72]: import scipy.sparse as sp # Imputer類同樣也可以支持稀疏矩陣,以下例子將0作為了缺失值,為其補上均值In [73]: x = sp.csc_matrix([[1, 2], [0, 3], [7, 6]]) # 創(chuàng)建一個稀疏矩陣In [74]: x Out[74]: <3x2 sparse matrix of type '<class 'numpy.int64'>'with 5 stored elements in Compressed Sparse Column format>In [75]: imp = Imputer(missing_values=0, strategy='mean', verbose=0)In [76]: imp.fit(x) Out[76]: Imputer(axis=0, copy=True, missing_values=0, strategy='mean', verbose=0)In [77]: x_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])In [78]: imp.transform(x_test) Out[78]: array([[4. , 2. ],[6. , 3.66666667],[7. , 6. ]])1.6 創(chuàng)建多項式特征
有的時候線性的特征并不能做出美的模型,于是我們會去嘗試非線性。非線性是建立在將特征進(jìn)行多項式地展開上的。
比如將兩個特征 (X1,X2)(X_1, X_2)(X1?,X2?),它的平方展開式便轉(zhuǎn)換成5個特征(1,X1,X2,X12,X1X2,X22)(1, X_1, X_2, X_1^2, X_1X_2, X_2^2)(1,X1?,X2?,X12?,X1?X2?,X22?),其中1是Bias:
In [79]: import numpy as npIn [80]: from sklearn.preprocessing import PolynomialFeaturesIn [81]: x = np.arange(6).reshape(3, 2)In [82]: x Out[82]: array([[0, 1],[2, 3],[4, 5]])In [83]: poly = PolynomialFeatures(2)In [84]: poly.fit_transform(x) Out[84]: array([[ 1., 0., 1., 0., 0., 1.],[ 1., 2., 3., 4., 6., 9.],[ 1., 4., 5., 16., 20., 25.]])In [85]: x = np.arange(9).reshape(3, 3)In [86]: poly = PolynomialFeatures(degree=3, interaction_only=True)In [87]: poly.fit_transform(x) Out[87]: array([[ 1., 0., 1., 2., 0., 0., 2., 0.],[ 1., 3., 4., 5., 12., 15., 20., 60.],[ 1., 6., 7., 8., 42., 48., 56., 336.]])也可以自定義選擇只要保留特征相乘的項: 即將(X1,X2,X3)(X_1, X_2, X_3)(X1?,X2?,X3?) 轉(zhuǎn)換成
(1,X1,X2,X3,X1X2,X1X3,X2X3,X1X2X3)(1, X_1, X_2, X_3, X_1X_2, X_1X_3, X_2X_3, X_1X_2X_3)(1,X1?,X2?,X3?,X1?X2?,X1?X3?,X2?X3?,X1?X2?X3?),如上所示。
1.7 自定義特征的轉(zhuǎn)換函數(shù)
把原始的特征放進(jìn)一個函數(shù)中做轉(zhuǎn)換,這個函數(shù)出來的值作為新的特征。比如說將特征數(shù)據(jù)做log轉(zhuǎn)換,做倒數(shù)轉(zhuǎn)換等等。FunctionTransformer 可以實現(xiàn)這個功能
總結(jié):當(dāng)我們拿到一批原始的數(shù)據(jù)
2. numpy.random.shuffle打亂順序函數(shù)
In [2]: import numpy as npIn [3]: arr = np.arange(10)In [4]: arr Out[4]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])In [5]: np.random.shuffle(arr)In [6]: arr Out[6]: array([6, 8, 3, 7, 5, 4, 1, 2, 0, 9])In [7]: arr = np.arange(9).reshape((3, 3))In [8]: arr Out[8]: array([[0, 1, 2],[3, 4, 5],[6, 7, 8]]) # 多維矩陣中,只對第一維(行)做打亂順序操作 In [9]: np.random.shuffle(arr)In [10]: arr Out[10]: array([[0, 1, 2],[6, 7, 8],[3, 4, 5]])參考:
https://blog.csdn.net/csmqq/article/details/51461696
https://blog.csdn.net/sinat_33761963/article/details/53433799
總結(jié)
以上是生活随笔為你收集整理的sklearn 中的preprocessing数据预处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么海底捞服务好?
- 下一篇: 三蒸三晒红枣吃了有什么好处?