カテゴリカル変数をLabel/OneHotEncoderやget_dummiesで変換する

(2019-05-06)

data = ["tokyo", "berlin", "tokyo", "paris", "amsterdam", "paris", "amsterdam", "berlin"]
partial_data = data[:3]

scikit-learnのpreprocessing.LabelEncoderでカテゴリカル変数を数値のラベルに変換できる。

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(data)
print(le.classes_) # ['amsterdam' 'berlin' 'paris' 'tokyo']
encoded = le.transform(partial_data)
print(encoded) # [3 1 3]
print(le.inverse_transform(encoded)) # ['tokyo' 'berlin' 'tokyo']

preprocessing.OneHotEncoder でone hot vectorに変換できる。

oh = preprocessing.OneHotEncoder()
oh.fit([[d] for d in data])
print(oh.categories_[0]) # ['amsterdam' 'berlin' 'paris' 'tokyo']
encoded = oh.transform([[d] for d in partial_data]).toarray()
print(encoded) # [[0. 0. 0. 1.] [0. 1. 0. 0.] [0. 0. 0. 1.]]
print(oh.inverse_transform(encoded)) # [['tokyo'] ['berlin'] ['tokyo']]

pandasではget_dummiesで one hot vectorに変換できる。

import pandas as pd
print(pd.get_dummies(data))
'''
   amsterdam  berlin  paris  tokyo
0          0       0      0      1
1          0       1      0      0
2          0       0      0      1
3          0       0      1      0
4          1       0      0      0
5          0       0      1      0
6          1       0      0      0
7          0       1      0      0
'''

カテゴリ変数を扱える決定木ではLabelEncoderを使うとデータ量が少なくなって良いが、 通常はラベルの数値の大小の影響を受けないようにone hot vectorにする。 カテゴリが多いとその分次元も増えるので、次元の呪いを抑えるため必要なら主成分分析(PCA)で次元削減する。

参考

scikit learn - When to use One Hot Encoding vs LabelEncoder vs DictVectorizor? - Data Science Stack Exchange