ラベルをOneHotでエンコードする
Deep Learning、と言ってもTensorFlowしか使ったことないけど、 ラベルがnx1(nはレコード数)の行列の場合は、OneHotにエンコードする必要がある(下図)。 scikit-learnのOneHotEncoderで、一発でエンコードできるのだが、 nx1の行列をnxm(mはラベルの値の種類)に変換する処理をnumpyで行う必要があるので実装した。
# nx1 matrix label = [4 3 0 0 1 1 1 4 3 0] # nxm matrix onehot_label = [[ 0. 0. 0. 0. 1.] [ 0. 0. 0. 1. 0.] [ 1. 0. 0. 0. 0.] [ 1. 0. 0. 0. 0.] [ 0. 1. 0. 0. 0.] [ 0. 1. 0. 0. 0.] [ 0. 1. 0. 0. 0.] [ 0. 0. 0. 0. 1.] [ 0. 0. 0. 1. 0.] [ 1. 0. 0. 0. 0.]]
実装
numpyでreshapeとtransposeを行い、 scikit-learnでonehotにencodeする。
import numpy as np from sklearn.preprocessing import OneHotEncoder # generate label. X = np.array([random.choice(range(5)) for i in range(10)]) print(X) # reshape X = np.array(X).reshape(1, -1) print(X) # transpose X = X.transpose() print(X) # encode label encoder = OneHotEncoder(n_values=max(X)+1) X = encoder.fit_transform(X).toarray() print(X)
各々の出力結果は以下の通り。
[2 0 0 4 3 3 4 4 2 3] [[2 0 0 4 3 3 4 4 2 3]] [[2] [0] [0] [4] [3] [3] [4] [4] [2] [3]] [[ 0. 0. 1. 0. 0.] [ 1. 0. 0. 0. 0.] [ 1. 0. 0. 0. 0.] [ 0. 0. 0. 0. 1.] [ 0. 0. 0. 1. 0.] [ 0. 0. 0. 1. 0.] [ 0. 0. 0. 0. 1.] [ 0. 0. 0. 0. 1.] [ 0. 0. 1. 0. 0.] [ 0. 0. 0. 1. 0.]]