sklearnの「transform」と「fit_transform」の違いは何ですか


115

sklearn-pythonツールボックスには、2つの関数transformfit_transformaboutがありsklearn.decomposition.RandomizedPCAます。2つの機能の説明は次のとおりです。

ここに画像の説明を入力してください ここに画像の説明を入力してください

しかし、それらの違いは何ですか?


5
est.fit_transform(X)は常にと同等ですがest.fit(X).transform(X)、通常はより高速です。
Fred Foo

回答:


22

ここでは、行列でPCAをすでに計算している場合にのみ、pca.transformを使用できるという違いがあります。

   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]])

使用する.transform場合は、変換ルールをPCAに教える必要があります

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変換は、行列XのPCA分解で得られた基底の変化を行列Zに適用します。


質問を変更しました。2つの関数は同じ種類の値を返します。
tqjustc 2014年

2
あなたはそれが意味していますfit_transform2つの関数の組み合わせですfittransform
tqjustc 2014年

6
同じ行列でフィットと変換を使用する場合は、はい。行列xを当てはめてから行列zを変換する場合
Donbeo

Line In [14]は「ftransform」と言っていますが、それは何ですか?
Rajdeep Biswas

92

推定APIをscikit-学び

fit() :トレーニングデータから学習モデルパラメータを生成するために使用

transform()fit()メソッドから生成されたパラメーター。モデルに適用され、変換されたデータセットを生成します。

fit_transform():同じデータセットでのfit()transform()apiの組み合わせ

ここに画像の説明を入力してください

チェックアウト章-4本から書籍から&答えstackexchangeより明確にするため


54

これらのメソッドは、特定のデータのスケールをセンタリング/特徴化するために使用されます。基本的に、特定の範囲内でデータを正規化するのに役立ちます

これには、Zスコア法を使用します。

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)

テストセットに同じ(トレーニングセットと同じ2つのパラメーターμおよ​​びσ(値))パラメーター変換を適用します。


1
この説明をありがとうございます。「フィット」の値が引き継がれるかどうか興味がありました。
Adib 2018年

2
コード例の+1。train_setでfit_transformを使用してからテストセットを変換できるのか、それとも列車で個別のfitが必要なのか
Vivek

2
テストテストではX_trainデータセットから計算されたμとσを使用する必要があるため、fit_tranform(..)はX_testには使用できません。fit_tranform(..)はトレーニングデータセットでのみ使用できます。私の理解を訂正してください。
daya

1
はい。それで合っています。X_trainから学習したパラメーターを使用してX_testデータを標準化するため、transform(..)のみをテストで使用できます
shaurya uppal

7

メソッド間の一般的な違い:

  • fit(raw_documents [、y]):生のドキュメント内のすべてのトークンの語彙辞書を学びます。
  • fit_transform(raw_documents [、y]):語彙辞書を学び、用語と文書の行列を返します。これは、変換の後にフィットするのと同じですが、より効率的に実装されます。
  • transform(raw_documents):ドキュメントをdocument-term行列に変換します。Extractトークンは、適合した語彙またはコンストラクターに提供された語彙を使用して、未加工のテキスト文書からカウントをカウントします。

fit_transformとtransformはどちらも同じDocument-term行列を返します。

ソース


4

.fit()&の基本的な違いは.fit_transform()次のとおりです。

。フィット():

モデルを適合させ、実行するモデルを作成するための2つのオブジェクト/パラメーター(x、y)を持つ教師あり学習での使用であり、予測対象がわかっている場合

.fit_transform():

教師なし学習で1つのオブジェクト/パラメーター(x)を使用している場合、何を予測するかわからない。


あまり正確ではありません。fit()は、教師なし学習でも使用できます。しかし、簡潔にするために単純化しすぎている場合は、初心者に説明するのに適しています。
Rajdeep Biswas

1

素人の言葉で言えば、fit_transformは何らかの計算を行ってから変換を行うことを意味します(たとえば、いくつかのデータから列の平均を計算してから、欠損値を置き換える)。したがって、トレーニングセットでは、計算と変換の両方を行う必要があります。

ただし、テストセットの場合、機械学習はトレーニングセットで学習された内容に基づいて予測を適用するため、計算する必要はなく、変換を実行するだけです。


0

それぞれを使用する理由と時期:

すべての応答は非常に良好ですが、私はなぜ、そしてそれぞれの方法を使用するのかを強調します。

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トランスフォーマー、他の種類のベクトライザー、トークナイザー...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.