機械学習: Label Encorder初心者向け

こんにちは。Arkです。

今回はLabel Encorderについて書きます。



- Label Encorderって?

objectとして蓄えられているデータを数値として書き換えることのできるライブラリです。

出会ったきっかけは、KaggleのチュートリアルであるTitanicというコンペの解説サイトを見ているときです。データを扱う上で、文字を数字(index)にして使用すると色々とうれしいことがあります。この解説サイトには

sklearnに入っているラベルエンコーダーを使うことにより、オブジェクトをカテゴリーの数値に変換することができます。

 とありました。一発で数字に変換できるってすごい...!となったので、どのような処理が行われているかわからなかったので調べてみました。



この解説サイトの2)の

# string label to categorical values
from sklearn.preprocessing import LabelEncoder

for i in range(train.shape[1]):
    if train.iloc[:,i].dtypes == object:
        lbl = LabelEncoder()
        lbl.fit(list(train.iloc[:,i].values) + list(test.iloc[:,i].values))
        train.iloc[:,i] = lbl.transform(list(train.iloc[:,i].values))
        test.iloc[:,i] = lbl.transform(list(test.iloc[:,i].values))

というコードを使って考えていきます。

ーーーーーーーーーーーーーーー

>>>for i in range(train.shape[1]):
iは存在する列の長さのレンジです。

>>> if train.iloc[:,i].dtypes == object:
もしi列目のデータタイプがobjectだった場合

>>> lbl = LabelEncoder()
>>> lbl.fit(list(train.iloc[:,i].values) + list(test.iloc[:,i].values))
i列目のobjectを訓練データとテストデータからリスト化します。
この時、内部ではある文字セット(例えば"sea","sky", ... )それぞれに0,1, ... という別の数字を割り振っています。
なお、数字の割り振り方は参考サイトによればこれは辞書順のようです。

>>> train.iloc[:,i] = lbl.transform(list(train.iloc[:,i].values))
>>> test.iloc[:,i] = lbl.transform(list(test.iloc[:,i].values))
.ilocを使ってtrain, testデータの中身を指定し、これまで文字だった部分を数字で置き換えています
ちなみに、.ilocの説明はこのサイトが分かりやすく、引用すると

DataFrameやSeriesの要素にアクセスする機能は、以下の4つが用意されています。
①loc, ②at, ③iloc, ④iat
それぞれ、loc, atは行や列の名前で要素へアクセスし、iがついているilocやiatは名前ではなくindex(NumPyの配列のように数字)でアクセスします。loc/ilocは複数要素をスライスすることができ、at/iatは一つの要素を取り出すことができます。

だそうです。
ーーーーーーーーーーーーーーー


いかがでしたか。
私を含む初心者の皆さんはこういった何気ないソースコードを読むのにも一苦労ですよね...

これからも学びをアウトプットして定着させつつ、初心者向けに書いていけたらなと思っています。
ありがとうございました。