AIのデータ前処理は、集めたデータを学習アルゴリズムが利用できる表現へ変換する工程です。欠損値、単位の違い、数値の尺度、カテゴリの扱いを決め、学習時と予測時に同じ処理を適用します。
何を変換するかと、その変換規則をどのデータから求めるかを分けて考えることが重要です。見た目を整えるだけでは、モデルを正しく評価できるとは限りません。
最初に、値の意味と異常の理由を確認する
空欄は未回答、測定失敗、対象外など複数の意味を持ちます。すべてを0にすると「値がゼロだった」という別の意味になります。外れた数値も入力ミスとは限らず、まれに起きる正常な状態かもしれません。
| 見つかった状態 | すぐに行わないこと | 確認する内容 |
|---|---|---|
| 売上額が空欄 | 一律に0で埋める | 未集計か、売上なしなのか |
| 測定値が大きい | すべて削除する | 単位違い、機器異常、正常なピークか |
| カテゴリ表記が違う | 意味を確認せず統合する | 同じ対象の別表記か、別区分か |
| 同じ行がある | 機械的に全削除する | 再送か、独立した同内容の記録か |
処理前のデータを残し、変更した理由と対象を記録します。正しい値を削った場合に、元へ戻せるようにするためです。
学習データから規則を求め、評価データへ適用する
scikit-learnの公式資料は、学習用とテスト用を先に分け、平均などの変換規則を学習側だけで求めるよう説明しています。テストデータでfitすると、評価用の情報がモデル作成へ入り、評価が楽観的になる可能性があります。scikit-learnのデータ漏洩対策
たとえば学習側の値が10と20なら、平均は15です。評価側の100を含めると平均は約43.3となり、学習時の変換が評価側の分布に影響されます。評価側にも学習側で求めた平均15などの規則を適用し、別々に規則を学び直さないようにします。
単位を円にそろえるなど事前に固定した規則と、平均・中央値をデータから求める処理は区別できます。交差検証では、各回の学習部分の中で規則を求める必要があります。
欠損値とカテゴリを、モデルに合う形へ変える
欠損を中央値などで補う方法はありますが、その値が真の観測値になるわけではありません。欠損したかを示す列を追加する、欠損を扱えるモデルを検討するなど、目的と原因に応じて比較します。
カテゴリを数値にするときも注意が必要です。「東京=1、大阪=2、福岡=3」とすると、モデルによっては大小関係を意味として扱います。順序のないカテゴリでは、区分ごとの列に分けるone-hot表現などが候補になります。
本番で初めて現れるカテゴリをどう扱うかも決めます。処理を失敗させる、未知カテゴリとして扱うなどの選択肢があり、黙って既知の区分へ置換しないことが大切です。
数値の尺度をそろえる必要があるか判断する
距離や正則化の影響を受けるモデルなどでは、桁の大きい特徴量が計算へ強く影響する場合があります。標準化は平均を引き標準偏差で割る変換の一例です。scikit-learnは、前処理が生の特徴を推定器に適した表現へ変えるための機能であると説明しています。scikit-learnの前処理の説明
すべてのモデルに同じ標準化を義務付ける必要はありません。外れ値の影響も踏まえ、使用するモデルと評価結果で判断します。変換後の数値だけを見て、元の単位や意味を見失わないようにします。
学習時と予測時の処理を一致させる
学習時だけ欠損を補い、本番では空欄のまま渡すと、同じモデルでも条件が変わります。列の順番、型、単位、変換の版をそろえ、学習済みの変換規則をモデルと一緒に保存します。
scikit-learnのPipelineは変換と推定器をつなぐ方法です。ただし、Pipelineの外で全データを使って前処理を済ませれば、漏洩を防げるわけではありません。どの処理がどのデータで学習されるかを確認する必要があります。
変換の前後を小さいデータで照合する
通常の値だけでなく、欠損、未知カテゴリ、極端な値、対象0件を含む小さな例で動きを確かめます。学習側へ追加した処理が、本番入力にも適用されるかを確認します。
前処理はモデルの外側にある雑務ではなく、予測の再現性を支える部分です。業務データの意味を整理したうえで、利用環境に合う処理へ落とし込む際は、テクノヴァースのAI活用支援をご確認ください。