13.3 カテゴリカル変数の扱い

入力データは必ず数値に変換する必要がありますが, ログデータはしばしば数値でない情報を含みます. このようなカテゴリカル変数を, 学習できるように変化する最も単純な方法は, one-hot エンコードです. one-hot エンコードは, カテゴリカル変数の値の種類だけあらたに特徴量を作り, 対応する値を1に, それ以外をゼロにします. 回帰分析ではダミー変数とも呼ばれます.

カテゴリカル変数を特徴量として使うときは欠損値に注意してください. これは単に値が NANULL であるという意味ではなく, 検証データにある値が, 訓練データでは一度も表れない可能性がある, という話です. 特に今回のような逐次取得できるデータでは, 次々と新しいIDが発生します. 特別な対処をしない one-hot エンコードでは, おそらくは検証データを入力してもうまく変換できずエラーが発生するでしょう. どんな場合でも対処できる手法は存在しません. もし数値変数に置き換えられるのなら, 欠損値を補間によって解決できるかもしれませんし, 例外的な値は全てゼロに置き換えるしかないかもしれません.

one-hot エンコードは次元が大幅に増えます. 次元を増やさない方法としては, ラベルエンコードがあります. ラベルエンコードとは, カテゴリカル変数の各値を, 1対1で別の数値に置き換えることです. この元の値との対応関係がデタラメならば, 当然当てはまりは改善しないでしょう. その他, 値がデータ中に発生する数や比率に置き換えるカウントエンコードや, 発生数順位に置き換えるランクエンコード 対応するラベル比率に置き変えるターゲットエンコードなどがあります (表 13.1).

表 13.1: One-hot 以外のカテゴリカル変数の変換例
ラベル 特徴量 (生データ) label Count Rank Target
0 C 3 4 1 0.2500000
0 C 3 4 1 0.2500000
0 A 1 3 1 0.3333333
0 A 1 3 1 0.3333333
1 B 2 3 1 1.0000000
1 B 2 3 1 1.0000000
1 B 2 3 1 1.0000000
1 C 3 4 1 0.2500000
0 C 3 4 1 0.2500000
1 A 1 3 1 0.3333333

13.3.1 実装上の注意

scikit-learn にはカテゴリカル変数向けに次のような変換クラスが用意されています.

  • sklearn.preprocessing.OneHotEncoder
  • sklearn.preprocessing.LabelEncoder

加えて, CategoricalEncoder, MLXtend モジュールにいくつかのクラスがありますが, 現状操作のしやすさで scikit-learn のものが最も優れています.