カテゴリデータ: 語彙とワンホット エンコーディング

ディメンションという用語は、特徴ベクトルの要素数の同義語です。カテゴリ特徴の中には、次元が低いものもあります。次に例を示します。

機能名 # of categories カテゴリの例
snowed_today 2 True、False
skill_level 3 初級、実務担当者、エキスパート
season 4 冬、春、夏、秋
day_of_week 7 月曜日、火曜日、水曜日
惑星 8 水星、金星、地球

カテゴリ特徴の候補となるカテゴリが少ない場合は、ボキャブラリとしてエンコードできます。語彙エンコードを使用すると、モデルは考えられる各カテゴリ値を個別の特徴として扱います。トレーニング中に、モデルは各カテゴリに異なる重みを学習します。

たとえば、car_color という名前のカテゴリ特徴に基づいて自動車の価格を予測するモデルを作成するとします。赤い車は緑色の車よりも価値が高いかもしれません。メーカーが提供する外装色は限られているため、car_color は低次元のカテゴリ特徴です。次の図は、car_color の語彙(有効な値)を示しています。

図 1. パレット内の各色は、個別の特徴として表されます。つまり、各色は特徴ベクトルの個別の特徴です。たとえば、「赤」は特徴、「オレンジ」は別の特徴です。
図 1. カテゴリごとに固有の機能。

演習: 理解度を確認する

真偽: ML モデルは、これらの値を数値ベクトルに変換せずに、「赤」「黒」などの未加工の文字列値を直接トレーニングできます。
正しい
False

インデックス番号

機械学習モデルは浮動小数点数のみを操作できます。したがって、次の図に示すように、各文字列を一意のインデックス番号に変換する必要があります。

図 2. 各色には一意の整数値が関連付けられています。たとえば、「赤」は整数 0 に、「オレンジ」は整数 1 に関連付けられます。
図 2. インデックス登録済み特徴。

文字列を一意のインデックス番号に変換したら、データをさらに処理して、モデルが値間の有意な関係を学習できるようにする必要があります。カテゴリ特徴データをインデックス付き整数のままモデルに読み込むと、モデルはインデックス付き値を連続浮動小数点数として扱います。モデルは、「紫」が「オレンジ」よりも 6 倍の確率で発生すると見なします。

ワンホット エンコーディング

語彙の作成の次のステップは、各インデックス番号をワンホット エンコードに変換することです。ワンホット エンコーディングでは、

  • 各カテゴリは、N 個の要素のベクトル(配列)で表されます。ここで、N はカテゴリの数です。たとえば、car_color に 8 つのカテゴリが存在する場合、それを表すワンホット ベクトルには 8 つの要素が含まれます。
  • 1 ホット ベクトルの要素のうち、1 つの要素の値が 1.0 で、残りの要素の値はすべて 0.0 です。

たとえば、次の表は car_color の各要素のワンホット エンコードを示しています。

機能 Orange 黒人 茶色
「赤」 1 0 0 0 0 0 0 0
"Orange" 0 1 0 0 0 0 0 0
"Blue" 0 0 1 0 0 0 0 0
「黄色」 0 0 0 1 0 0 0 0
「緑」 0 0 0 0 1 0 0 0
"Black" 0 0 0 0 0 1 0 0
"紫" 0 0 0 0 0 0 1 0
"Brown" 0 0 0 0 0 0 0 1

特徴ベクトルに渡されるのは、文字列やインデックス番号ではなく、ワンホット ベクトルです。モデルは、特徴ベクトルの要素ごとに個別の重みを学習します。

次の図は、語彙表現のさまざまな変換を示しています。

図 3. カテゴリを特徴ベクトルにマッピングするエンドツーエンド プロセスの図。この図では、入力特徴は「Yellow」、「Orange」、「Blue」、「Blue」です。システムは、保存された語彙(「赤」は 0、「オレンジ」は 1、「青」は 2、「黄色」は 3 など)を使用して、入力値を ID にマッピングします。したがって、システムは「黄色」、「オレンジ」、「青」、「青」を 3、1、2、2 にマッピングします。システムは、これらの値をワンホット特徴ベクトルに変換します。たとえば、8 色のシステムの場合、3 は 0, 0, 0, 1, 0, 0, 0, 0 になります。
図 3. カテゴリを特徴ベクトルにマッピングするエンドツーエンド プロセス。

スパース表現

値の大部分がゼロ(または空)の特徴は、スパースな特徴と呼ばれます。car_color などの多くのカテゴリ特徴は、スパースな特徴になる傾向があります。スパース表現とは、1.0 の位置をスパース ベクトルに保存することを意味します。たとえば、"Blue" の 1 ホット ベクトルは次のようになります。

[0, 0, 1, 0, 0, 0, 0, 0]

1 は 2 番目の位置にあるため(カウントを 0 から開始した場合)、上記のワンホット ベクトルのスパース表現は次のようになります。

2

スパース表現は、8 要素の 1 ホット ベクトルよりもはるかに少ないメモリを使用します。重要なのは、モデルはスパース表現ではなく、1 ホット ベクトルでトレーニングする必要があることです。

カテゴリデータの外れ値

数値データと同様に、カテゴリデータにも外れ値が含まれます。car_color に一般的な色だけでなく、"Mauve""Avocado" など、あまり使用されない外れ値の色も含まれているとします。これらの外れ値の色に個別のカテゴリを割り当てるのではなく、語彙外(OOV)という単一の「包括的」カテゴリにまとめることができます。つまり、すべての外れ値の色が 1 つの外れ値バケットに分類されます。システムは、その外れ値バケットの単一の重みを学習します。

高次元のカテゴリ特徴のエンコード

次の表に示すように、カテゴリ特徴には多くのディメンションがあります。

機能名 # of categories カテゴリの例
words_in_english ~ 500,000 「happy」、「walking」
US_postal_codes 約 42,000 「02114」、「90301」
last_names_in_Germany ~ 850,000 「Schmidt」、「Schneider」

カテゴリの数が多い場合は、通常、ワンホット エンコードは適していません。通常は、エンベディング(別のエンベディング モジュールで詳しく説明)の方がはるかに適しています。エンベディングを使用すると次元数が大幅に削減されるため、モデルに次の 2 つの重要なメリットがあります。

  • 通常、モデルのトレーニングが高速化されます。
  • 通常、構築されたモデルは予測をより迅速に推論します。つまり、モデルのレイテンシが低くなります。

ハッシュ化(ハッシュ化トリックとも呼ばれます)は、次元数を減らすためのあまり一般的ではない方法です。

簡単に説明すると、ハッシュ化は、カテゴリ(色など)を小さな整数(そのカテゴリを保持する「バケット」の数)にマッピングします。

具体的には、ハッシュ アルゴリズムは次のように実装します。

  1. カテゴリのベクトルのビン数を N に設定します。ここで、N は残りのカテゴリの合計数より小さい値です。任意の例として、N = 100 とします。
  2. ハッシュ関数を選択します。(多くの場合、ハッシュ値の範囲も選択します)。
  3. 各カテゴリ(特定の色など)をそのハッシュ関数に渡して、ハッシュ値(89237 など)を生成します。
  4. 各ビンに、出力ハッシュ値の剰余 N のインデックス番号を割り当てます。この場合、N が 100 でハッシュ値が 89237 の場合、89237 % 100 は 37 であるため、モジュロの結果は 37 になります。
  5. これらの新しいインデックス番号を使用して、各ビンのワンホット エンコードを作成します。

データのハッシュ化の詳細については、本番環境の ML システム モジュールのランダム化のセクションをご覧ください。