kerasのto_categoricalを使ってみる

機械学習の特徴量や正解ラベルをone-hotベクトルにするとき、
自分で実装するか、sklearnのOneHotEncoderを使うことが多いです。
稀に、pandasのget_dummiesを使うこともあります。

ところが、kerasのサンプルコードを読んでいると、to_categoricalというのもよく使われているので確認してみました。
軽く動かしてみると思った通りの挙動をしたので特に必要というわけでもないのですが、
使うライブラリをkerasに統一したいことがあれば利用するかもしれません。

とりあえず使ってみましょう。


import numpy as np
from keras.utils import to_categorical
# テスト用のデータ生成
data = np.random.randint(low=0, high=5, size=10)
print(data)
# One-Hotベクトルに変換
print(to_categorical(data))

# 以下出力
[3 2 1 4 4 1 0 1 0 2]

[[0. 0. 0. 1. 0.]
 [0. 0. 1. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1.]
 [0. 1. 0. 0. 0.]
 [1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [1. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0.]]

to_categorical の2番目の引数(num_classes)として、数値を渡すと、
データの最大値を指定できます。
ただし、データの最大値+1より小さい値を渡すとエラーです。
極端な不均衡データを扱うときなどは念のため指定しておいたほうが安全かも。

試してみたサンプルです。


print(to_categorical(data, 8))

# 出力
[[0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0.]
 [1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0.]
 [1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0.]]