【機械学習の知識】カテゴリ変数の主要エンコーディング手法の完全比較と使い分け
機械学習モデルや統計モデルは、文字データ(「赤・青・緑」や「東京・大阪」など)をそのまま計算することができません。そのため、カテゴリデータを数値に翻訳する「エンコーディング」が必須となります。今回は代表的な6つの手法の違いと、実務での選び方を徹底比較します。
1. 【 概要 】
カテゴリ変数のエンコーディングとは、質的なデータ(文字や属性)をコンピュータが計算できる量的なデータ(数値)に変換するプロセスです。
手法によって「作られる列の数」や「数値が持つ意味」が大きく異なります。特に「都道府県名」や「商品ID」のように種類(カテゴリ)が大量にあるデータをどう扱うかによって、モデルの精度が大きく変わるため、適切な手法の選択が重要になります。
2. 【 基本手順(6つの代表的な手法) 】
(2) ダミーコーディング:K個のカテゴリに対し「K-1個」の列を作り、基準を1つ省略する。
(3) エフェクトコーディング:基準を-1、他を0や1で表現し、全体平均からの偏差を表す。
(4) 順序(Ordinal / Label)エンコーディング:カテゴリに「0, 1, 2...」と単純な整数を割り当てる。
(5) ターゲットエンコーディング:カテゴリを「そのグループの目的変数の平均値」に置き換える。
(6) 頻度(Frequency)エンコーディング:カテゴリを「出現回数(または割合)」に置き換える。
3. 整理:各エンコーディング手法の具体的な違い
6つの手法がそれぞれどのような構造を持ち、何が違うのかをステップごとに詳しく見ていきましょう。
【 各手法の仕組みと特徴 】
カテゴリが3つなら3つの列を作り、[1,0,0], [0,1,0], [0,0,1] で表現します。情報の欠落がありません。
・手法(2):ダミーコーディング
3つのうち1つを基準として削り、残り2つの列だけを作ります(多重共線性の回避)。
・手法(3):エフェクトコーディング
ダミーに似ていますが、基準を `-1` で表現します。全体平均に対する各グループの偏りを見たい統計モデル向けです。
・手法(4):順序(Ordinal / Label)エンコーディング
「低=1、中=2、高=3」のように整数に変換します。メモリを圧迫しませんが、アルゴリズムが「3は1の3倍の価値がある」と誤解するリスクがあります。
・手法(5):ターゲットエンコーディング(平均エンコーディング)
例えば「東京に住んでいる人の正解率(目的変数の平均)」のように、実績値で置き換えます。カテゴリ数が数千ある場合に非常に強力ですが、情報漏洩(リーク)に注意が必要です。
・手法(6):頻度(Frequency)エンコーディング
データ全体の中で「そのカテゴリが何回出現したか」の頻度数に置き換えます。珍しいカテゴリか、よくあるカテゴリかを数値化できます。
4. 関連して押さえたい「どれを使えばいいの?(実務での選び方)」
「手法が多すぎてどれを使えばいいか迷う」という場合の明確な選び方の基準を整理します。
・カテゴリ数が少ない(10未満)&決定木系モデルなら「One-Hot」
色や性別など、種類が少ないデータでLightGBMやランダムフォレストを使うならOne-Hotが最も安全です。
・カテゴリ数が膨大(数千〜数万)なら「ターゲットエンコーディング」や「頻度エンコーディング」
「郵便番号」や「商品ID」などをOne-Hotにすると列が爆発して破綻するため、ターゲットエンコーディングや頻度エンコーディングで1列に圧縮します。
・順序に意味があるデータなら「順序エンコーディング」
「満足度(低・中・高)」や「学歴(高卒・大卒・院卒)」など、大小関係に意味がある場合は整数に置き換える順序エンコーディングが最適です。
・本格的な統計・回帰分析なら「ダミーコーディング」
Pythonの `statsmodels` やRでp値を厳密に評価したい場合はダミーコーディングを選択します。
5. 補足:Pythonでの実装コード例
Pythonで代表的なエンコーディングを行う際の書き方イメージです。
可読性の高いライトグレーの背景でまとめています。
df_onehot = pd.get_dummies(df, columns=['fruit'])
# 2. 順序エンコーディング(Scikit-learn)
from sklearn.preprocessing import OrdinalEncoder
encoder = OrdinalEncoder()
df['size_encoded'] = encoder.fit_transform(df[['size']])
# 3. ターゲットエンコーディング(category_encodersライブラリ)
import category_encoders as ce
te = ce.TargetEncoder(cols=['city'])
df['city_te'] = te.fit_transform(df['city'], df['target'])
6. まとめ
カテゴリ変数のエンコーディングには、定番の「One-Hot」「ダミー」「エフェクト」に加え、カテゴリ数が多いときに無双する「ターゲット・頻度エンコーディング」、順序を保持する「順序エンコーディング」など多彩なアプローチがあります。
「データのカテゴリ数」と「使うモデルの種類」に合わせて最適な手法をチョイスし、機械学習モデルの予測性能を最大限に引き出せるようになりましょう!