用語比較
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_transform | transform |
|---|---|---|
| やること | fit(平均と標準偏差の計算)のあと、transform(変換)まで行う | fit で計算済みの値を使って、変換だけを行う |
| 使うデータ | 学習用データ(train)だけ | 学習用データとテスト用データの両方 |
| テストデータに使うと | 公式は、テストデータを含めて fit や fit_transform を使うと、スコアが楽観的になりうると説明している | 問題なし。学習用データで学んだ値を、テスト用データにも同じように適用する |
| 公式の例(StandardScaler) | scaler.fit_transform(X_train) で学習用データを変換する | scaler.transform(X_test) でテスト用データを変換する |
Python3エンジニア認定データ分析試験の学習に使う書籍(Amazon)
PRどこで迷っているかを切り分ける
学習データだけ変換して、テストデータは変換しなかった人
公式は、これを誤りの例に挙げています。学習用だけをスケーリングしてテスト用をそのまま predict に渡すと、テストでの性能が期待より悪くなります。テスト用にも transform を使ってください。
全データに fit_transform をかけてから分割した人
公式は、データはまず学習用とテスト用に分け、前処理はその後に行うよう説明しています。全データで平均などを計算すると、テストの情報が学習に混ざります。
毎回どちらを使うか迷う人
公式は、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
先にデータを分ける
公式のヒントのとおり、前処理の前に、学習用とテスト用に分けます。
- 2
学習用データに fit_transform
学習用データから平均などを学び、そのまま変換します。
- 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 がデータリークの防止に役立つ理由を言える
関連ページで確認する
同じ資格で次に知りたいこと
- astypeとto_numericの違い|変換できない値の扱いとerrors(pandas・Python3データ分析)
pandasのastypeとto_numericの違いを、変換できる型、変換できない文字列の扱い(errors='coerce')、downcastで整理します。pandas公式で照合した例と確認問題つき。
- NumPy配列とPythonのリストの違い|演算子・要素の型・スライスの結果で比較(Python3データ分析)
NumPyのndarrayとPythonのリストの違いを、要素の型、+ と * の意味、比較演算、スライスの結果(ビューか新しいリストか)で整理します。NumPy公式Quickstartとpython.org公式ドキュメントで照合した例と確認問題つき。
- StandardScalerとMinMaxScalerの違い|平均0・分散1と0〜1の範囲(scikit-learn)
scikit-learnのStandardScalerとMinMaxScalerの違いを、変換の式、変換後の値の範囲、外れ値の影響、新しいデータの扱いで整理します。scikit-learn公式の例で照合した確認問題つき。
よくある質問
Qfit_transform と transform の違いは?
fit_transform は当てはめてから変換し、transform は当てはめ済みの値で変換だけを行います。公式は、学習用データに fit_transform、テスト用データに transform を使うよう説明しています。
Qテストデータに fit_transform を使ってはいけないのはなぜですか?
テストデータの情報が前処理を通じてモデルに影響し、スコアが実際より良く出ることがあるためです。これをデータリークといいます。
QPipeline を使うと何が楽になりますか?
正しいデータに正しいメソッドが使われるので、データリークを防げます。
Qデータ分析試験の範囲?
本サイトの第6章scikit-learnの「変換器とパイプライン」で扱います。出題の形式や範囲は、受験前に公式の案内で確認してください。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: AI資格ドリル編集部(運営者情報を見る)
