scikit_learnモデルのfitとfit_transformの違いは?


110

私はデータサイエンスの初心者でfitありfit_transform、scikit-learnのメソッドとメソッドの違いを理解していません。誰がデータを変換する必要があるのか​​を簡単に説明できますか?

トレーニングデータにモデルを適合させ、テストデータに変換することはどういう意味ですか?たとえば、カテゴリ変数をトレイン内の数値に変換し、新しい機能セットをテストデータに変換するということですか?



@sds上記の回答は、この質問へのリンクを提供します。
Kaushal28

に適用fitし、メソッドtraining datasetを使用します-トレーニングデータセットとテストデータセットtransformboth
Prakash Kumar

回答:


117

データ中央に配置するには(平均値と単位標準誤差がゼロになるように)、平均値を引き、結果を標準偏差で除算します。

x=xμσ

トレーニングデータセットでそれを行います。ただし、テストセット(クロス検証など)に同じ変換を適用するか、予測前に新しく取得したサンプルに適用する必要があります。ただし、トレーニングセットのセンタリングに使用したものと同じ2つのパラメーターおよび(値)を使用する必要があります。μσ

したがって、すべてのsklearnの変換fit()はパラメーター(たとえば、StandardScalerの場合はおよび)を計算し、それらを内部オブジェクトの状態として保存します。その後、そのメソッドを呼び出して、特定の例のセットに変換を適用できます。μσtransform()

fit_transform()これらの2つのステップを結合し、トレーニングセットパラメーターの初期適合に使用されますが、変換されたも返します。内部的には、それだけで最初に呼び出して、次に同じデータに。xxfit()transform()


1
あなたの答えに感謝します。ただ一つのことです。モデルのパラメータによって、それは回帰の例の勾配と切片を意味しませんか?フィットするとき、たとえば、どのメソッドがフィットメソッドにフィットするかについて線形回帰を考えましょう。正規化パラメーターまたは勾配や切片などのモデルパラメーター?
Kaggle

1
つまり、変換の内部パラメーター(StandardScalerの場合はおよび)を意味します。変換のメソッドが返すものは何でも。例えば、転嫁にこの章を参照してください:scikit-learn.org/stable/modules/...μσget_params()
K3 --- RNC

2
私の前のコメントは実際には間違っています。線形回帰の場合、近似パラメーターはcoef_(つまり勾配と切片)であり、返されるものではありませんget_params()(代わりに、関連する値を持つモデルコンストラクター引数のセットを返します)。
K3 --- rnc

素晴らしい答えです!このトピックの検索中にあなたの投稿に出会いましたが、明確にする必要があります。つまり、後続の例の各セットを変換fit_transform()する場合、内部オブジェクトの状態にアクセスできないため、呼び出してはいけませんfit()。最初のデータセットで取得した同じパラメーターで後続の例を変換しますか?これは、たとえば、テストデータセットがあり、テストセットを変換してトレーニング済み分類器に渡す場合に発生します。
AKKA

を呼び出すとt.fit_transform(train_data)t 装着されるため、を安全に使用できますt.transform(test_data)
K3 --- rnc

10

以下の説明は基づいているfit_transformImputerクラスが、考え方は同じであるためfit_transformのような他のscikit_learnクラスのMinMaxScaler


transform欠損値を数値に置き換えます。デフォルトでは、この数値は、選択した一部のデータの列の平均です。次の例を考えてみましょう。

imp = Imputer()
# calculating the means
imp.fit([[1, 3], [np.nan, 2], [8, 5.5]])

これで、入力者は、2列のデータに適用される場合、最初の列に平均(1 + 8)/ 2 = 4.5、2番目の列に平均(2 + 3 + 5.5)/ 3 = 3.5を使用することを学びました。

X = [[np.nan, 11], 
     [4,      np.nan], 
     [8,      2],
     [np.nan, 1]]
print(imp.transform(X))

我々が得る

[[4.5, 11], 
 [4, 3.5],
 [8, 2],
 [4.5, 1]]

そのfitため、入力transform者は一部のデータから列の平均を計算し、それらの平均を一部のデータに適用します(欠損値を平均で置き換えるだけです)。これらのデータが両方とも同じである場合(つまり、平均を計算するためのデータと平均が適用されるデータ)fit_transform、基本的にaがfit後に続くを使用できますtransform

あなたの質問:

データを変換する必要があるのはなぜですか?

