はじめに
データ分析において対象データにカテゴリ変数が含まれる場合の対処法について調べた際のまとめです。
カテゴリ変数
例えば下のような社員データに対して回帰分析など数理的な分析を行うケースを考えます。
年齢は数値自体に意味を持つので分析の際にそのまま扱うことができますが、職種のようなカテゴリデータはそのまま扱うことは難しく、扱いやすい数値表現に変換する(エンコーディングする)必要があります。
年齢 | 職種 | |
---|---|---|
社員A | 20 | エンジニア |
社員B | 35 | デザイナー |
社員C | 28 | 営業 |
社員D | 40 | エンジニア |
エンコーディング方法
上の職種のようなカテゴリ変数に対するエンコーディングとしてここでは、One-Hotエンコーディング、ダミーコーディング、Effectコーディングを取り上げます。
One-Hotエンコーディング
one-hotエンコーディングでは先程のカテゴリについて自身がそれに属する場合は1、属さない場合は0として表現します。
職種_デザイナー | 職種_営業 | 職種_エンジニア | |
---|---|---|---|
社員A | 0 | 0 | 1 |
社員B | 1 | 0 | 0 |
社員C | 0 | 1 | 0 |
社員D | 0 | 0 | 1 |
個々で各社員のデータについて
職種_デザイナー + 職種_営業 + 職種_エンジニア = 1
となることが必要です。
ダミーコーディング
one-hotエンコーディングでは3種類の職種からなる職種カテゴリの表現に3つの変数(職種_デザイナー, 職種_営業, 職種_エンジニア)を用いていますが、職種カテゴリを表現するには2つの変数で十分です(k種類のカテゴリに対してk-1個の変数があれば表現できます)。
ダミーコーディングでは変数が0のみで構成されるカテゴリ(参照カテゴリと呼ばれる)を用いて以下のように表現されます。
職種_デザイナー | 職種_営業 | |
---|---|---|
社員A | 0 | 0 |
社員B | 1 | 0 |
社員C | 0 | 1 |
社員D | 0 | 0 |
上の表ではエンジニアカテゴリが参照カテゴリとなっています。
Effectコーディング
ダミーコーディングで扱った参照カテゴリの変数値を0でなく-1にしたものがEffectコーディングです。
データは以下のようになります。
職種_デザイナー | 職種_営業 | |
---|---|---|
社員A | -1 | -1 |
社員B | 1 | 0 |
社員C | 0 | 1 |
社員D | -1 | -1 |
各種エンコーディングの特性
端的に言うとone-hotエンコーディングのカテゴリ変数による表現自由度を下げ、回帰分析の際に回帰パラメータを一意に決定できるようにしたのがダミーコーディングです。
またダミーコーディングの場合線形回帰式の各パラメータは参照カテゴリに対する各カテゴリの差分として解釈されますが、Effectコーディングの場合パラメータは平均からのズレとして解釈できます。そのような解釈の容易さと対称性がEffectコーディングの売りです。
以下詳細に説明します。
one-hotエンコーディングとダミーコーディング
エンコーディングによる違いを見るために線形回帰モデル
y = w_0+w_1x_1+w_2x_2+w_3x_3
x_i: データ, \quad w_i: パラメータ
を考えます。ここでデータ$x_i$がはone-hotエンコーディングされており、$x_1+x_2+x_3=1$の関係が成り立つとします。
上の式に対して
(w_0, w_1, w_2) ⇒ (w_0+w_3, w_1-w_3, w_2-w_3, 0)
とした式を計算してみます。
\begin{align}
(w_0+w_3)+(w_1-w_3)x_1 + (w_2-w_3)x_2 + 0 \cdot x_3 &= w_0+w_1x_1+w_2x_2 + w_3(1 - x_1 - x_2)\\
&= w_0+w_1x_1+w_2x_2 + w_3x_3
\end{align}
これはもとの回帰式です。したがってone-hotエンコーディングの場合は回帰パラメータ$(w_0, w_1, w_2)$と$(w_0+w_3, w_1-w_3, w_2-w_3, 0)$を区別することができず、回帰式のパラメータが一意に定まりません。この問題はone-hotエンコーディングされた変数が必要以上の自由度を持っていることに起因しており、ダミーコーディングのように自由度を必要最小限にすることで解決できます。
ダミーコーディングとEffectコーディング
先程の回帰式に対して$x_3$に対応するカテゴリを参照カテゴリとしてデータをダミーコーディングした場合の回帰式は次式のようになります。
y = v_0+v_1x_1+v_2x_2
x_i: データ, \quad v_i: パラメータ
参照カテゴリデータは$(x_1, x_2)=(0, 0)$なので、その時の回帰式の出力値は$v_0$となります。
したがってダミーコーディング時の回帰式は切片が参照カテゴリに対する出力値、$v_1$, $v_2$はそれぞれカテゴリ1と参照カテゴリの出力値の差、カテゴリ2と参照カテゴリの出力値の差を表します。
一方Effectコーディングの場合、各カテゴリに対する出力値は以下のようになります。
$x_1$ | $x_2$ | 出力$y$ | |
---|---|---|---|
カテゴリ1 | 1 | 0 | $v_0+v_1$ |
カテゴリ2 | 0 | 1 | $v_0+v_2$ |
カテゴリ3 | -1 | -1 | $v_0-v_1-v_2$ |
ここで各カテゴリの出力値の平均を取ると$v_0$になります。
したがってEffectコーディングを用いた場合、回帰式の切片が各カテゴリの回帰式出力値の平均となり、パラメータは各カテゴリの出力値と出力の平均値の差と解釈できます。この解釈のわかりやすさがEffectコーディングの利点です。
参考
- 機械学習のための特徴量エンジニアリング その原理とPythonによる実践
https://www.amazon.co.jp/dp/4873118689 - Pythonではじめる機械学習
https://www.amazon.co.jp/dp/4873117984 - one-hotエンコーディングとダミーコーディングについて
https://stats.stackexchange.com/questions/290526/problems-with-one-hot-encoding-vs-dummy-encoding