Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ Final Estimator | パイプライン
Pythonによる機械学習入門

Final Estimator

メニューを表示するにはスワイプしてください

Pipeline は以前は前処理のために使用されていましたが、本来の目的は前処理と最終予測器を連結することです。パイプラインの最後のステップには、予測を生成する任意の推定器(通常はモデル)を指定できます。

Note
ノート

.fit() を呼び出すと、各トランスフォーマーは .fit_transform() を実行します。 .predict() を呼び出すと、パイプラインはデータを最終推定器に渡す前に .transform() を使用します。 これは、新しいデータもトレーニングデータとまったく同じように変換される必要があるためです。

なぜ .transform() を使うのか?

新しいデータに .fit_transform() を使用すると、エンコーディング(例:OneHotEncoder)が変更され、列が一致しなくなり、予測が信頼できなくなる可能性があります。 .transform()一貫した前処理を保証し、未知のカテゴリを無視し、同じ列順序を維持します。

これは変換前の元のデータセットです。この生データが変換プロセスの出発点となります。エンコーディングや前処理はまだ適用されておらず、各行には色特徴が文字列として表示されています。このデータがパイプライン内の前処理ステップで変換されます。

この表は、ワンホットエンコーディングのデータセットを示しています。Color列はカテゴリカルであり、数値ではなく文字列の値が含まれています。この列は、次のステップでワンホットエンコーディングを使用して個別のバイナリ列に変換されます。これは、ほとんどの機械学習モデルがカテゴリカルデータを正しく処理するために不可欠です。

ワンホットエンコーディング後のトレーニングデータは次のようになります。

下の表は、ワンホットエンコーディング適用後のデータセットを示しています。元のColor列は、Color_RedColor_BlueColor_Greenという個別のバイナリ列に置き換えられています。各列は、そのインスタンスが特定の色を持つ場合は1、そうでない場合は0を示します。

元の単一の Color 列が、Color_RedColor_BlueColor_Green の3つの個別の列に置き換えられていることに注目。各列は、そのインスタンスに特定の色が存在するかどうかを表し、1 は「はい」、0 は「いいえ」を示す。この変換は ワンホットエンコーディング と呼ばれる。

この変更は機械学習モデルにとって重要であり、ほとんどのアルゴリズムはテキストやカテゴリカルデータを直接扱うことができない。カテゴリを個別のバイナリ列に変換することで、モデルに明確な数値特徴量を提供し、パターンの学習や予測が可能となる。この方法は、元のカテゴリ間に順序関係があるとモデルが誤って仮定することを防ぎ、不適切な結論を避けることにもつながる。

予測対象となる新しいインスタンスは以下の通り。

こちらは予測対象となる新しいデータです。これは生データであり、変換や前処理が行われる前の「前」の状態です。パイプラインは、このデータをトレーニング時に使用した形式に変換してから予測を行います。

次のステップは、これらの新しいインスタンスに対して、以前に適合させたエンコーダーを用いて変換を行うことです。これにより、新しいデータがトレーニングデータと同じ方法で処理され、一貫性と信頼性のある予測がモデルから得られます。

.fit_transform()新しいインスタンス に適用すると、OneHotEncoder は異なる順序でカラムを生成したり、新しいカラムを追加したりする可能性があります。これにより、新しいデータがトレーニングセットと一貫性のない変換を受け、予測が信頼できなくなります。

新しいデータで .fit_transform() の代わりに .transform() を使用すると、エンコーダはそのデータを初めて見るものとして扱います。これにより、

  • 新しいデータからカテゴリを再学習する
  • 新しいカテゴリセットに基づいてカラムの順序が変わる
  • この場合の 'Color_Yellow' のような未知のカテゴリに対して新しいカラムを追加する

このような処理は、トレーニングデータと予測データの間に不一致を生じさせ、予測が信頼できなくなり、パイプラインでエラーが発生する可能性があります。

