one hot encoding (python scikit-learn)
会員情報の職業や性別のようなカテゴリ値を用いて、機械学習をする際には、何らかの形で数値にする必要がある。 通常は、「会社員」や「学生」のようなカテゴリ情報は、取り得る値の種類と等しいサイズの配列のその値のみを1にした物を使う。 倒えば、会社員=[1,0]、学生=[0,1]のような形式になる。この表現形式をone-hot encodingまたは1 of K encodingと呼ぶ。 pythonのscikit-learnで以下のように、この変換ができる。
次のような、accounts.csvがあると仮定する。
name,occupation
sato,adventurer
ito,engineer
inoue,student
tanaka,engineer
oda,adventurer
基本的にはDictVectorizerに入れるだけだが、その前に[(occupation=adventurer),(occupation=engineer)]のようなディクショナリの配列にする必要がある。
# -*- coding: utf-8 -*-
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
accounts=pd.read_csv('./accounts.csv', encoding='utf-8')
occupation_vectorizer = DictVectorizer(sparse=False)
i = [ dict(occupation=occupation) for occupation in accounts[u"occupation"] ]
X = occupation_vectorizer.fit_transform(i)
names = occupation_vectorizer.get_feature_names()
# original table
print accounts
# label names
print names
# transformed one-hot encoding
print X
結果
name occupation
0 sato adventurer
1 ito engineer
2 inoue student
3 tanaka engineer
4 oda adventurer
[u'occupation=adventurer', u'occupation=engineer', u'occupation=student']
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]
[ 0. 1. 0.]
[ 1. 0. 0.]]