AI資格ドリル
資格を選ぶ

用語比較

fit_transformとtransformの違い|テストデータにfitしない理由(Python3データ分析)

fit_transform はデータに当てはめて(fit)から変換するメソッドです。単独で呼ぶ transform は、当てはめ済みの結果を使い、変換だけを行います。

公式の使い分けは、学習用データに前者、テスト用データに後者です。テスト用にまで当てはめると、スコアが実際より良く出ることがあります。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。

fit_transformとtransformの要点

fit_transform

公式の説明は「Fit to data, then transform it.」。X に当てはめて、変換した X を返す。学習用データに使う。

transform

fit で計算した結果(StandardScaler なら平均と標準偏差)を使って変換する。学習用にもテスト用にも使い、同じ前処理をそろえる。

違いを表で確認

比較軸fit_transformtransform
やることfit(平均と標準偏差の計算)のあと、transform(変換)まで行うfit で計算済みの値を使って、変換だけを行う
使うデータ学習用データ(train)だけ学習用データとテスト用データの両方
テストデータに使うと公式は、テストデータを含めて fit や fit_transform を使うと、スコアが楽観的になりうると説明している問題なし。学習用データで学んだ値を、テスト用データにも同じように適用する
公式の例(StandardScaler)scaler.fit_transform(X_train) で学習用データを変換するscaler.transform(X_test) でテスト用データを変換する

Python3エンジニア認定データ分析試験の学習に使う書籍(Amazon)

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

学習データだけ変換して、テストデータは変換しなかった人

公式は、これを誤りの例に挙げています。学習用だけをスケーリングしてテスト用をそのまま predict に渡すと、テストでの性能が期待より悪くなります。テスト用にも transform を使ってください。

02

全データに fit_transform をかけてから分割した人

公式は、データはまず学習用とテスト用に分け、前処理はその後に行うよう説明しています。全データで平均などを計算すると、テストの情報が学習に混ざります。

03

毎回どちらを使うか迷う人

公式は、Pipeline を使うと、正しいデータに正しいメソッドが使われるのでデータリークを防げると説明しています。

具体例で使い分ける

例 1

StandardScaler: fit で平均を求め、transform で変換する

公式の例のとおり、data=[[0,0],[0,0],[1,1],[1,1]] に StandardScaler の fit を行います。

  • fit のあと、scaler.mean_ は [0.5 0.5] になります。
  • scaler.transform(data) は [[-1,-1],[-1,-1],[1,1],[1,1]] を返します。
  • 同じ scaler で scaler.transform([[2,2]]) を行うと [[3,3]] になります。fit で求めた平均と標準偏差が、新しいデータにも使われます。

結論: transform は fit で求めた値を使います。新しいデータで求め直しません。

例 2

誤りの例: テストデータを変換せず predict に渡す

公式の例のとおり、X_train に scaler.fit_transform を行い、LinearRegression を X_train_transformed と y_train で学習します。

  • 変換していない X_test を model.predict に渡すと、mean_squared_error は 62.80... になります。
  • 学習は変換後のデータで行ったのに、予測は変換前のデータで行っているためです。

結論: 学習に使った変換は、テストデータにも同じように行います。

例 3

正しい例: テストデータに transform を行う

同じ公式の例で、X_test_transformed = scaler.transform(X_test) を作り、predict に渡します。

  • mean_squared_error は 0.90... になります。
  • テストデータでは fit をやり直さず、学習データで学んだ変換をそのまま適用しています。

結論: 学習データに fit_transform、テストデータに transform が基本の組み合わせです。

問題文から答えを選ぶ手順

  1. 1

    先にデータを分ける

    公式のヒントのとおり、前処理の前に、学習用とテスト用に分けます。

  2. 2

    学習用データに fit_transform

    学習用データから平均などを学び、そのまま変換します。

  3. 3

    テスト用データに transform

    学習用データで学んだ値を使って変換します。テスト用データに fit や fit_transform は使いません。

試験での見分け方

  • 1fit_transform は、データに当てはめてから変換した X を返す。
  • 2transform は、fit で求めた値を使って変換するだけで、学習用にもテスト用にも使う。
  • 3テストデータを含めて fit や fit_transform を使わない。スコアが楽観的になりうる。
  • 4前処理の前に、学習用とテスト用に分ける。
  • 5Pipeline を使うと、正しいデータに正しいメソッドが使われ、データリークを防げる。

誤答しやすい選択肢

テストデータにも fit_transform を使う

修正: 公式は、テストデータを含めて fit や fit_transform を使わないよう説明しています。テストデータには transform を使います。

学習用データだけ変換し、テスト用データは変換しない

修正: 学習用に行った前処理は、テスト用にも同じように適用します。公式の例では、変換しないと 62.80...、変換すると 0.90... でした。

分割する前に全データで前処理する

修正: 公式は、前処理の前に、データを学習用とテスト用に分けるよう説明しています。

確認問題

Q1学習用データとテスト用データのうち、fit_transform を使うのはどちらか?

答え: 学習用データ

公式は、学習用データに fit_transform、テスト用データに transform を使う方法を説明しています。

Q2StandardScaler を data=[[0,0],[0,0],[1,1],[1,1]] に fit したとき、mean_ は?

答え: [0.5 0.5]

公式の例の結果です。続けて transform([[2,2]]) を行うと [[3,3]] になります。

Q3テストデータを含めて fit や fit_transform を使うと、どんな問題が起こりうるか?

答え: スコアが楽観的になりうる(データリーク)

公式は、テストデータの情報がモデルに影響し、スコアが楽観的になる、と説明しています。

Q4正しいデータに正しいメソッドが使われるよう、データリークを防ぐ仕組みは?

答え: Pipeline

公式は、Pipeline がデータリークの防止に役立つと説明しています。

到達チェック

  • fit_transform と transform の違いを説明できる
  • 学習用とテスト用に使うメソッドを言い分けられる
  • テストデータに fit しない理由(データリーク)を説明できる
  • Pipeline がデータリークの防止に役立つ理由を言える

同じ資格で次に知りたいこと

よくある質問

Qfit_transform と transform の違いは?

A

fit_transform は当てはめてから変換し、transform は当てはめ済みの値で変換だけを行います。公式は、学習用データに fit_transform、テスト用データに transform を使うよう説明しています。

Qテストデータに fit_transform を使ってはいけないのはなぜですか?

A

テストデータの情報が前処理を通じてモデルに影響し、スコアが実際より良く出ることがあるためです。これをデータリークといいます。

QPipeline を使うと何が楽になりますか?

A

正しいデータに正しいメソッドが使われるので、データリークを防げます。

Qデータ分析試験の範囲?

A

本サイトの第6章scikit-learnの「変換器とパイプライン」で扱います。出題の形式や範囲は、受験前に公式の案内で確認してください。

次に見る比較

執筆: AI資格ドリル編集部(運営者情報を見る)