14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python/LabelEncoder の基本的な注意点

Last updated at Posted at 2021-08-23

はじめに

あるデータの一部に機械学習モデルを適応させたい場面があった。データは質的変数を含んでおり、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 的な記事はどんどん残していきたいと思う。

14
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?