概要
カテゴリ変数を数値に変換する方法として、順序エンコーディング (Ordinal Encoding) とワンホットエンコーディング (One-hot Encoding) を解説します。
カテゴリ変数と量的変数
- カテゴリ変数 (Categorical Variable) は、名前や性別のように、有限個のラベルをとる変数のことをいいます。
- 量的変数 (Quantitative Variable) は、年齢、金額のように、数字の大きさに意味を持つ数値をとる変数のことをいいます。
具体的な例を見てみましょう。以下は支払ったチップの金額について、会計金額、性別、曜日などの情報を一緒に記録したテーブルデータです。
- カテゴリ変数:
sex
、smoker
、day
、time
- 量的変数:
total_bill
、tip
、size
import seaborn as sns
data = sns.load_dataset("tips")
data.head()
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
カテゴリ変数を機械学習のアルゴリズムで扱えるようにするには、なんらかの方法で数値に変換する 符号化 (encode) を行う必要があります。 以下では、その符号化方法として、ordinal encoding と one-hot encoding という2つのやり方を解説します。
順序エンコーディング (Ordinal Encoding)
カテゴリ変数に連続した整数を割り当てる符号化方法です。
データの変換
sklearn.preprocessing.OrdinalEncoder はカテゴリ変数の特徴量を整数に変換するエンコーダーです。
- fit() にカテゴリ変数のデータを表す形状が (サンプル数, 特徴量の次元数) の2次元配列を渡すことでラベルと整数の対応づけが行われます。
- transform() にカテゴリ変数のデータを渡すことで、符号化したデータが得られます。
- inverse_transform() に符号化後のデータを渡すことで符号化前のデータが得られます。
from sklearn.preprocessing import OrdinalEncoder
X = [["Male", "A"],
["Female", "B"],
["Female", "B"]]
transformer = OrdinalEncoder().fit(X)
# カテゴリ変数 → 整数値
dst = transformer.transform([["Female", "A"], ["Male", "B"]])
print(dst)
# 整数値 → カテゴリ変数
src = transformer.inverse_transform([[1, 0],
[0, 1]])
print(src)
[[0. 0.] [1. 1.]] [['Male' 'A'] ['Female' 'B']]
ラベルの変換
sklearn.preprocessing.LabelEncoder はカテゴリ変数のラベルを整数に変数するエンコーダーです。カテゴリ変数の正解ラベルを符号化するのに使います。扱うのが1次元配列である点以外は OrdinalEncoder と同じです。
from sklearn.preprocessing import LabelEncoder
x = ["C", "A", "B", "A", "C", "B"]
transformer = LabelEncoder().fit(x)
# ラベル → 整数値
dst = transformer.transform(["A", "B", "C"])
print(dst)
# 整数値 → ラベル
src = transformer.inverse_transform([0, 1, 2])
print(src)
[0 1 2] ['A' 'B' 'C']
ワンホットエンコーディング (One-hot Encoding)
one-hot 表現
$m$ 個の有限個の値をとるカテゴリ変数があったとき、長さが $m$ で該当する要素が1、それ以外の要素が0のベクトルで表す表現方法を one-hot 表現といいます。
データの変換
sklearn.preprocessing.OneHotEncoder はカテゴリ変数の特徴量を one-hot 表現に変換するエンコーダーです。
from sklearn.preprocessing import OneHotEncoder
X = [["Male", "A"],
["Female", "B"],
["Female", "B"]]
transformer = OneHotEncoder().fit(X)
# カテゴリ変数 → one-hot 表現
dst = transformer.transform([["Female", "A"], ["Male", "B"]])
print(dst.toarray())
# [[1. 0. 1. 0.]
# [0. 1. 0. 1.]]
# one-hot 表現 → カテゴリ変数
src = transformer.inverse_transform([[1, 0, 1, 0], [0, 1, 0, 1]])
print(src)
# [['Female' 'A']
# ['Male' 'B']]
[[1. 0. 1. 0.] [0. 1. 0. 1.]] [['Female' 'A'] ['Male' 'B']]
ラベルの変換
sklearn.preprocessing.LabelBinarizer はカテゴリ変数のラベルを one-hot 表現に変換するエンコーダーです。カテゴリ変数の正解ラベルを符号化するのに使います。
import numpy as np
from sklearn.preprocessing import LabelBinarizer
y = ["C", "A", "B", "A", "C", "B"]
transformer = LabelBinarizer().fit(y)
# ラベル → one-hot 表現
dst = transformer.transform(["A", "B"])
print(dst)
# [[1 0 0]
# [0 1 0]]
# one-hot 表現 → ラベル
src = transformer.inverse_transform(np.array([[1, 0, 0], [0, 1, 0]]))
print(src)
# ['A' 'B']
[[1 0 0] [0 1 0]] ['A' 'B']
コメント