機械学習 – カテゴリ変数を整数や one-hot 表現に変数する方法

目次

概要

カテゴリ変数を数値に変換する方法として、順序エンコーディング (Ordinal Encoding) とワンホットエンコーディング (One-hot Encoding) を解説します。

カテゴリ変数と量的変数

  • カテゴリ変数 (Categorical Variable) は、名前や性別のように、有限個のラベルをとる変数のことをいいます。
  • 量的変数 (Quantitative Variable) は、年齢、金額のように、数字の大きさに意味を持つ数値をとる変数のことをいいます。

具体的な例を見てみましょう。以下は支払ったチップの金額について、会計金額、性別、曜日などの情報を一緒に記録したテーブルデータです。

  • カテゴリ変数: sexsmokerdaytime
  • 量的変数: total_billtipsize
In [1]:
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)

カテゴリ変数に連続した整数を割り当てる符号化方法です。

ordinal 表現

データの変換

sklearn.preprocessing.OrdinalEncoder はカテゴリ変数の特徴量を整数に変換するエンコーダーです。

  • fit() にカテゴリ変数のデータを表す形状が (サンプル数, 特徴量の次元数) の2次元配列を渡すことでラベルと整数の対応づけが行われます。
  • transform() にカテゴリ変数のデータを渡すことで、符号化したデータが得られます。
  • inverse_transform() に符号化後のデータを渡すことで符号化前のデータが得られます。
In [2]:
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 と同じです。

In [3]:
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 表現といいます。

one-hot 表現

データの変換

sklearn.preprocessing.OneHotEncoder はカテゴリ変数の特徴量を one-hot 表現に変換するエンコーダーです。

In [4]:
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 表現に変換するエンコーダーです。カテゴリ変数の正解ラベルを符号化するのに使います。

In [5]:
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']

コメント

コメントする

目次