この記事は、個人技術ブログ CodeArchPedia.com の技術メモ(要約)です。
機械学習モデルを本番環境で運用する際、訓練データと推論データの前処理の一貫性を保つのが本当に骨が折れます。特に欠損値処理をパイプラインに組み込もうとすると、Pandasの直接操作だと再現性が担保しにくくなる問題に直面しました。
何が起きたか(課題)
Scikit-learnの Pipeline を使って機械学習ワークフローを構築する際、特定の入力カラム(特徴量)にNULL値が含まれる行を、訓練・テスト・推論の全段階で確実に削除したいという要件がありました。しかし、Pandasの df.dropna() はPipelineのTransformerとして直接使えず、個別に処理すると、前処理ステップが分散してしまいミスを誘発しやすくなります。
- 欠損値処理をパイプラインから分離すると、データセット間で処理のズレが生じるリスクがある。
- 特定のカラムだけに注目して行削除を行いたいが、標準的なTransformerではこれを実現するのが難しい。
- 再現性の高い機械学習エンジニアリングのベストプラクティスから外れてしまう。
どう解決したか(概要)
この課題を解決するため、sklearn-pandas パッケージの DataFrameMapper を導入しました。DataFrameMapperを使えば、PandasのDataFrame構造を維持したまま、Scikit-learn互換のAPIで前処理を定義できます。
解決の鍵は、Mapperの定義タプルに特定のオプションを指定することです。カラム 'A' を対象としてNULL行を削除する場合、以下のように定義します。
mapper = DataFrameMapper(
[(['A'], None, 'dropna')],
df_out=True
)
ここで、3つ目の引数に 'dropna' を指定することで、DataFrameMapperはそのカラムにNULL値を持つ行全体をフィルタリングして削除する動作をします。他のカラムBやCはそのまま保持(変換器として None)し、結果はDataFrame形式で出力 (df_out=True) されます。
このアプローチにより、データクレンジングステップ全体をモデル定義の一部としてカプセル化できました。
効果(Before/After)
DataFrameMapperの導入により、訓練時と推論時で同じルールセット(NULL行削除)を適用できるようになったため、データ処理の一貫性が劇的に向上しました。単発のPandas操作ではなく、パイプラインの一部として定義されたため、再利用性と保守性が高まりました。
| 項目 | 変更前(手動操作のリスク) | 変更後(DataFrameMapper適用) |
|---|---|---|
| 前処理の組み込み | 手動での複数ステップ実行が必要 | 単一のTransformerとしてパイプラインに組み込み可能 |
| 再現性 | 定義が分散し、再現性の担保に注意が必要 | モデル定義と完全に紐づき、再現性が保証される |
| 出力形式 | 変換器によってSeriesやNumpy配列になる可能性 |
df_out=TrueでDataFrameを維持可能 |
🚀 詳細な設定とコードはこちら
具体的なWAFのルール設定や、より詳細なログ解析データは元のブログで公開しています。