ごはんと飲み物は紙一重

データ分析や機械学習・深層学習関連の勉強を大学でしていたら、いつのまにか南の島でデータ菜園することになっちゃいました。PythonやMachineLearning関連の記事を書いてます。あとは気まぐれで書く日記などなど・・・

fit と transform と fit_transformの違いと学習する際の注意点

当たり前だったのですが、意外に抜け落ちていたのでメモ。

こちらのサイトに丁寧に書かれていました!感謝! mathwords.net

数値計算ライブラリscikit-learnでよくある「fit」と「transform」と「fit_transform」がどういう役割をしていて、なぜ分けられているかを皆さん改めて説明できますか?

というわけで説明。ここではscikit-learnの「MinMaxScaler」を参考にします。

fit の役割

fit関数では、「データを変換するために必要な統計情報を計算」します。つまり今回のMinMaxScalerクラスではあくまで計算のみを実行します。なので、実際にデータに対して正規化は 実行されていません。あくまでもあるデータに対して、最小値と最大値を計算するだけにとどまります。

transform の役割

transform関数では、fit関数の実行した結果を用いて、実際に正規化を 実行します

fit_transform の役割

これはfit関数とtransform関数の役割をつなげて一気に 実行します

なぜ別れているのか

テストデータの変換には、 訓練データで計算された最小・最大値 を使用するからです。何が言いたいかというと、回帰モデルを作成した際には 前処理された訓練データ を用いて学習されるため、テストデータに対する評価も同様に 訓練データに行った前処理 を実行する必要があります。なので、訓練データで行った前処理、MinMaxScalerクラスで計算した最小値と最大値は、テストデータにも適用されるということです。

なので、

norm = MinMaxScaler()
train_minmax = norm.fit(df_train) # fitするのはtrainデータのみ

norm_train_COLUMNS_NAME = norm.transform(df_train)
norm_test_COLUMNS_NAME = norm.transform(df_test)

となるように気をつけましょう。オリジナルな学習を試すときにこれまで説明していたことをわかっていても、実装上ではエラーが出ないために norm.fit(df) としがちなので注意ですね。