不正な変換と正しい変換の違いに注目。誤った変換を行ったテーブルには新しい列(Color_Yellow)が追加され、列の順序もトレーニングデータと異なっています。これにより、トレーニングと予測の間で一貫性が失われます。

  • モデルはトレーニング時と同じ列と順序を期待します;
  • 新しい列や順序の変更はモデルを混乱させ、誤った特徴量を使用します;
  • 入力構造がモデルが学習したものと一致しなくなるため、予測の信頼性が低下します。

常に .transform() を使って新しいデータを変換し、列と順序の一貫性を保つことが重要。これが正確で信頼できる予測のために不可欠です。

しかし、.transform() を使用すると、新しいデータがトレーニングデータとまったく同じ方法でエンコードされ、トレーニング時に存在しなかったカテゴリは無視されます。

.transform() を新しいデータに使用すると、トレーニング時の列のみが出力に含まれます。トレーニング時に存在しなかった 'Yellow' のようなカテゴリは無視されます。これにより、新しいデータがモデルの期待する構造と一致し、余分な列や不足した列が発生しません。

3つのテーブルの比較:

  • 元の訓練データ(ワンホットエンコーディング後)は、Color_RedColor_BlueColor_Green の列を持つ;
  • 誤って変換された新しいデータ.fit_transform() を使用)は、Color_Yellow 列を追加し、Color_Green を削除して、列の順序と構造を変更する;
  • 正しく変換された新しいデータ.transform() を使用)は、訓練セットと同じ列と順序を維持し、Yellow のような未知のカテゴリにはゼロを設定する。

.transform() を使用することが正しい方法であり、新しいデータが訓練データとまったく同じ方法で処理されることを保証する。これにより、モデルが期待する形式でデータを受け取り、エラーを防ぎ、予測の信頼性を高める。

最終推定器の追加

モデルをパイプラインの最後のステップとして追加:

pipe = make_pipeline(
    ct,
    SimpleImputer(strategy='most_frequent'),
    StandardScaler(),
    KNeighborsClassifier()
)
pipe.fit(X, y)
pipe.predict(X_new)

これにより、前処理と予測の全ワークフローを1回の呼び出しで実行できる。

12345678910111213141516171819202122232425262728293031323334353637
from sklearn.pipeline import make_pipeline from sklearn.compose import ColumnTransformer from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier import pandas as pd # Example data data = pd.DataFrame({ 'color': ['red', 'blue', 'green'], 'value': [1, 2, 3] }) labels = [0, 1, 0] # Define a simple column transformer (placeholder for real preprocessing) ct = ColumnTransformer([ ('imputer', SimpleImputer(strategy='most_frequent'), ['color']) ]) # --- Before: Pipeline with only preprocessing steps --- # This pipeline only transforms the data; it cannot make predictions. pipeline_preprocessing = make_pipeline( ct, StandardScaler() ) # pipeline_preprocessing.fit(data) # Only fits transformers, no estimator at the end # --- After: Pipeline with a final estimator --- # Now the pipeline ends with a model, so it can fit and predict. pipeline_full = make_pipeline( ct, StandardScaler(), KNeighborsClassifier() ) pipeline_full.fit(data, labels) predictions = pipeline_full.predict(data) print("Predictions:", predictions)

パイプラインの最後のステップとして最終推定器を追加することで、エンドツーエンドの完全なワークフローとなります。データの前処理だけでなく、パイプラインが前処理予測の両方を1つのオブジェクトで処理します。これにより、fit()predict()をパイプラインに直接呼び出すことができ、予測前にすべての前処理ステップが自動的に適用されます。

このアプローチは次の理由で重要です:

  • すべてのデータがトレーニング時と予測時でまったく同じ方法で処理されることを保証します。
  • 新しいデータで予測する際に前処理ステップを忘れるなどのエラーのリスクを減らします。
  • ワークフロー全体が1か所で管理されるため、コードがよりシンプルで保守しやすくなります。

前処理とモデリングを連結することで、機械学習プロジェクトにおける一貫性、信頼性、シンプルさを実現します。

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  5

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 3.  5
some-alt