こちらを読むと
- カテゴリ特徴量の代表的な変換方法を知ることができます。
- それぞれの変換方法の長所・短所が分かります。
- 記事の所要時間は10分です。
前回の記事で、カテゴリ特徴量が何かを紹介しました。
カテゴリ特徴量は、数値でない選択肢の値で、そのままでは機械学習モデルで扱えません。
そのため、数値データに変換してあげる必要があります。
今回は、カテゴリ特徴量の代表的な変換方法を紹介します。
データ例
ここでは、kaggleのTitanicコンペティションから、
Embarked – 出港地(タイタニックへ乗った港)
を例に挙げます。
Embarkedは、以下の3種類のカテゴリをもつ特徴量です。
値 | 内容 |
---|---|
C | Cherbourg |
Q | Queenstown |
S | Southampton |
データセットの一部を抜粋すると、以下のようになっています。
PassengerId | … | Embarked |
---|---|---|
27 | … | C |
28 | … | Q |
29 | … | S |
One-Hotエンコーディング
One-Hotエンコーディングは前回の記事でも紹介しました。
データ例を変換すると、以下のようになります。
PassengerId | … | Embarked_C | Embarked_Q | Embarked_S |
---|---|---|---|---|
27 | … | 1 | 0 | 0 |
28 | … | 0 | 1 | 0 |
29 | … | 0 | 0 | 1 |
ダミーコーディング
ダミーコーディングは、One-Hotエンコーディングの冗長性を減らした変換方法です。
PassengerId | … | Embarked_C | Embarked_Q |
---|---|---|---|
27 | … | 1 | 0 |
28 | … | 0 | 1 |
29 | … | 0 | 0 |
違いは見てもらえばわかると思いますが、変換後の列が1つ少ないです。
Embarked_Sの列がないですが、Embarked_CにもEmbarked_Qにもビットが立っていない(値が1でない)行は、Embarked_Sであると言えます。
このような、列を設けないが、他の列が0であることで表現するカテゴリを、
参照カテゴリと呼びます。
こうやってみるとダミーコーディングは優れているように見えますが、欠損データに弱いという欠点があります。
仮に、カテゴリが記録されていないレコードがある場合、One-Hotエンコーディングでは全列を0にすることで表現できますが、ダミーコーディングではそれができません。
すでに、全列が0という値を、参照カテゴリに使ってしまっているからです。
Effectコーディング
ダミーコーディングの欠点を補ったのが、最後に紹介するEffectコーディングです。
PassengerId | … | Embarked_C | Embarked_Q |
---|---|---|---|
27 | … | 1 | 0 |
28 | … | 0 | 1 |
29 | … | -1 | -1 |
ダミーコーディングと同様、変換後は2列で表現していますが、値が違います。
ダミーコーディングでは参照カテゴリを0で表現していましたが、Effectコーディングでは-1で表現しています。
一見して、ダミーコーディングよりも分かりやすいですね。
そして欠損データにも対応できています。
ただし、Effectコーディングは表現方法としては万能に見えますが、’-1’のベクトルが密なベクトルであり、記憶容量や計算コストがかかってしまうようです。
変換方法のまとめ
変換方法 | 長所 | 短所 |
---|---|---|
One-Hotエンコーディング | 欠損データの対応が容易 | 1列分が冗長になっている |
ダミーコーディング | 冗長でない | 欠損データの対応が難 |
Effectコーディング | 冗長でない上に、解釈が容易 | 記憶容量や計算コストがかかる |
まとめ
- カテゴリ特徴量の代表的な変換方法を知ることができました。
- それぞれの変換方法の長所・短所が分かりました。
この記事で紹介した変換方法は理解が容易で使いやすいです。ただし、膨大なカテゴリ数に対してはうまく機能しなくなります。
カテゴリ数がそこまで大きくない場合は有用なので、ぜひマスターしておきましょう!
Reference
機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践