はじめに
機械学習では、モデルやアルゴリズムに注目しがちですが、実際には
データ前処理(Data Preprocessing) がモデル性能に大きく影響します。
どれだけ良いモデルを使っても、入力データに欠損値が多かったり、形式がバラバラだったり、カテゴリ変数がそのまま文字列になっていたりすると、モデルはうまく学習できません。
つまり、機械学習では
良いモデルを選ぶ前に、まずデータをモデルが学習しやすい形に整える
ことが重要です。
本記事では、機械学習の基礎として重要なデータ前処理について、
- 欠損値処理
- 正規化 / 標準化
- カテゴリ変数のエンコード
- 外れ値処理
- 特徴量選択
- データ分割
を、初心者にも分かりやすく整理します。
🎯 対象読者
- 機械学習のデータ前処理を基礎から整理したい方
- 欠損値、正規化、標準化の違いが曖昧な方
- One-Hot Encoding や Label Encoding の使い分けを理解したい方
- AWS の AI / ML 系資格を勉強している方
- モデルに入れる前のデータ加工を実務目線で理解したい方
🧩 まず結論:データ前処理は「モデルが学習できる形に整える作業」
データ前処理とは、
モデル学習の前に、元データを機械学習で使いやすい形に変換する作業 です。
代表的な内容は以下です。
| 前処理 | 目的 |
|---|---|
| 欠損値処理 | 空の値を補完・削除する |
| 正規化 / 標準化 | 数値のスケールをそろえる |
| カテゴリ変数のエンコード | 文字列カテゴリを数値に変換する |
| 外れ値処理 | 極端に大きい・小さい値を扱う |
| 特徴量選択 | 予測に役立つ項目を選ぶ |
| データ分割 | 学習・検証・テストに分ける |
機械学習モデルは、基本的にきれいに整ったデータを前提にしています。
そのため、前処理が不十分だと、モデルの精度が下がったり、学習が不安定になったりします。
🕳 欠損値(Missing Values)とは?
欠損値とは、データの中で値が入っていない部分のことです。
例えば、顧客データに以下のような項目があるとします。
| customer_id | age | income | city |
|---|---|---|---|
| 001 | 35 | 5000000 | Tokyo |
| 002 | 4200000 | Osaka | |
| 003 | 41 | Nagoya |
この場合、2行目の age、3行目の income が欠損値です。
欠損値があると、モデルやアルゴリズムによってはそのまま処理できない場合があります。
🛠 欠損値の主な処理方法
欠損値の代表的な処理方法は以下です。
| 方法 | 説明 | 向いている場面 |
|---|---|---|
| 削除 | 欠損がある行や列を削除する | 欠損が少ない場合 |
| 平均値補完 | 数値を平均値で埋める | 数値データで外れ値が少ない場合 |
| 中央値補完 | 数値を中央値で埋める | 外れ値の影響を抑えたい場合 |
| 最頻値補完 | 最も多い値で埋める | カテゴリデータ |
| 欠損フラグ追加 | 欠損していたかどうかを別列で持つ | 欠損自体に意味がある場合 |
例えば、年収に一部欠損がある場合、平均値や中央値で補完することがあります。
ただし、欠損が多すぎる列を無理に使うと、モデルに悪影響を与える可能性があります。
📏 正規化(Normalization)とは?
正規化とは、数値データの範囲をそろえる処理です。
代表的には、値を 0 〜 1 の範囲に変換します。
Normalization = 値の範囲を 0〜1 にそろえる
例えば、
- 年齢:20〜80
- 年収:300万円〜2000万円
- 購入回数:0〜100
のように、項目ごとに数値のスケールが大きく違う場合があります。
このままだと、値の大きい項目がモデルに強く影響してしまうことがあります。
🧪 正規化の例
例えば、年齢を 0〜1 に変換すると、以下のようなイメージになります。
| 元の年齢 | 正規化後 |
|---|---|
| 20 | 0.0 |
| 50 | 0.5 |
| 80 | 1.0 |
このように値の範囲をそろえることで、
モデルが複数の数値特徴量を扱いやすくなります。
📐 標準化(Standardization)とは?
標準化とは、数値データを
平均 0、標準偏差 1
になるように変換する処理です。
Standardization = 平均を 0、標準偏差を 1 にする
正規化が「範囲をそろえる」処理だとすると、
標準化は「分布の中心とばらつきをそろえる」処理です。
🧭 正規化と標準化の違い
正規化と標準化はどちらも数値のスケールをそろえる処理ですが、目的が少し違います。
| 処理 | 変換後 | 特徴 |
|---|---|---|
| 正規化 | 0〜1 の範囲 | 値の範囲をそろえる |
| 標準化 | 平均 0、標準偏差 1 | 分布をそろえる |
一般的には、距離や勾配の影響を受けやすいアルゴリズムでは、
スケーリングが重要になります。
例えば、
- k-nearest neighbors
- logistic regression
- neural network
- support vector machine
などでは、数値スケールの違いが性能に影響しやすいです。
🏷 カテゴリ変数(Categorical Variables)とは?
カテゴリ変数とは、数値ではなく分類やラベルを表すデータです。
例えば、以下のような項目です。
- 都市:Tokyo / Osaka / Nagoya
- 性別:male / female
- 会員ランク:bronze / silver / gold
- 商品カテゴリ:book / food / electronics
多くの機械学習モデルは、文字列をそのまま扱うことができません。
そのため、カテゴリ変数は数値に変換する必要があります。
この処理を エンコード と呼びます。
🔢 One-Hot Encoding とは?
One-Hot Encoding は、カテゴリごとに列を作り、
該当するカテゴリを 1、それ以外を 0 にする方法です。
例えば、city という列に Tokyo、Osaka、Nagoya がある場合、以下のように変換します。
| city | city_Tokyo | city_Osaka | city_Nagoya |
|---|---|---|---|
| Tokyo | 1 | 0 | 0 |
| Osaka | 0 | 1 | 0 |
| Nagoya | 0 | 0 | 1 |
向いている場面
One-Hot Encoding は、カテゴリに順序関係がない場合に向いています。
例えば、都市名には基本的に
Tokyo > Osaka > Nagoya
のような大小関係はありません。
そのため、都市名のようなカテゴリには One-Hot Encoding が使いやすいです。
注意点
カテゴリ数が多い場合、列が増えすぎることがあります。
例えば、商品 ID やユーザー ID のように種類が非常に多いデータに対して One-Hot Encoding を使うと、
特徴量の数が膨大になる可能性があります。
🔤 Label Encoding とは?
Label Encoding は、カテゴリを整数に変換する方法です。
例えば、city を以下のように変換します。
| city | encoded |
|---|---|
| Tokyo | 0 |
| Osaka | 1 |
| Nagoya | 2 |
一見シンプルですが、注意が必要です。
モデルによっては、
Nagoya > Osaka > Tokyo
のような順序があると誤解してしまう可能性があります。
そのため、順序関係のないカテゴリに対して Label Encoding を使う場合は注意が必要です。
🪜 Ordinal Encoding とは?
Ordinal Encoding は、順序のあるカテゴリを数値に変換する方法です。
例えば、会員ランクや評価レベルのように、明確な順序がある場合に使えます。
| level | encoded |
|---|---|
| low | 1 |
| medium | 2 |
| high | 3 |
このように、
low < medium < high
という順序に意味がある場合は、Ordinal Encoding が自然です。
🎯 Target Encoding とは?
Target Encoding は、目的変数の統計値を使ってカテゴリを数値化する方法です。
例えば、カテゴリごとの平均購入率や平均売上などを使って変換します。
この方法は、カテゴリ数が多い場合に有効なことがあります。
ただし、注意点もあります。
注意点:Data Leakage
Target Encoding は、目的変数を使って特徴量を作るため、
やり方を間違えると data leakage が起きやすいです。
Data leakage とは、本来モデルが学習時に見てはいけない情報が入り込むことです。
そのため、Target Encoding を行う場合は、
必ず訓練データの中だけで計算し、検証データやテストデータの情報を混ぜないようにする必要があります。
🧬 Embedding とは?
Embedding は、カテゴリやテキストを低次元のベクトルとして表現する方法です。
深層学習でよく使われます。
例えば、以下のようなデータに向いています。
- ユーザー ID
- 商品 ID
- テキスト token
- 高カーディナリティのカテゴリ変数
One-Hot Encoding では列が多くなりすぎる場合でも、
Embedding を使うことで、よりコンパクトな表現に変換できます。
⚠️ 外れ値処理とは?
外れ値とは、他のデータと比べて極端に大きい、または小さい値のことです。
例えば、年収データでほとんどの人が 300万円〜1000万円の範囲にいるのに、
一部だけ 10億円の値が入っているようなケースです。
外れ値は、モデルや統計量に大きな影響を与えることがあります。
代表的な対応方法は以下です。
| 方法 | 説明 |
|---|---|
| 削除 | 明らかに異常な値を取り除く |
| 上限・下限で丸める | 極端な値を一定範囲内に収める |
| 対数変換 | 大きな値の影響を小さくする |
| 別カテゴリとして扱う | 外れ値自体に意味がある場合 |
ただし、外れ値は必ずしも「悪いデータ」とは限りません。
不正検知や異常検知では、外れ値こそ重要な情報になる場合があります。
✂️ 特徴量選択とは?
特徴量選択とは、モデルに入れる項目の中から、
予測に役立つものを選ぶ作業です。
特徴量が多すぎると、以下のような問題が起きることがあります。
- 学習時間が長くなる
- ノイズが増える
- 過学習しやすくなる
- モデルの解釈が難しくなる
そのため、不要な特徴量や重複した特徴量を減らすことも重要です。
☁️ AWS 試験での見られ方
AWS の AI / ML 系試験では、データ前処理は非常に重要です。
特に、以下のような観点で問われることがあります。
欠損値をどう扱うか
欠損が少ない場合は削除、数値データでは平均値や中央値補完、
カテゴリデータでは最頻値補完などが選択肢になります。
カテゴリ変数をどう数値化するか
文字列カテゴリをそのままモデルに入れるのではなく、
One-Hot Encoding、Label Encoding、Ordinal Encoding などを使って数値化します。
Data Leakage を避ける
前処理を行うときは、検証データやテストデータの情報を学習に混ぜないことが重要です。
特に、Target Encoding やスケーリングを行う場合は、
訓練データだけで統計量を計算し、そのルールを検証データやテストデータに適用する必要があります。
👨💻 実務目線で見ると
実務では、モデル改善の前にデータ前処理を見直すだけで、
精度や安定性が大きく改善することがあります。
例えば、
- 欠損値をどう扱うか
- 外れ値をそのまま使うか
- カテゴリ変数のエンコード方法は適切か
- 数値スケールはそろっているか
- 不要な特徴量が多すぎないか
といった点です。
また、前処理は一度だけ行えば終わりではありません。
本番運用では、新しいデータにも同じ前処理を適用する必要があります。
そのため、前処理の手順を再現可能な形で管理することも重要です。
🧠 ここは特に覚えたいポイント
覚え方 1
データ前処理 = モデルが学習しやすい形にデータを整える作業
覚え方 2
欠損値 = 削除・平均値・中央値・最頻値・欠損フラグで対応
覚え方 3
正規化 = 0〜1 にそろえる
標準化 = 平均 0、標準偏差 1 にそろえる
覚え方 4
One-Hot Encoding = 順序なしカテゴリに使いやすい
Ordinal Encoding = 順序ありカテゴリに使いやすい
覚え方 5
Target Encoding は data leakage に注意
✅ まとめ
今回は、機械学習のデータ前処理について整理しました。
重要なポイントは以下です。
- データ前処理は、モデルが学習しやすい形にデータを整える作業
- 欠損値は、削除、平均値補完、中央値補完、最頻値補完などで対応する
- 正規化は値を 0〜1 にそろえる処理
- 標準化は平均 0、標準偏差 1 にそろえる処理
- カテゴリ変数は、モデルが扱えるように数値化する必要がある
- One-Hot Encoding は順序なしカテゴリに向いている
- Ordinal Encoding は順序ありカテゴリに向いている
- Target Encoding は便利だが data leakage に注意が必要
- 外れ値や不要な特徴量もモデル性能に影響する
機械学習では、モデル選択だけでなく、
入力データをどれだけ適切に整えられるか が非常に重要です。
📌 次回予告
次回は、AWS 寄りの内容として
- SageMaker Training Job
- Endpoint
- Batch Transform
について整理します。
モデルを学習し、そのモデルを使って予測する流れを、
SageMaker の基本構成として分かりやすく見ていきます。