「様々な理由から、多くの実世界のデータセットは、しかし。多くの場合、ブランク、NaNをまたは他のプレースホルダとしてエンコードされ、このようなデータセットを欠損値が含まれているアレイ内のすべての値が数値であることを前提と推定しscikitは、学ぶと互換性がありません」(ソース

トレーニングデータにモデルを適合させ、テストデータに変換することはどういう意味ですか?

入力者のモデルは、モデルのフィッティングfitfit使用されることとは関係ありません。そのためfit、トレーニングデータの入力者を使用すると、トレーニングデータの各列の平均が計算されます。transformonテストデータを使用すると、テストデータの欠損値がトレーニングデータから計算された平均値に置き換えられます。


3

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

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


3

これらのメソッドは、scikit-learnのデータセット変換に使用されます。

データセットの値のスケーリングの例を見てみましょう。

ここで、適合方法は、トレーニングデータセットに適用されると、モデルパラメーター(平均や標準偏差など)を学習します。次に 、トレーニングデータセットに変換メソッドを適用して、変換された(スケーリングされた)トレーニングデータセットを取得する必要があります。トレーニングデータセットにfit_transformを適用することにより、この両方のステップを1ステップで実行することもできます。

それでは、なぜフィット変換という 2つの別個のメソッドが必要なのでしょうか?

実際には、個別のトレーニングデータセットとテストデータセットが必要です。これは、個別の適合および変換メソッドが役立つ場合に役立ちます。トレーニングデータセットに適合を適用し、トレーニングデータセットとテストデータセットの両方で変換メソッドを使用します。したがって、トレーニングとテストデータセットは、フィットデータをトレーニングデータセットに適用する際学習したモデルパラメーターを使用して変換(スケーリング)されます。

サンプルコード:

scaler = preprocessing.StandardScaler().fit(X_train)
scaler.transform(X_train) 
scaler.transform(X_test) 

2

これは技術的な答えではありませんが、願わくば、直感を構築するのに役立つことを願っています。

まず、すべての推定量はいくつかのトレーニングデータでトレーニング(または「適合」)されます。その部分はかなり簡単です。

第二に、scikit-学ぶ推定量の全ては、パイプラインで使用することができ、パイプラインでのアイデアは、データが流れている経由のパイプライン。パイプラインの特定のレベルに収まると、データはパイプラインの次のステージに渡されますが、明らかに何らかの方法でデータを変更(変換)する必要があります。それ以外の場合は、パイプラインのそのステージはまったく必要ありません。したがって、変換は、パイプラインの次の段階のニーズを満たすためにデータを変換する方法です。

あなたがパイプラインを使用していない場合、私はまだそれが最も単純な分類器がされて、ため、この方法でこれらの機械学習ツールについて考えて便利だと思うまだ分類機能を実行します。入力としていくつかのデータを受け取り、出力を生成します。これもパイプラインです。とてもシンプルなものです。

要約すると、fitはトレーニングを実行し、transformはパイプラインの次のステージに渡すためにパイプラインのデータを変更し、fit_transformは1つの最適化されたステップでフィッティングと変換の両方を行います。


「「トレーニングデータセットに適合を適用し、トレーニングデータセットとテストデータセットの両方で変換メ​​ソッドを使用します」」:)ニース
Prakash Kumar

2
以下にコメントするつもりだったと思います。それをPrasad Nageshkarに転送します。(まあ...評判があったらいいと思います。)
エリック・マクラクラン

1

変換を適用することにより、たとえば2つの変数と両方が距離を測定するが、の単位がセンチメートルで、の単位がキロメートルである場合、これら2つを比較するために、データを通常の動作にしようとしていますそれらを同じ単位に変換する必要があります...変換が同様の動作をする、または正規分布のように動作するようにするV1V2V1V2

他の質問になると、まずトレーニングセットでモデルを構築します(モデルはトレーニングセットからデータのパターンまたは動作を学習します)。テストセットで同じモデルを実行すると、同様のパターンまたは動作を識別しようとします。識別したら、結論を出し、それに応じてトレーニングデータを提供します


0

データを正規化する必要があるタスクを考えてください。たとえば、min-max正規化またはzスコア正規化を使用できます。モデルにはいくつかの固有のパラメーターがあります。min-max正規化の最小値と最大値、およびzスコア正規化の平均値と標準偏差。fit()関数は、これらのパラメーターの値を計算します。

fit()の効果

変換関数は、パラメーターの値を実際のデータに適用し、正規化された値を提供します。

transform()の効果

fit_transform()関数は、同じステップで両方を実行します。

fit_transform()の効果

2ステップで実行しても1ステップで実行しても同じ値が得られることに注意してください。


0

「fit」は、後のスケーリングに使用される平均と標準を計算します。(計算を行う)、何も与えられません。

「変換」は、以前に計算された平均とstdを使用してデータを自動スケーリングします(すべての値から平均を減算し、それをstdで除算します)。

「fit_transform」は両方を同時に行います。したがって、2行ではなく1行のコードで実行できます。

それでは実際に見てみましょう:

以下のためにXのトレーニングセット我々は平均とstdを計算し、データを自動スケーリングするためにそれを使用する必要があるため、私たちは「fit_transform」を行います。Xテストセットについては、平均値と標準値が既にあるので、「変換」部分のみを行います。

とても簡単です。お元気ですか。あなたの良い仕事を私の友人にしてください:-)

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