当たり前だったのですが、意外に抜け落ちていたのでメモ。
こちらのサイトに丁寧に書かれていました!感謝! 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)
としがちなので注意ですね。