簡體   English   中英

sklearn中的'transform'和'fit_transform'有什么區別

[英]what is the difference between 'transform' and 'fit_transform' in sklearn

在 sklearn-python 工具箱中,有兩個函數transformfit_transform是關於sklearn.decomposition.RandomizedPCA 兩個函數的說明如下

在此處輸入圖像描述在此處輸入圖像描述

但是它們之間有什么區別呢?

scikit-learn estimator api 中

fit() :用於從訓練數據生成學習模型參數

transform() :由fit()方法生成的參數,應用於模型以生成轉換后的數據集。

fit_transform() : fit()transform() api 在同一數據集上的組合

在此處輸入圖片說明

從這本書中查看第 4 章並從stackexchange 中回答以獲得更清晰的信息

這些方法用於給定數據的中心/特征尺度。 它基本上有助於規范特定范圍內的數據

為此,我們使用 Z-score 方法。

Z-分數

我們在訓練數據集上這樣做。

1. Fit():方法計算參數μ和σ並保存為內部對象。

2. Transform():使用這些計算參數的方法將轉換應用於特定數據集。

3. Fit_transform():結合fit()和transform()方法對數據集進行變換。

特征縮放/標准化的代碼片段(在 train_test_split 之后)。

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_transform(X_train)
sc.transform(X_test)

我們在測試集上應用相同的(訓練集相同的兩個參數 μ 和 σ(值))參數轉換。

.transform方法適用於您已經計算出PCA ,即如果您已經調用了它的.fit方法。

In [12]: pc2 = RandomizedPCA(n_components=3)

In [13]: pc2.transform(X) # can't transform because it does not know how to do it.
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-e3b6b8ea2aff> in <module>()
----> 1 pc2.transform(X)

/usr/local/lib/python3.4/dist-packages/sklearn/decomposition/pca.py in transform(self, X, y)
    714         # XXX remove scipy.sparse support here in 0.16
    715         X = atleast2d_or_csr(X)
--> 716         if self.mean_ is not None:
    717             X = X - self.mean_
    718 

AttributeError: 'RandomizedPCA' object has no attribute 'mean_'

In [14]: pc2.ftransform(X) 
pc2.fit            pc2.fit_transform  

In [14]: pc2.fit_transform(X)
Out[14]: 
array([[-1.38340578, -0.2935787 ],
       [-2.22189802,  0.25133484],
       [-3.6053038 , -0.04224385],
       [ 1.38340578,  0.2935787 ],
       [ 2.22189802, -0.25133484],
       [ 3.6053038 ,  0.04224385]])
    
  

所以你想fit RandomizedPCA然后transform為:

In [20]: pca = RandomizedPCA(n_components=3)

In [21]: pca.fit(X)
Out[21]: 
RandomizedPCA(copy=True, iterated_power=3, n_components=3, random_state=None,
       whiten=False)

In [22]: pca.transform(z)
Out[22]: 
array([[ 2.76681156,  0.58715739],
       [ 1.92831932,  1.13207093],
       [ 0.54491354,  0.83849224],
       [ 5.53362311,  1.17431479],
       [ 6.37211535,  0.62940125],
       [ 7.75552113,  0.92297994]])

In [23]: 

特別是 PCA .transform將通過矩陣X的 PCA 分解獲得的基變化應用於矩陣Z

為什么以及何時使用fit()transform()fit_transform()每一個

通常我們有一個以 (X, y) 作為數據集的監督學習問題,我們將其拆分為訓練數據和測試數據:

import numpy as np
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y)

X_train_vectorized = model.fit_transform(X_train)
X_test_vectorized = model.transform(X_test)

想象一下,我們正在擬合一個分詞器,如果我們擬合 X,我們會將測試數據包含到分詞器中,但我已經多次看到這個錯誤!

正確的是只適合 X_train ,因為你不知道“你未來的數據”,所以你不能使用 X_test 數據來擬合任何東西!

然后你可以轉換你的測試數據,但分開,這就是為什么有不同的方法。

最后提示: X_train_transformed = model.fit_transform(X_train)等價於: X_train_transformed = model.fit(X_train).transform(X_train) ,但第一個更快。

請注意,我所說的“模型”通常是縮放器、tfidf 轉換器、其他類型的矢量化器、標記器......

