BaseNEncodersのbase=って何を表しているのだろうと考えたらとてもシンプルだった件について


はじめに

Category Encodingに関して代表的なものを学習していたのですが、どうもライブラリの使い方がわからず調べるのに時間を費やしたのでまとめたいと思います。

ここからのコードはすべて以下の記事の内容を利用していますので、そちらを簡単に読んでから読み進めていただくと分かりやすいかもしれません。

Category Encodingについてとてもまとまっていますのでお勧めです。

BaseNEncodersについて

こちらの記事のコードを引用しています。
BaseNはbaseオプションに指定する値によって、One-Hot / Binary / Ordinal Encodingを使い分けることができます。とあるがどのように指定すればどのエンコーディングが使えるのかよくわからず、今回の記事を書くことになりました。

ちなみに公式ドキュメントにはこのようにあります。

base: int
when the downstream model copes well with nonlinearities (like decision tree), use higher base.

# 翻訳
ダウンストリームモデルが非線形性(デシジョンツリーなど)にうまく対応する場合は、より高いベースを使用します。

うーんわからない。
すこし調べるのに時間がかかったので、わからない方のために指定の仕方をまとめます。

問題

base=1だとOne-Hotエンコーディング

# base=1
bne = ce.BaseNEncoder(cols=cate_col, base=1, drop_invariant=True)
bne_df = bne.fit_transform(df[cate_col])
pd.concat([df[cate_col], bne_df], axis=1)

base=5だとラベルエンコーディング

# base=5
bne = ce.BaseNEncoder(cols=cate_col, base=5, drop_invariant=True)
bne_df = bne.fit_transform(df[cate_col])
pd.concat([df[cate_col], bne_df], axis=1)

なぜ1でOne-Hotなのでしょうか。なぜ5でlabel-encodingなのでしょうか。
これにはしっかりと理由があります。
この数値はエンコーディングの対象にしているカテゴリ数によって変化します。

base=の指定の仕方

このbaseという引数が表しているものはズバリ〇進数のことでした。
(たしかに言われてみればと思いました)

というわけで、base=1を指定すると1進数でカテゴリ変数を表すことになるのでOne-Hotエンコーディングとなります。

今回はカテゴリが4つあります。

ですので、base=5 (5進数)を選択するとラベルエンコーディングになります。(1-4で表現するため)

base=2を選択したところ、Binaryになることが確かめられました。

# base=2
bne = ce.BaseNEncoder(cols=cate_col, base=2, drop_invariant=True)
bne_df = bne.fit_transform(df[cate_col])
pd.concat([df[cate_col], bne_df], axis=1)

おわりに

Category Encoderはとても便利なライブラリだと感じました。
これから導入していきたいと思います。カテゴリ変数はどの方法を用いるかとても大切なので、どういうときに利用できるのかまで理解する必要がありそうです。

参考記事