はじめに
あるデータの一部に機械学習モデルを適応させたい場面があった。データは質的変数を含んでおり、LabelEncoderを使用して数値データに変換させて使用していた。データの抜き出し方によっては LabelEncoder の結果が変わってしまうという事を紹介したい。
#ちょっと考えれば当たり前のことであるが、自分がミスをしそうになったので、備忘録も兼ねて記事にしておく。
扱うデータセット
例えばRUN, STOP, NORMAL の三つの状態がある、以下のようなデータセットを考える。
import numpy as np
data = np.array(["RUN", "RUN", "RUN", "STOP", "NORMAL", "STOP", "STOP", "STOP"])
これを全データでラベルエンコーダを適応すると、
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
encoded_data = le.fit_transform(data)
print(encoded_data)
[1 1 1 2 0 2 2 2]
となる。
抜き出したデータに適応した場合
いくつかのパターンを考えてみる。
- 三つの状態が全部含まれている場合
le_1 = LabelEncoder()
encoded_data_1 = le_1.fit_transform(data[2:5])
print(data[2:5], encoded_data_1)
['RUN' 'STOP' 'NORMAL'] [1 2 0]
- RUN, STOP しか含まれていない場合
le_2 = LabelEncoder()
encoded_data_2 = le_2.fit_transform(data[1:4])
print(data[1:4], encoded_data_2)
['RUN' 'RUN' 'STOP'] [0 0 1]
- STOP しか含まれていない場合
le_3 = LabelEncoder()
encoded_data_3 = le_3.fit_transform(data[5:8])
print(data[5:8], encoded_data_3)
['STOP' 'STOP' 'STOP'] [0 0 0]
当たり前といえば当たり前だが、含まれているデータの数でラベルは変わらないが、含まれているデータの種類が変わるとラベルは変わってしまう。なので、データの一部しか使わないなどの選択をしたときに気が付かなければならない。
どんな場合でも同じラベルを付ける方法
これは、全データでラベルを付与したときにその情報を保存しておき、必要に応じて呼び出してやればよい。例えば以下のようなコードとなる。
import pickle
#全データでラベルを付与する
le = LabelEncoder()
encoded_data = le.fit_transform(data)
#保存する
with open('label.pickle', 'wb') as web:
pickle.dump(le , web)
#呼び出す
with open('label.pickle', 'rb') as web:
le = pickle.load(web)
#適応する(三つの例すべてに適応)
encoded_data_1 = le.transform(data[2:5])
print(data[2:5], encoded_data_1)
encoded_data_2 = le.transform(data[1:4])
print(data[1:4], encoded_data_2)
encoded_data_3 = le.transform(data[5:8])
print(data[5:8], encoded_data_3)
['RUN' 'STOP' 'NORMAL'] [1 2 0]
['RUN' 'RUN' 'STOP'] [1 1 2]
['STOP' 'STOP' 'STOP'] [2 2 2]
全部のデータでRUN=1, STOP=2, NORMAL=0のラベルが付いた。
おわりに
今回は自分がミスをしてしまう前に気が付くことができた。自身のためにもこういった、tips 的な記事はどんどん残していきたいと思う。