機械学習・前処理の黄金律
〜データクレンジングから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ステップを順に踏むのが定石です。
欠損値・型変換
標準化(L2)・正規化
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。