關於fit和transform

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

http://scikit-learn.org/stable/modules/preprocessing.html#standardization-or-mean-removal-and-variance-scaling

https://blog.csdn.net/csmqq/article/details/51461696

相關文章
相關標籤/搜索