← 機械学習テキスト 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 前提:訓練・検証・テストと交差検証(リーク防止)

要点(BLUF)

1. なぜ前処理が重要か — Garbage In, Garbage Out

機械学習のモデルは、与えられた特徴量に書かれている情報以上のことは学べません。どんなに高性能なアルゴリズムでも、入力が荒れていれば出力も荒れます。これを Garbage In, Garbage Out(ゴミを入れればゴミが出る) と言います。

実務では、モデル選びやハイパラ調整よりも、前処理と特徴量設計に時間の大半を使うのが普通です。理由はシンプルで、

からです。前処理は地味ですが、性能への効きが一番大きい工程だと考えてください。

flowchart LR
  RAW["生データ"] --> CLEAN["欠損値処理"]
  CLEAN --> SCALE["数値スケーリング"]
  SCALE --> ENC["カテゴリのエンコーディング"]
  ENC --> FEAT["特徴量生成・選択"]
  FEAT --> MODEL["モデル学習"]

要するに:モデルの性能はデータの質で頭打ちになるので、前処理は「あとからやる雑用」ではなく性能の主役級の工程です。

2. 数値のスケーリング — 標準化と正規化

数値特徴量は、スケール(値の桁・範囲)がバラバラなことが多いです。たとえば年齢(0〜100)と年収(0〜数百万)を一緒に使うと、距離や勾配の計算で桁の大きい特徴量だけが効いてしまう。これを揃えるのがスケーリングです。

標準化(z-score)

平均0・標準偏差1に揃えます。

x=xμσx' = \frac{x - \mu}{\sigma}

ここで μ\mu は特徴量の平均、σ\sigma は標準偏差です。

要するに:「平均から標準偏差いくつ分ずれているか」に変換します。外れ値があっても極端には潰れにくく、最もよく使う既定の選択です。

正規化(min-max)

最小0・最大1の範囲に押し込めます。

x=xxminxmaxxminx' = \frac{x - x_{\min}}{x_{\max} - x_{\min}}

要するに:値を [0,1][0, 1] に直線で詰め込みます。範囲が決まっていて扱いやすい一方、外れ値に弱い(1個の極端な値が xmaxx_{\max} を引っ張ると、他がすべて狭い範囲に押し潰される)。

なぜスケーリングが要るのか — 手法ごとの理由

スケーリングの要否は、アルゴリズムが特徴量をどう使うかで決まります。

手法のタイプスケーリング理由
距離ベースk近傍・SVM・k-means必要ユークリッド距離が桁の大きい特徴量に支配される
勾配ベース線形回帰(最小二乗法と確率的解釈)・ロジスティック回帰・ニューラルネット必要スケールが違うと損失曲面が歪み、勾配降下の収束が遅くなる/正則化が不公平になる
分散ベース主成分分析と次元削減(PCA)必要分散最大の方向を探すため、分散の大きい特徴量(=桁の大きい特徴量)に主成分が引っ張られる
木系決定木・ランダムフォレスト・勾配ブースティング不要分割は「しきい値で大小を分ける」だけ。単調変換しても順序が変わらず分割点も変わらない

木系がスケール不変なのは本質的です。決定木は「x<5x < 5 か否か」のように順序(大小)だけを見ます。標準化や正規化は単調増加変換なので順序を保存し、対応するしきい値に直されるだけで分割は同じになります。だから木系に標準化をかけても性能は変わりません(無駄ではないが不要)。

要するに:距離・勾配・分散を使う手法はスケールに敏感なので揃える。木系は大小だけ見るので不要。

3. カテゴリのエンコーディング

モデルは数値しか扱えないので、「赤・青・緑」のようなカテゴリ変数を数値に変換します。代表的な3つを使い分けます。

One-hot エンコーディング

各カテゴリを 0/1 の列に展開します。「色」が3種類なら 色_赤色_青色_緑 の3列にして、該当する列だけ1にします。

ラベルエンコーディング

カテゴリを整数に対応させます(赤→0、青→1、緑→2)。1列で済みますが、勝手に順序・距離が生まれる(緑が赤の2倍、という誤った大小関係)。

順序が本当に意味を持つ順序尺度(小・中・大→0・1・2)には適切ですが、順序のない名義尺度に線形モデルで使うのは危険です。一方、木系では大小を分割に使うだけなので、ラベルエンコーディングでも害が少なく、列が増えない利点が活きます。

ターゲットエンコーディング

各カテゴリを、そのカテゴリにおける目的変数の平均で置き換えます。たとえば「都市」を「その都市での平均購入額」に変換します。1列で高カーディナリティをさばける強力な手法ですが、目的変数を使うためデータリークと過学習のリスクが高い(詳細は第6節)。

