こんにちは。わたやんです。
今回はカテゴリカル変数のエンコーディングの仕方、種類についてお話しさせてください。
カテゴリカル変数とは??

そもそも機械学習を知らない人は、「カテゴリカル変数ってなに?」て感じだと思います。→今さら聞けない機械学習
カテゴリカルデータは、名義尺度と順序尺度を含む離散量のデータと言い換えることができます。
けれどこの説明を聞いても実際よくわからないと思います。
例えば、以下のようなものがあります。
- 性別(名義尺度,2値)
- 賛成vs反対(名義尺度,2値)
- はいvsいいえ(名義尺度,2値)
- 住んでいる都道府県(名義尺度,多値)
- プロスポーツの好きな順番(順序尺度,多値)
なんとなくイメージできたでしょうか?
ではなぜカテゴリカル変数をエンコーディングする必要があるのか?
それは、ほとんどの機械学習モデルの実装では、カテゴリカル変数を含むデータに対して、学習や予測ができません。
そのため、数値変数に変換しておく必要があります。→これをエンコーディングといいます。
1.Label Encoding
Label Encodingでは、与えられたカテゴリカル変数に単純に数字を割り当てることでエンコーディングします。
(例: M(男) → 0、F(女) → 1、 N(回答なし)→ 2)
この手法の問題点は、3種類以上の値を含むカテゴリカル変数に対して、無意味な順序が導入されてしまうことです。
(例: MとFの差より、MとNの差の方が大きいということはないが、数値的にはそのようなことが含意されてしまう)
2.Count Encoding
Count Encodingでは、与えられたカテゴリカル変数にそれぞれの値の出現回数を割り当てます。
(例: M、F、Nの出現回数がそれぞれ200、150、10であれば、 M→ 200、F → 150 、N→ 10 )
この手法の問題点は、異なるカテゴリカル変数に同じ値が割り当てられ、情報が失われる場合があることです。
(例: M,Fの出現回数がそれぞれ200であれば、M→ 1, F → 1となり、同じ値になってしまう)
3.Label-Count Encoding
Label-Count Encodingはその名の通りLabel EncodingとCount Encodingを組み合わせたハイブリッドなものです。
Label-Count Encodingでは、与えられたカテゴリカル変数にそれぞれの値の出現回数の順位を割り当てます。
(例: M,F,Nの出現回数がそれぞれ200(1位), 150(2位), 10(3位)であれば、M → 1, F → 2, N → 3)
Label-Count Encodingは、無意味な順序付けというLabel Encodingの問題点を解消する手法となっています。
また出現回数が同じ場合に順位を登場順に決めることにすれば(rankメソッドの引数をmethod=’first’とする)
異なるカテゴリカル変数に対する値の衝突というCount Encodingの問題点も解消することができています。
(ただしこの場合、出現回数が同じカテゴリカル変数だけに対しては、無意味な順序が導入されてしまいます)
4.One-Hot Encoding
One-Hot Encodingは、カテゴリカル変数のそれぞれの値に対応するカラムを用意して、フラグを割り当てます。
この手法は、Label EncodingやCount Encodingで挙げられた問題点をいずれも解消することができています。
文章では説明が難しいので、実際のデータでエンコーディングしてみます。
#性別のデータ(data)を用意、先頭から10個のデータの中身を見る
data.head(10)

# One-Hot Encodingの適用
data_ohe = pd.get_dummies(data)
# 適用結果の確認(最初の10件)
data_ohe[:10]

One-Hot Encodingの問題点は、カテゴリカル変数の値の種類だけカラム数が増え、疎になってしまうことです。(性別という1種のカラムが性別M、性別F、性別Nの3種に増えた)
例えば1000種類の値をもつ変数に対してOne-Hot Encodingを適用すると、カラムが1000列増えてしまいます。
このような場合は、前述のLabel-Count Encodingなど他の手法を適用した方が良いということになると思います。
最後に

今回はカテゴリカル変数のエンコーディングについてお話しさせてもらいました。
カテゴリカル変数のエンコーディングは、データ分析では基礎の基礎ですので、データ分析、機械学習に興味のある方は覚えといて損はないと思います!
機械学習の興味のある方はぜひこちらも↓↓
みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習

コメント
[…] 多くの機械学習のアルゴリズムは、数値型データしか扱えないため、このような「?」などの非数値データを含む変数に対しては、それを取り除く前処理が必要です。→カテゴリカル変数のエンコーディングまとめ(機械学習) […]