第394話|カテゴリ変数の悩みを解決! 高カーディナリティを克服する4つのテクニック

第394話|カテゴリ変数の悩みを解決! 高カーディナリティを克服する4つのテクニック

データ分析や機械学習などで、カテゴリ変数の扱いに頭を悩ませていませんか?

特に、高カーディナリティ(カテゴリの種類が多い状態)に直面すると、どうすればいいか分からなくなってしまいますよね。

でも大丈夫!

今回は、高カーディナリティを克服する4つのテクニックをご紹介します。

カーディナリティって何?

カーディナリティという言葉、聞いたことはありますか?

データ分析の世界では重要な概念なんです。簡単に言えば、カーディナリティとは「カテゴリ変数の中にある、ユニークな値の数」のことです。

例えば、「好きな色」という変数があるとしましょう。

回答が「」「」「」の3つだけなら、このカテゴリ変数のカーディナリティは3です。

では、低カーディナリティと高カーディナリティの違いは何でしょうか?

低カーディナリティ

  • ユニークな値の数が少ない状態です。
  • 例えば、「性別」(男性・女性・その他)や「血液型」(A型・B型・O型・AB型)などが該当します。

高カーディナリティ

  • ユニークな値の数が多い状態です。
  • 「商品名」「顧客ID」「郵便番号」などが典型的な例です。
  • 数百、数千、時には数万のユニークな値が存在することもあります。

高カーディナリティは、データ分析や機械学習のプロセスで様々な課題を引き起こす可能性があります。

でも心配しないでください。その問題点と解決策のお話しをしていきます。

高カーディナリティの落とし穴

高カーディナリティは、一見するとデータの豊富さを示しているように思えるかもしれません。

しかし、実際にはデータ分析や機械学習の過程で様々な問題を引き起こす可能性があります。

ここでは、主な2つの落とし穴について説明します。

 機械学習モデルへの影響

オーバーフィッティング
高カーディナリティの変数を使うと、モデルが訓練データに過剰に適合してしまい、新しいデータに対する予測精度が低下する危険性があります。特に決定木ベースのモデル(ランダムフォレストやGradient Boostingなど)で顕著です。

計算コストの増大
カテゴリの数が多いほど、モデルの学習や予測に時間がかかります。これは特に、ワンホットエンコーディングを使用する場合に顕著です。

未知のカテゴリの扱い
テストデータに訓練データに存在しなかったカテゴリが出現した場合、モデルがうまく対応できない可能性があります。

 データ分析における課題

可視化の困難
カテゴリが多すぎると、グラフや図表で効果的に表現することが難しくなります。

解釈の複雑さ
カテゴリが多いと、それぞれのカテゴリの影響を個別に解釈することが困難になります。

メモリ使用量の増加
高カーディナリティのデータを処理する際、大量のメモリを消費する可能性があります。

これらの問題は、データ分析や機械学習プロジェクトの成功を妨げる大きな障害となり得ます。

テクニック①:頻出カテゴリのワンホットエンコーディング

さて、高カーディナリティの問題に立ち向かう最初のテクニックをご紹介しましょう。

それは「頻出カテゴリのワンホットエンコーディング」です。

 手法の解説

以下、流れです。

  1. データ内のカテゴリの出現頻度を計算します。
  2. 頻度が高い上位N個のカテゴリを選びます(Nは任意に設定)。
  3. 選んだカテゴリだけをワンホットエンコーディングします。
  4. それ以外の稀なカテゴリは、まとめて「その他」として扱います。

例えば、「好きな果物」というカテゴリ変数があり、上位3つを選ぶとします。

  • りんご:40%
  • バナナ:30%
  • オレンジ:20%
  • その他(いちご、メロン、など):10%

このとき、「りんご」「バナナ」「オレンジ」「その他」の4つの列を作成し、該当する場合は1、そうでない場合は0を入れます。

 メリット

特徴量の数を抑えられる
全カテゴリをエンコーディングする場合と比べ、特徴量の数が大幅に減ります。

計算コストの削減
特徴量が少なくなるため、モデルの学習が速くなります。