flowchart TD
  CAT["カテゴリ変数"] --> Q1{"順序がある?"}
  Q1 -->|"はい(小中大など)"| LBL["ラベルエンコーディング"]
  Q1 -->|"いいえ"| Q2{"カーディナリティは?"}
  Q2 -->|"低い"| OH["One-hot エンコーディング"]
  Q2 -->|"高い"| TGT["ターゲットエンコーディング(リーク注意)"]

要するに:順序ありはラベル、順序なしで種類が少なければone-hot、種類が多すぎてone-hotが爆発するならターゲット(ただしリーク対策必須)。

4. 欠損値処理

現実のデータには欠損(NaN)がつきものです。多くのモデルは欠損があると学習できないので、対処します。

削除か、補完か

補完の方法

方法内容向き
平均補完その列の平均で埋める分布が左右対称なとき
中央値補完その列の中央値で埋める歪んだ分布・外れ値があるとき(中央値は外れ値に強い)
最頻値補完最も多いカテゴリで埋めるカテゴリ変数
モデルベースk近傍・回帰・ランダムフォレストで欠損値を予測して埋める特徴量間に相関があり、精度を上げたいとき

単純補完(平均など)は手軽ですが、分散を縮める(同じ値を多数入れるので分布が痩せる)という副作用があります。モデルベース補完は他の特徴量との関係を使うので精度は上がりますが、計算が重くなります。

欠損の仕組み — MCAR / MAR / MNAR

なぜ欠損したかで、適切な対処が変わります。

要するに:歪んだデータは中央値、相関があるならモデルベース。そして「なぜ欠けたか(MCAR/MAR/MNAR)」で偏りの出方が変わるので、欠損のパターンも調べます。

5. 特徴量生成・選択

既存の特徴量から、より学習に効く新しい特徴量を作る/削るのが特徴量エンジニアリングの花形です。

特徴量生成

特徴量選択・次元削減

特徴量が多すぎると、ノイズの混入・過学習・計算コストの増大を招きます。減らす方向の工夫も重要です。

要するに:人の知識で効く特徴量を足し、効かない・冗長な特徴量を減らす。両方向のチューニングが効きます。

6. ⚠️ データリーク — 最重要の落とし穴

前処理で最も致命的なミスが データリーク(data leakage) です。前処理の基準(平均・分散・エンコード表など)を全データで計算してしまうと、テストの情報が訓練側に漏れ、開発中だけ優秀で本番で崩れるモデルになります(訓練・検証・テストと交差検証)。

鉄則:fit on train, transform on test

前処理には2つの段階があります。

ここで守るべきは、fit は訓練データだけで行い、検証/テストには transform を当てるだけにすることです。

flowchart TD
  ALL["全データ"] --> SPLIT["分割を先に行う"]
  SPLIT --> TR["訓練データ"]
  SPLIT --> TE["テストデータ"]
  TR --> FIT["fit:平均・分散・エンコード表を学ぶ(訓練だけ)"]
  FIT --> TTR["transform:訓練を変換"]
  FIT --> TTE["transform:テストを変換(訓練の基準を当てる)"]
  TTR --> MODEL["モデル学習"]
  TTE --> EVAL["最終評価"]

テストの平均や分散を使ってしまうと、「未知のはずのテストを少し覗いてから訓練した」ことになり、評価が楽観的に出ます。本番で来るデータの平均・分散は事前にわからないので、訓練で決めた基準をそのまま当てるのが現実に即した正しいやり方です。

交差検証では各 fold 内で前処理する

k分割交差検証でも同じ原則が効きます。前処理を分割前に1回やってしまうと、各 fold の検証データの情報が前処理の基準に混じり、リークします。正しくは、**各 fold の中で「訓練側だけで fit → 検証側に transform」**を毎回やり直します(訓練・検証・テストと交差検証)。前処理+モデルをパイプラインにまとめ、それを交差検証にかけると、この順序が自動で守られて安全です。

ターゲットエンコーディングは特にリークしやすい

第3節のターゲットエンコーディングは目的変数の平均を使うので、自分の行の目的変数を使ってその行の特徴量を作ると、答えを覗いていることになります。対策は、

要するに:前処理の「基準を学ぶ(fit)」は必ず訓練データだけで。テストや他 fold の情報を一滴も混ぜないことが、本番で崩れないモデルの条件です。

7. まとめ


対応するシミュレーション

simulations/feature_scaling.py:クラスを強く分ける特徴1と、無関係だが単位が100倍大きい特徴2を持つデータで k近傍法を比べます。標準化なしだと距離が大きい単位のノイズ特徴2に支配されて正解率が当てずっぽうに近づき(0.58)、標準化すると本当に効く特徴1が距離に効いて正解率が上がる(0.92)ことを可視化します。あわせて、標準化の平均・分散は訓練データだけで決めテストには適用するだけ(データリーク防止)という実装上の鉄則を示します。

標準化の効果とデータリーク防止

関連ノート