表現: 特徴量エンジニアリング

従来のプログラミングでは、コードに重点が置かれていました。ML プロジェクトでは 表現に焦点が移りますつまり 開発者がモデルに磨きをかける方法の一つに その機能を追加して改善する方法があります

元データを特徴にマッピングする

図 1 の左側は入力データソースの元データを示しています。右側は特徴ベクトルを示しています。特徴ベクトルはデータセット内の例を構成する浮動小数点値のセットです。特徴量エンジニアリングとは、元データを特徴ベクトルに変換することを意味します。特徴量エンジニアリングには多くの時間を費やすことが想定されます。

多くの機械学習モデルでは、特徴値にモデルの重み付けを掛ける必要があるため、特徴を実数のベクトルとして表現する必要があります。

元データは、特徴量エンジニアリングと呼ばれるプロセスによって特徴ベクトルにマッピングされます。

図 1. 特徴量エンジニアリングは、元データを ML の特徴にマッピングします。

数値のマッピング

整数データと浮動小数点データには、数値の重みを乗算できるため、特別なエンコードは必要ありません。図 2 に示すように、未加工の整数値 6 を特徴値 6.0 に変換するのは簡単です。

元データから直接コピーできる特徴の例

図 2. 整数値を浮動小数点値にマッピングする。

カテゴリ値のマッピング

カテゴリ特徴には、取り得る値のセットがあります。たとえば、street_name という対象物に次のようなオプションがある場合があります。

{'Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue'}

モデルでは文字列と学習した重みを乗算できないため、特徴量エンジニアリングを使用して文字列を数値に変換します。

これは、特徴値(ここでは取り得る値の語彙)から整数へのマッピングを定義することで実現できます。データセットには世界中のすべての道路が表示されるわけではないため、その他すべての道路を OOV(out-of-vocabulary)バケットというキャッチオール「その他」のカテゴリにグループ化できます。

この方法では、次のようにして番地を数値にマッピングできます。

  • チャールストン通りを 0 に写して
  • ノースショアライン ブールバードを 1 にマッピングする
  • ショアバード ウェイから 2 までの地図
  • レングストフアベニューを 3 の地図にする
  • その他すべて(OOV)を 4 にマッピングする

ただし、これらのインデックス番号をモデルに直接組み込むと、問題となる可能性のある制約が課されます。

  • すべての道路に適用される単一の重みを学習します。たとえば、street_name の重みが 6 であると学習した場合、Charleston Road については 0、North Shoreline Boulevard については 1、Shorebird Way については 2 を乗算します。street_name を特徴として使用して住宅価格を予測するモデルについて考えてみましょう。通りの名前に基づいて価格が線形に調整される可能性は低いです。さらに、この場合は、道路が平均の住宅価格に基づいて注文されていると想定されます。このモデルでは、道路ごとに異なる重みを学習する柔軟性が必要です。この重みは、他の特徴による推定料金に加算されます。

  • street_name が複数の値を取るケースについては考慮していません。たとえば、多くの家は 2 つの通りの角に位置しており、インデックスが 1 つしかない場合、その情報は street_name 値でエンコードできません。

これらの両方の制約を取り除くには、次のように値を表すモデル内のカテゴリ特徴ごとにバイナリ ベクトルを作成します。

  • この例に適用される値については、対応するベクトル要素を 1 に設定します。
  • 他のすべての要素は 0 に設定します。

このベクトルの長さは、語彙の要素数と等しくなります。 この表現は、単一の値が 1 の場合のワンホット エンコーディングと呼ばれ、複数の値が 1 の場合のマルチホット エンコーディングと呼ばれます。

図 3 は、特定の通り「ショアバード ウェイ」のワンホット エンコーディングを示しています。 ショアバード ウェイのバイナリ ベクトルの要素の値は 1 で、他のすべての道路の要素の値は 0 です。

文字列値(

図 3. ワンホット エンコーディングで番地をマッピングする。

この方法では、各特徴値(通りの名前など)のブール値変数を効果的に作成できます。家がショアバード ウェイ上にある場合、バイナリ値はショアバード ウェイの場合のみ 1 です。したがって、モデルはショアバード ウェイの重みのみを使用します。

同様に、家が 2 つの通りの角にある場合、2 つのバイナリ値が 1 に設定され、モデルはそれぞれの重みを使用します。

スパース表現

データセットに 1,000,000 種類の道路名があり、それを street_name の値として含めるとします。1 つまたは 2 つの要素のみが真である 1,000,000 個の要素からなるバイナリ ベクトルを明示的に作成することは、これらのベクトルを処理するときのストレージと計算時間の両方の観点から非常に非効率な表現です。このような状況では、ゼロ以外の値のみが格納される スパース表現を使用するのが一般的なアプローチです。スパース表現でも、前述のように、特徴値ごとに独立したモデルの重みが学習されます。