オーバーフィッティングの抑制
稀なカテゴリによるノイズを減らせます。

 デメリット

情報損失
稀なカテゴリの個別の情報が失われます。

閾値の設定
どの程度の頻度を「頻出」とするかの基準設定が必要です。

時間経過による変化
時間とともにカテゴリの頻度が変化する可能性があります。

この手法は、特に大規模なデータセットや、カテゴリの数が非常に多い場合に効果的です。

ただし、稀なカテゴリにも重要な情報が含まれている可能性がある場合は、慎重に使用する必要があります。

テクニック②:カウント/頻度エンコーディング

2つ目のテクニックは「カウント/頻度エンコーディング」です。

この方法は、カテゴリの出現回数や頻度を利用してエンコーディングを行います。

 手法の解説

  1. カウントエンコーディング
    1. 各カテゴリの出現回数を計算します。
    2. カテゴリを、その出現回数で置き換えます。
  2. 頻度エンコーディング
    1. 各カテゴリの出現頻度(比率)を計算します。
    2. カテゴリを、その出現頻度で置き換えます。

例えば、「好きな果物」というカテゴリ変数があるとします。

  • りんご:40回
  • バナナ:30回
  • オレンジ:20回
  • いちご:10回

カウントエンコーディングでは、「りんご」は40、「バナナ」は30というように置き換えます。

頻度エンコーディングでは、「りんご」は0.4(40%)、「バナナ」は0.3(30%)というように置き換えます。

 適用例

カウント/頻度エンコーディングは、特に売上予測のようなビジネスよりのタスクで威力を発揮します。

例えば……

商品カテゴリのエンコーディング
人気のある(頻繁に購入される)商品カテゴリは高い値を持ち、そうでないカテゴリは低い値を持つことになります。これにより、商品の人気度を数値として表現できます。

顧客IDのエンコーディング
頻繁に購入する顧客(リピーター)は高い値を持ち、そうでない顧客は低い値を持つことになります。これにより、顧客の購買頻度を表現できます。

この方法の利点は、カテゴリの「重要度」や「頻度」という意味のある情報を保持しながら、高カーディナリティを数値に変換できることです。また、新しいカテゴリ(テストデータで初めて登場するカテゴリ)に対しても、0や平均値を割り当てるなどの対処が可能です。

ただし、この手法はすべての状況に適しているわけではありません。カテゴリの出現頻度が目的変数と関連がない場合は、あまり効果的ではないかもしれません。そのため、データの性質や予測タスクの内容に応じて、適切に選択する必要があります。

テクニック③:平均値/ターゲットエンコーディング

3つ目のテクニックは「平均値/ターゲットエンコーディング」です。

この方法は、特に教師あり学習のタスクで効果を発揮します。

 手法の解説

各カテゴリに対して、そのカテゴリに属するサンプルの目的変数の平均値を計算します。

カテゴリを、計算した平均値で置き換えます。

例えば、「好きな果物」というカテゴリ変数と、「1日の果物消費量(個)」という目的変数があるとします。

  • りんご:平均2.5個
  • バナナ:平均3.0個
  • オレンジ:平均1.8個
  • いちご:平均4.2個

この場合、「りんご」は2.5、「バナナ」は3.0というように置き換えます。

しかし、この方法にはいくつか問題があります。特に、サンプル数が少ないカテゴリでは、平均値が不安定になる可能性があります。

そこで、グローバル平均(全サンプルの目的変数の平均)を活用します。

 グローバル平均の活用

カテゴリごとの平均値とグローバル平均を組み合わせます。サンプル数が少ないカテゴリほど、グローバル平均の影響を大きくします。

\displaystyle エンコード値 = \frac{n \times カテゴリ平均 + m \times グローバル平均}{n + m}

ここで、nはカテゴリのサンプル数、mはハイパーパラメータです。

テストデータで新しいカテゴリが登場した場合、グローバル平均を割り当てます。

この方法の利点は、カテゴリと目的変数の関係を直接的に捉えられることです。また、高カーディナリティを効果的に処理しつつ、カテゴリ間の「意味」も保持できます。

 注意点

