月影

日々の雑感

機械学習・前処理の黄金律|PipelineとGridSearchCVでデータリークを防ぐ設計図

 

機械学習・前処理の黄金律

〜データクレンジングからGridSearchCVまで〜

機械学習の前処理:まずはデータをよく見る

機械学習では、いきなりモデルを作るのではなく、まずデータの状態を確認することが重要です。 データの形や欠損値、データ型などを把握することで、適切な前処理を行うことができます。

データのサイズを確認する(df.shape)

最初に、データフレームの行数と列数を確認します。

import pandas as pd

df = pd.read_csv("data.csv")

# データの行数と列数
df.shape

例えば、結果が (1000, 10) と表示された場合、 「1000行、10列のデータ」があることを意味します。

データの中身を確認する

# 最初の5行を見る
df.head()

# データ型の確認
df.info()

# 基本統計量
df.describe()

ここで、数値データと文字データ(カテゴリデータ)が混ざっているかを確認します。

カテゴリデータの処理

機械学習モデルは基本的に数値しか扱えません。 そのため、「病気の種類」「色」「都市名」などの文字データは、 数値に変換する必要があります。

この処理をエンコーディング(encoding)と呼びます。

ワンホットエンコーディング

カテゴリごとに新しい列を作り、該当する場合に1を入れる方法です。

# ワンホットエンコーディング
df_encoded = pd.get_dummies(df, columns=["color"])

例:

color
red
blue

color_red color_blue
1 0
0 1

ラベルエンコーディング

カテゴリを整数に置き換える方法です。

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()

df["disease"] = le.fit_transform(df["disease"])

例:

disease
cold
flu
covid

disease
0
1
2

カウントエンコーディング

カテゴリがデータ中に何回出現するかを数値として置き換える方法です。

# 出現回数をカウント
counts = df["city"].value_counts()

# 置き換え
df["city_count"] = df["city"].map(counts)

カテゴリ数が多い場合(都市名、商品IDなど)に有効な方法です。

まとめ

  • まず df.shape でデータのサイズを確認する
  • df.head()df.info() でデータ内容を確認する
  • 文字データ(カテゴリ変数)は数値に変換する
  • 主な方法はワンホット、ラベル、カウントエンコーディング
  • 重要な変数が欠損しているデータは行ごと削除する

このような前処理を行うことで、機械学習モデルがデータを正しく理解できるようになります。その後は、以下のような流れで前処理を行うといいでしょう。

1. 前処理には「優先順位」がある

何でも手当たり次第に加工すれば良いわけではありません。実務では以下の3ステップを順に踏むのが定石です。

Step 1データ掃除(クレンジング)
欠損値・型変換
Step 2スケーリング
標準化(L2)・正規化
Step 3高度な最適化
L1除外・白化

まずはモデルが「動く」状態にし、次に「公平に比較」できる状態に、最後に「洗練」させる。この流れが最も効率的です。

2. 禁忌!「データ漏洩(リーク)」を防げ

絶対にやってはいけないこと: 全データ一括での前処理(平均値補完やスケーリング)。

全データで平均値を計算してしまうと、学習データの中にテストデータの情報が混ざり込む「カンニング」状態になります。 「学習データだけで物差しを作り、それをテストデータに適用する」。これこそが数学的に正しい作法です。

3. 解決策:scikit-learn Pipeline

この「学習データだけで物差しを作る」手順を自動化するのが Pipeline です。 クレンジング(欠損値処理)からモデル学習までを一つの箱に閉じ込めます。これで、客観的に前処理を行うことができます。

# 黄金のテンプレート
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler

pipeline = Pipeline([
    ('imputer', SimpleImputer(strategy='most_frequent')), # 2値欠損も最頻値で!
    ('scaler', StandardScaler()),                        # 単位を揃える
    ('model', LogisticRegression())                      # 学習
])

4. GridSearchCVによる「戦略」の自動選定

「L1正則化をどれくらい強くするか?」「欠損値は平均か中央値か?」 これらに迷ったら、GridSearchCVに丸投げしましょう。内部でデータを分割しながら、最高の組み合わせを「カンニングなし」で見つけてくれます。

GridSearchCVは、内部で交差検証(CV)を行い、各分割ごとに「その時の学習用データのみ」で前処理をやり直します。 これにより、真に汎用性の高いモデルが完成します。

まとめ:成功する前処理の3か条

  • Pipelineを使う: 前処理を独立させず、モデルの一部とみなす。
  • 2値欠損は慎重に: 数値として埋めず、最頻値やフラグを活用する。
  • マハラノビス/L1を使い分ける: 相関が強いなら白化、変数を減らしたいならL1。

© 2026 月影