One-Hotエンコーディングとは
One-Hotエンコーディングは、カテゴリカルデータを機械学習アルゴリズムが扱いやすい数値形式に変換する手法の一つです。
具体的には、カテゴリの総数と同じ次元数のベクトルを用意し、該当するカテゴリに対応する要素のみを1、それ以外の要素をすべて0にします。
手順
- カテゴリのリスト化とインデックス割り当て: まず、存在するすべてのカテゴリをリストアップし、それぞれに一意のインデックス(通常は0から始まる整数)を割り当てます。
- 「犬」: インデックス 0
- 「猫」: インデックス 1
- 「鳥」: インデックス 2
- ベクトルの作成: カテゴリの総数(ここでは3)と同じ次元数のベクトルを作成します。初期値はすべて0です。 \( [0, 0, 0] \)
- 該当要素を1にする: エンコードしたいカテゴリ(例えば「猫」)のインデックス(インデックス 1)に対応するベクトルの要素を1にします。
$[0, 1, 0]$
この操作で作成されるベクトルの次元数は、カテゴリの総数と同じになります。この問題ではカテゴリが「犬」「猫」「鳥」の3つなので、次元数は 3 です。
One-Hotエンコーディングの利点と注意点
- 利点: カテゴリ間に順序関係がない場合に、順序があるかのような誤解をモデルに与えずに済みます。
- 注意点: カテゴリ数が非常に多い場合、ベクトルの次元数が非常に大きくなり、計算コストが増大したり、「次元の呪い」と呼ばれる問題を引き起こしたりする可能性があります。
Python (Scikit-learn) による実装例
from sklearn.preprocessing import OneHotEncoder
import numpy as np# カテゴリデータ
categories = np.array([['犬'], ['猫'], ['鳥'], ['猫']])encoder = OneHotEncoder(sparse_output=False)one_hot_encoded = encoder.fit_transform(categories)print("元のカテゴリデータ:")
print(categories)
print("\nOne-Hotエンコーディング結果:")
print(one_hot_encoded)
print("\n次元数:")
print(one_hot_encoded.shape[1]) # ベクトルの次元数(列数)
print("\n学習されたカテゴリ:")
print(encoder.categories_)
実行結果:
元のカテゴリデータ:
[['犬']
['猫']
['鳥']
['猫']]One-Hotエンコーディング結果:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]
[0. 1. 0.]]次元数:
3学習されたカテゴリ:
[array(['犬', '猫', '鳥'], dtype='
Scikit-learnでは、カテゴリはアルファベット順(または出現順、設定による)にインデックスが割り振られることが多いです。この例では ['犬', '猫', '鳥'] の順になり、「猫」はインデックス1に対応するため [0., 1., 0.] となります。