ターゲットリーケージ
訓練データの情報がエンコーディングに使われるため、過学習のリスクがあります。クロスバリデーションなどで適切に評価する必要があります。

時系列データへの適用
将来のデータに過去の目的変数の情報を使用することになるため、時系列データでは使用に注意が必要です。

分類問題での使用
連続値の目的変数でなく、クラスラベルの場合は、各クラスの確率を使用するなどの工夫が必要です。

平均値/ターゲットエンコーディングは強力な手法ですが、適切に使用しないとモデルの性能を損なう可能性もあります。データの性質と目的をよく理解した上で使用しましょう。

テクニック④:レアカテゴリのグループ化

最後のテクニックは「レアカテゴリのグループ化」です。

この方法は、出現頻度の低いカテゴリを一つのグループにまとめることで、高カーディナリティの問題に対処します。

 手法の解説

以下、流れです。

  1. カテゴリの出現頻度を計算します。
  2. 頻度が一定の閾値(例:全体の1%)未満のカテゴリを「レアカテゴリ」と定義します。
  3. すべてのレアカテゴリを「その他」や「RARE」などの新しいカテゴリにまとめます。
  4. 残りの頻出カテゴリと新しく作った「その他」カテゴリに対して、他のエンコーディング手法(例:ワンホットエンコーディング)を適用します。

例えば、「購入した商品」というカテゴリ変数があるとします。

  • 商品A:45%
  • 商品B:30%
  • 商品C:15%
  • 商品D:3%
  • 商品E:2%
  • その他の商品:各1%未満

閾値を5%と設定すると、商品D、商品E、およびその他の1%未満の商品すべてが「その他」カテゴリにグループ化されます。

 オーバーフィッティング防止のコツ

適切な閾値の選択
データの特性に応じて閾値を調整します。一般的には1%〜5%の範囲がよく使用されますが、データサイズやドメイン知識に基づいて決定しましょう。

クロスバリデーションの活用
異なる閾値でモデルを学習させ、クロスバリデーションでパフォーマンスを比較します。これにより、最適な閾値を見つけることができます。

ドメイン知識の活用
ビジネスや分析の目的に応じて、重要なレアカテゴリは個別に扱うなど、柔軟にグループ化を行います。

時系列データへの対応
時間とともにカテゴリの頻度が変化する可能性がある場合、定期的にグループ化を更新することを検討しましょう。

バランスの取れたグループ化
「その他」カテゴリが他のカテゴリと比べて極端に大きくなりすぎないよう注意します。必要に応じて複数の「その他」グループを作成することも検討しましょう。

この手法の利点は、モデルの複雑性を減らしつつ、重要なカテゴリの情報を保持できることです。また、新しいカテゴリ(テストデータで初めて登場するカテゴリ)も自動的に「その他」グループに割り当てられるため、未知のカテゴリへの対応も容易になります。

ただし、レアカテゴリの中に重要な情報が含まれている可能性もあるため、グループ化の際はデータの性質をよく理解し、慎重に行う必要があります。

データに合った手法を選ぼう!

これまで4つの魔法のテクニックを学んできましたが、どの手法を選べばいいのか悩むかもしれません。

そこで、各テクニックの使い分けと実践などについて紹介します。

 頻出カテゴリのワンホットエンコーディング

使う場面

  • カテゴリの数が非常に多く(例:1000以上)、そのままでは次元が高くなりすぎる場合
  • モデルの学習時間や計算コストを削減したい場合
  • 特徴量の数を減らしてモデルの複雑さを抑えたい場合

適している場合

  • 頻出カテゴリが全体の大部分(例:80%以上)を占めている場合
  • パレートの法則(80:20の法則)が当てはまるようなデータ分布の場合
  • レアカテゴリの個別の影響が小さいと考えられる場合

 カウント/頻度エンコーディング

使う場面

  • カテゴリの出現頻度自体が予測に有用な情報となる場合
  • カテゴリの数が多すぎてワンホットエンコーディングが現実的でない場合
  • カテゴリ間の相対的な重要度や人気度を表現したい場合