請記住:X 代表特征,y 代表每個樣本的標簽。 X 是一個數據框, y 是一個熊貓系列對象(通常)

方法之間的一般區別:

  • fit (raw_documents[, y]):學習原始文檔中所有標記的詞匯字典。
  • fit_transform (raw_documents[, y]):學習詞匯字典並返回term-document矩陣。 這等效於 fit 后跟變換,但更有效地實現。
  • 轉換(raw_documents):將文檔轉換為文檔項矩陣。 使用適合的詞匯表或提供給構造函數的詞匯表從原始文本文檔中提取標記計數。

fit_transform 和 transform 都返回相同的 Document-term 矩陣。

來源

通俗地說,fit_transform 的意思是先做一些計算,然后再做轉換(比如從一些數據中計算列的均值,然后替換缺失的值)。 所以對於訓練集,你需要計算和轉換。

但是對於測試集,機器學習根據在訓練集中學到的東西應用預測,因此不需要計算,它只執行轉換。

這里.fit().fit_transform()之間的基本區別:

.fit()用於監督學習,有兩個對象/參數 (x,y) 來擬合模型並使模型運行,我們知道我們要預測什么

.fit_transform()用於具有一個對象/參數 (x) 的無監督學習,我們不知道我們要預測什么。

當我們有兩個具有不同元素的數組時,我們分別使用“擬合”和變換,我們根據其內部函數擬合“數組 1”,例如MinMaxScaler (內部函數用於查找均值和標准差)。 例如,如果我們根據其平均值擬合“數組 1”並變換數組 2,則數組 1 的平均值將應用於我們變換的數組 2。 簡單來說,我們將一個數組轉換為另一個數組的基本內部函數。

代碼演示:

import numpy as np
from sklearn.impute import SimpleImputer
imp = SimpleImputer(missing_values=np.nan, strategy='mean')

temperature = [32., np.nan, 28., np.nan, 32., np.nan, np.nan, 34., 40.]
 windspeed  = [ 6.,  9., np.nan,  7., np.nan, np.nan, np.nan,  8., 12.]
n_arr_1 = np.array(temperature).reshape(3,3)
print('temperature:\n',n_arr_1)
n_arr_2 = np.array(windspeed).reshape(3,3)
print('windspeed:\n',n_arr_2)

輸出:

temperature:
 [[32. nan 28.]
 [nan 32. nan]
 [nan 34. 40.]]
windspeed:
 [[ 6.  9. nan]
 [ 7. nan nan]
 [nan  8. 12.]]

fittransform ,將數組 2 轉換為擬合(基於均值)數組 1:

imp.fit(n_arr_1)
imp.transform(n_arr_2)

輸出

檢查下面的輸出,觀察基於前兩個輸出的輸出你會看到差異。 基本上,在數組 1 上,它取每一列的平均值,並根據其缺失值的列擬合數組 2。

array([[ 6.,  9., 34.],
       [ 7., 33., 34.],
       [32.,  8., 12.]])

當我們想根據另一個數組轉換一個數組時,我們就是這樣做的。 但是當我們有一個數組並且我們想根據它自己的平均值對其進行轉換時。 在這種情況下,我們一起使用fit_transform

見下文;

imp.fit_transform(n_arr_2)

輸出

array([[ 6. ,  9. , 12. ],
       [ 7. ,  8.5, 12. ],
       [ 6.5,  8. , 12. ]])

(上圖)或者我們在做:

imp.fit(n_arr_2)
imp.transform(n_arr_2)

輸出

array([[ 6. ,  9. , 12. ],
       [ 7. ,  8.5, 12. ],
       [ 6.5,  8. , 12. ]])

為什么我們分別對同一個數組進行擬合和轉換,需要兩行代碼,為什么不使用簡單的fit_transform,它可以在一行代碼中對同一個數組進行擬合和轉換。 這就是 fit 和 transform 和 fit_transform 之間的區別。

以下答案適用於任何類型的 sklearn 相關庫。 在了解fit_transform之前,讓我們看看 fit 方法是什么:

fit(X) - 通過提取第一個主成分,用 X 擬合 model。

fit_transform(X) - 用 X 擬合 model 並對 X 應用降維。

fit_transform ---> fit(x).transform(x)

transform(x) - 對 X 應用降維。

您可以在此處查看 sklearn randomized PCA 文檔以獲取更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM