Posted at

機械学習でのカテゴリデータの扱い方

More than 1 year has passed since last update.

例えば次のような DataFrame があるとする。

import pandas as pd

df = pd.DataFrame(data={'age': [34, 18, 52, 8, 21], 'blood_type': ['A', 'B', 'A', 'AB', 'O']})

01.png

機械学習の特徴量として 'A' や 'B' などのカテゴリデータを表す文字列をそのまま与えることはできない。では、これらを整数値に置き換えればいいだろうか。カテゴリデータを整数値に置き換えるには pandas.factorize を使う。

df['blood_type'] = pd.factorize(df['blood_type'])[0]

02.png

実はこれはよくない。この例では 'A' は 0 に、'B' は 1 に、そして 'O' は 3 に置き換えられている。ここで、例えば「A 型から O 型への距離は A 型から B 型への距離の 3 倍である」というような関係はない。しかし、機械学習アルゴリズムはそのような関係があると誤解してしまう恐れがある。

ではどうしたらよいか。ここで使えるのが ダミー変数 だ。ダミー変数に変換するとはカテゴリデータを one-hot 表現に変換することだ。そして one-hot 表現とはひとつの要素が 1 でその他が 0 のベクトルで表すことだ。ダミー変数に変換するには pandas.get_dummies を使う。

df2 = pd.get_dummies(df['blood_type'], prefix='blood_type')

03.png

ちなみに情報を失わずに 1 列だけ削減することができる。

df2 = pd.get_dummies(df['blood_type'], prefix='blood_type', drop_first=True)

04.png

最終的に blood_type 列をダミー変数に置き換えた DataFrame は次の通り。

df3 = df.drop('blood_type', axis=1)

df4 = pd.merge(df3, df2, right_index=True, left_index=True)
df4

05.png