適している場合

  • Eコマースの商品カテゴリ(人気商品カテゴリの特定)
  • 顧客ID(頻繁に購入する顧客の識別)
  • ウェブサイトのページカテゴリ(アクセス頻度の高いページの特定)

 平均値/ターゲットエンコーディング

使う場面

  • 教師あり学習で、カテゴリと目的変数の関係が非線形または複雑な場合
  • カテゴリ変数の影響を直接的に数値化したい場合
  • カテゴリの数が多く、他の方法では情報損失が大きくなる場合

適している場合

  • 回帰問題(例:家の価格予測で、地域カテゴリごとの平均価格を使用)
  • 二値分類問題(例:顧客の解約予測で、職業カテゴリごとの解約率を使用)
  • カテゴリごとの傾向を捉えたい場合(例:製品カテゴリごとの平均評価スコア)

 レアカテゴリのグループ化

使う場面

  • 多数のレアカテゴリが存在し、個別に扱うとノイズが増える場合
  • モデルの汎化性能を向上させたい場合
  • 新しいカテゴリ(テストデータで初めて登場するカテゴリ)への対応が必要な場合

適している場合

  • 長いテール分布を持つカテゴリ変数がある場合(例:多数の稀少な商品カテゴリ)
  • カテゴリの分布が極端に偏っている場合
  • データが時間とともに変化し、新しいカテゴリが頻繁に出現する可能性がある場合

実践に向けて

これらのテクニックは排他的ではなく、しばしば組み合わせて使用されます。

例えば、まずレアカテゴリをグループ化し、その後で頻出カテゴリにワンホットエンコーディングを適用するといった方法も効果的です。

データの特性と問題の性質を十分に理解した上で、最適な方法(または組み合わせ)を選択することが重要です。

以下、実践の流れの一例です。

1.データを理解する
まず、カテゴリ変数の分布を視覚化し、カーディナリティの程度を把握しましょう。

2.ドメイン知識を活用する
ビジネスや分野の知識を活かし、重要なカテゴリを識別します。

3.複数の手法を試す
1つの手法に固執せず、複数の手法を試してみましょう。

4.クロスバリデーションを活用する
各手法の性能を公平に比較するために、クロスバリデーションを使用します。

5.解釈可能性を考慮する
モデルの解釈が重要な場合は、より直感的な手法(例:頻出カテゴリのワンホットエンコーディング)を選びましょう。

6.計算コストを考慮する
大規模なデータセットの場合、計算効率の良い手法(例:カウントエンコーディング)を検討します。

7.ハイブリッドアプローチを検討する
複数の手法を組み合わせることで、より効果的な結果が得られることもあります。

8.定期的に見直す
特に時系列データの場合、カテゴリの分布は時間とともに変化する可能性があります。定期的にエンコーディングを更新することを検討しましょう。

完璧な手法は存在しません。データの性質、問題の特性、そして自分のゴールに応じて、最適な手法(またはその組み合わせ)を選択することが重要です。実験と試行錯誤を恐れずに、そのデータに最適な方法を見つけてください。

今回のまとめ

今回は、高カーディナリティを持つカテゴリ変数に対処するための4つの主要テクニックを紹介しました。

  1. 頻出カテゴリのワンホットエンコーディング
  2. カウント/頻度エンコーディング
  3. 平均値/ターゲットエンコーディング
  4. レアカテゴリのグループ化

これらのテクニックを効果的に活用するためのポイントは……

  • データと問題の性質を十分に理解する
  • 複数のテクニックを試し、結果を比較する
  • クロスバリデーションを用いて性能を評価する
  • ドメイン知識を活用し、必要に応じてテクニックを組み合わせる

完璧な解決策はありませんが、これらのテクニックを適切に使いこなすことで、高カーディナリティの課題を克服し、より効果的なデータ分析や機械学習モデルの構築が可能になります。

常に新しい手法にも注目し、実践を通じて技術を磨いていくことが重要です。