Fit是對於數據進行擬合,所謂擬合,就是根據數據,計算得到數據裏面的一些指標,好比均值,方差;下一步不少API都是須要這些參數來進行後續對數據的操做,好比下面要講到的transform。html
Transform,對於數據進行變形;常見的變形是標準化和歸一化。標準化是須要均值和方差的,標準化本質上將數據進行正態分佈化;算法
不少時候,當須要依次對訓練數據和測試數據進行變形處理的時候,首先處理訓練數據,這個時候須要調用fit,再調用tranform,或者直接使用fit_transform;而後再處理測試數據,這個時候,直接transform就能夠了,由於處理訓練數據的時候,其實已經經過fit獲取了均值方差等指標;dom
1 rnd.seed(42) 2 3 m = 100 4 5 X = 6 * rnd.rand(m, 1) - 3 6 7 y = 2 + X + 0.5 * X**2 + rnd.randn(m, 1) 8 9 X_train, X_val, y_train, y_val = train_test_split(X[:50], y[:50].ravel(), test_size=0.5, random_state=10) 10 11 poly_scaler = Pipeline(( 12 13 ("poly_features", PolynomialFeatures(degree=90, include_bias=False)), 14 15 ("std_scaler", StandardScaler()), 16 17 )) 18 19 X_train_poly_scaled = poly_scaler.fit_transform(X_train) 20 21 X_val_poly_scaled = poly_scaler.transform(X_val)
這裏牽涉一個對象就是標準化的伸縮,這個處理是爲了不單個數據過大,進而致使了數據處理異常;因而爲了下降單個特徵對於總體的影響,對於數據集合進行求導,而後對於全部的數據除以導數;將數據縮小到必定程度,下降了個別數值的影響。Numpy裏面是有原始實現的:函數
1 >>> from sklearn import preprocessing 2 3 >>> import numpy as np 4 5 >>> X_train = np.array([[ 1., -1., 2.], 6 7 ... [ 2., 0., 0.], 8 9 ... [ 0., 1., -1.]]) 10 11 >>> X_scaled = preprocessing.scale(X_train) 12 13 14 15 >>> X_scaled 16 17 array([[ 0. ..., -1.22..., 1.33...], 18 19 [ 1.22..., 0. ..., -0.26...], 20 21 [-1.22..., 1.22..., -1.06...]]) 22 23 >>> X_scaled.mean(axis=0) 24 25 array([0., 0., 0.]) 26 27 28 29 >>> X_scaled.std(axis=0) 30 31 array([1., 1., 1.])
最後看到通過伸縮數據知足了,均值爲0,標準差爲1(注意這裏指定了參數爲0,表明是對列求標準差,最後返回的一行數據;若是是1,則表明對行求標準差,最後返回的一列),後面還會之後給予axis的處理。學習
這個是sklearn中原始的處理;還有一個封裝的類專門用於這個處理:StandardScale。測試
1 >>> scaler = preprocessing.StandardScaler().fit(X_train) 2 3 >>> scaler 4 5 StandardScaler(copy=True, with_mean=True, with_std=True) 6 7 >>> scaler.mean_ 8 9 array([1. ..., 0. ..., 0.33...]) 10 11 >>> scaler.scale_ 12 13 array([0.81..., 0.81..., 1.24...]) 14 15 >>> scaler.transform(X_train) 16 17 array([[ 0. ..., -1.22..., 1.33...], 18 19 [ 1.22..., 0. ..., -0.26...], 20 21 [-1.22..., 1.22..., -1.06...]])
這個形式變成了咱們上面描述的fit-transform,在fit以後,將能夠獲取到mean以及std;而後將會進行一下數據變形;獲取到了最後的矩陣,下面咱們要查看一下這個矩陣究竟是不是知足均值爲0,標準差爲1的正態分佈呢?spa
1 import numpy as np 2 formated_data =scaler.transform(X_train) 3 print(np.mean(formated_data, 0)) 4 print(np.std(formated_data))
返回信息:.net
[0. 0. 0.]code
1.0orm
注意,在np.mean的時候,傳遞了第二個參數,且值爲0(對列進行均值,返回一行);注意這個有值和沒有值結果是徹底不同,沒有傳遞參數只是返回一個值,應該是對於行列統一作了一下均值;
上面的描述中提到了transform的時候,內部執行的是標準化,到底對數據作了什麼,到底爲何要作標準化呢?
首先將歸一化/ 標準化,就是將數據縮放(映射)到一個範圍內,好比[0,1],[-1,1],還有在圖形處理中將顏色處理爲[0,255];歸一化的好處就是不一樣緯度的數據在相近的取值範圍內,這樣在進行梯度降低這樣的算法的時候,曲線將會更加簡單(由原始的橢圓變成了圓形),以下圖所示:
至於縮放的原理就是量綱表明,好比身高和指甲寬度,若是統一都是釐米那麼二者不是一個數量級,若是把身高的量綱改成米,那麼你會發現身高取值範圍和指甲寬度實際上是相近的取值範圍,這樣避免了某個維度成爲了影響學習結果的主導。
常見的歸一化/ 標準化
1. Standard Scala(z-score standardization):是標準化處理;將元素經過下面的公式進行處理:
x =(x - 𝜇)/𝜎
標準縮放只是是和數據近似服從正態分佈的場景;並且數據的分佈發生變化,變爲相對標準的正態分佈
2. MaxMinScala:其實這個是歸一化處理,MaxMinScaler並無改變數據分佈,只是將按照某個規則進行縮放;處理公式以下:
x = (x-min)/(max-min)
適合於總體數據比較分佈平和(集中),沒有離羣數據,或者不多的離羣數據,不然max的值的誤差將會致使計算不許確;並且MaxMinScala不穩定,若是有新加入的數據須要從新進行計算;
3. RobustScaler:是一種魯棒性特別好的算法;若是數據有不少異常值,那麼使用該方法對數據進行處理;
4. 非線性化歸一:對於一些場景下數據分化很是大,那麼可使用log,指數以及反正切的方式對數據進行縮放;
log函數:x = lg(x)/lg(max);反正切函數:x = atan(x)*2/pi
總結:
1)在分類和聚類的算法中,牽涉到了距離的計算,那麼,PCA降維計算的時候,Standard Scaler表現的比較好;
2)不涉及距離,協方差計算,數據不符合正態分佈的場景下,可使用MinMaxScaler來計算;
能夠經過scipy庫中內容來作正態性檢驗;
什麼是協方差?用來代表(X,Y)是否獨立的概念
參考:
https://www.cnblogs.com/bjwu/p/8977141.html
正態性檢驗實現
https://blog.csdn.net/QimaoRyan/article/details/72861387