機械学習への埋め込み:複雑なデータをシンプルにする

公開: 2022-03-11

経験豊富なデータサイエンティストであっても、数値以外のデータを扱うのは難しい場合があります。 典型的な機械学習モデルは、その機能が単語、電子メール、Webサイトのページ、リスト、グラフ、または確率分布ではなく、数字であることを期待しています。 有用であるためには、データは最初にベクトル空間に変換されなければなりません。 しかし、どのように?

一般的なアプローチの1つは、数値以外の機能をカテゴリとして扱うことです。 これは、カテゴリの数が少ない場合(たとえば、データが職業または国を示している場合)にうまく機能する可能性があります。 ただし、この方法を電子メールに適用しようとすると、サンプルと同じ数のカテゴリが取得される可能性があります。 2つの電子メールがまったく同じになることはないため、このアプローチは役に立ちません。

もう1つのアプローチは、データサンプル間の距離を定義することです。これは、任意の2つのサンプルがどれだけ近いかを示す関数です。 または、類似度を定義することもできます。これにより、2つの近いサンプル間の距離が小さく、類似度が大き​​いことを除いて、同じ情報が得られます。 すべてのデータサンプル間の距離(類似性)を計算すると、距離(または類似性)行列が得られます。 これは私たちが使用できる数値データです。

ただし、このデータにはサンプルと同じ数の次元があります。これは、特徴として使用したり(次元の呪いを参照)、視覚化したりする場合(1つのプロットで6Dでも処理できますが、まだです)、通常はあまり良くありません。 100Dプロットを表示します)。 次元数を妥当な量に減らすことはできますか?

答えはイエスです! それが私たちの埋め込みです。

埋め込みとは何ですか?なぜそれを使用するのですか?

埋め込みは、高次元データの低次元表現です。 通常、埋め込みでは、元のデータに含まれるすべての情報がキャプチャされるわけではありません。 ただし、適切な埋め込みは、目前の問題を解決するのに十分なキャプチャになります。

特定のデータ構造に合わせて調整された多くの埋め込みが存在します。 たとえば、テキストデータの場合はword2vec、形状画像データの場合はフーリエ記述子について聞いたことがあるかもしれません。 代わりに、距離または類似度を定義できるデータに埋め込みを適用する方法について説明します。 距離行列を計算できる限り、データの性質はまったく関係ありません。 メール、リスト、ツリー、Webページなど、同じように機能します。

この記事では、さまざまなタイプの埋め込みを紹介し、いくつかの一般的な埋め込みがどのように機能するか、および埋め込みを使用して複雑なデータを含む実際の問題を解決する方法について説明します。 また、この方法の長所と短所、およびいくつかの代替案についても説明します。 はい、いくつかの問題は他の方法でよりよく解決できますが、残念ながら、機械学習には特効薬はありません。

始めましょう。

埋め込みのしくみ

すべての埋め込みは、データ内の「重要な」情報を保持しながらデータの次元を削減しようとしますが、すべての埋め込みは独自の方法でそれを行います。 ここでは、距離または類似度行列に適用できるいくつかの一般的な埋め込みについて説明します。

そこにあるすべての埋め込みをカバーしようとはしません。 それを行うことができる少なくとも12のよく知られた埋め込みと、さらに多くのあまり知られていない埋め込みとそのバリエーションがあります。 それぞれに独自のアプローチ、長所、短所があります。

他にどのような埋め込みがあるかを確認したい場合は、ここから始めることができます。

  • Scikit-learnユーザーガイド
  • 統計学習の要素(第2版)、第14章

距離行列

距離行列について簡単に触れてみましょう。 データの適切な距離を見つけるには、問題を十分に理解し、数学についてある程度の知識があり、場合によっては運が良かったことが必要です。 この記事で説明するアプローチでは、それがプロジェクトの全体的な成功または失敗に寄与する最も重要な要因である可能性があります。

また、いくつかの技術的な詳細を念頭に置く必要があります。 多くの埋め込みアルゴリズムは、距離(または非類似度)行列$ \ textbf {D} $の対角線がゼロであり、対称であると想定します。 対称でない場合は、代わりに$(\ textbf {D} + \ textbf {D} ^ T)/2$を使用できます。 カーネルトリックを使用するアルゴリズムは、距離がメトリックであると想定します。これは、三角不等式が成り立つことを意味します。

\ [\ forall a、b、c \; \; d(a、c)\ leq d(a、b)+ d(b、c)\]

また、アルゴリズムが代わりに類似度行列を必要とする場合は、任意の単調減少関数を適用して、距離行列を類似度行列に変換できます(たとえば、$ \ exp -x $)。

主成分分析(PCA)

主成分分析(PCA)は、おそらくこれまでで最も広く使用されている埋め込みです。 考え方は単純です。キャプチャされた分散を最大化する、または(同等に)2次再構成エラーを最小化する特徴の線形変換を見つけます

具体的には、特徴をサンプル行列とします。$ \ textbf {X} \ in \ mathbb {R} ^ {n \ timesp}$には$n$の特徴と$p$の次元があります。 簡単にするために、データサンプルの平均がゼロであると仮定しましょう。 $ \ textbf{X}$に正規直交行列$\textbf {V} _q \ in \ mathbb {R} ^ {p \ times q} $を掛けることで、次元数を$p$から$q$に減らすことができます。 :

\ [\ hat {\ textbf {X}} = \ textbf {X} \ textbf {V} _q \]

次に、$ \ hat {\ textbf {X}} \ in \ mathbb {R} ^ {n \ timesq}$が新しい機能セットになります。 新しい機能を元の空間にマッピングするには(この操作は再構成と呼ばれます)、単に$ \ textbf {V} _q ^T$を再度乗算する必要があります。

ここで、再構成エラーを最小化する行列$ \ textbf {V}_q$を見つけます。

\ [\ min _ {\ textbf {V} _q} || \ textbf {X} \ textbf {V} _q \ textbf {V} _q ^ T-\ textbf {X} || ^ 2 \]

行列$\textbf {V} _q $の列は主成分方向と呼ばれ、$ \ hat {\ textbf{X}}$の列は主成分と呼ばれます。 数値的には、SVD分解を$ \ textbf {X} $に適用することで、$ \ textbf {V} _q $を見つけることができますが、他にも同様に有効な方法があります。

PCAは、数値特徴に直接適用できます。 または、特徴が数値でない場合は、距離または類似度行列に適用できます。

Pythonを使用する場合、PCAはscikit-learnに実装されます。

この方法の利点は、計算が高速で、データのノイズに対して非常に堅牢であることです。

欠点は、線形構造しかキャプチャできないため、元のデータに含まれている非線形情報が失われる可能性があることです。

カーネルPCA

カーネルPCAは、PCAの非線形バージョンです。 アイデアは、サポートベクターマシンSVMに精通している場合におそらく聞いたことがあるカーネルトリックを使用することです。

具体的には、PCAを計算するためのいくつかの異なる方法があります。 それらの1つは、グラム行列$ \ textbf {X} \ textbf {X} ^ T \ in \ mathbb {R} ^ {n \ timesn}$の二重中心バージョンの固有分解を計算することです。 ここで、データのカーネル行列$ \ textbf {K} \ in \ mathbb {R} ^ {n \ times n} $を計算すると、カーネルPCAは、主成分を見つけるためにそれをグラム行列として扱います。

$ x_i $、$ i \ in {1、..、n}$を機能サンプルとします。 カーネル行列は、カーネル関数$ K(x_i、x_j)= \ langle \ phi(x_i)、\ phi(x_j)\rangle$によって定義されます。

人気のある選択肢は、動径カーネルです。

\ [K(x_i、x_j)= \ exp-\ gamma \ cdot d(x_i、x_j)\]

ここで、$d$は距離関数です。

カーネルPCAでは、距離を指定する必要がありました。 たとえば、数値の特徴については、ユークリッド距離を使用できます:$ d(x_i、x_j)= \ vert \ vert x_i-x_j \ vert \ vert ^2$。

数値以外の機能については、創造性を発揮する必要があるかもしれません。 覚えておくべきことの1つは、このアルゴリズムは距離をメトリックと見なしていることです。

Pythonを使用する場合、カーネルPCAはscikit-learnに実装されます。

カーネルPCA法の利点は、非線形データ構造をキャプチャできることです。

欠点は、データのノイズに敏感であり、距離とカーネル関数の選択が結果に大きく影響することです。

多次元尺度構成法(MDS)

多次元尺度構成法(MDS)は、サンプル間の距離をグローバルに保持しようとします。 このアイデアは非常に直感的で、距離行列でうまく機能します。

具体的には、特徴サンプル$ x_i $、$ i \ in {1、..、n}$および距離関数$d $が与えられた場合、新しい特徴サンプル$ z_i \ in \ mathbb {R} ^{q}$を計算します。 $ i \ in {1、..、n} $応力関数を最小化することにより:

\ [\ min_ {z_1、..、z_n} \ sum_ {1 \ leq i <j \ leq n}(d(x_i、x_j)-|| z_i --z_j ||)^ 2 \]

Pythonを使用する場合、MDSはscikit-learnに実装されます。 ただし、scikit-learnはサンプル外のポイントの変換をサポートしていません。これは、回帰モデルまたは分類モデルと組み合わせて埋め込みを使用する場合に不便になる可能性があります。 ただし、原則として可能です。

MDSの利点は、そのアイデアがフレームワークと完全に一致し、データのノイズの影響をあまり受けないことです。

欠点は、scikit-learnでの実装が非常に遅く、サンプル外の変換をサポートしていないことです。

ユースケース:出荷追跡

小さな熱帯の島のいくつかの集落は、地元の観光産業に応えるために小包輸送サービスを開発しました。 これらの集落の1つにいる商人は、競争に勝つために行動を起こすことを決定したので、島のすべての荷物の出荷を追跡する衛星監視システムを設置しました。 データが収集されると、商人はデータサイエンティスト(私たちです!)に電話して、次の質問に答えるのを手伝いました。現在進行中のパッケージの宛先を予測できますか?

データセットには、追跡された200の出荷に関する情報が含まれています。 追跡された出荷ごとに、パッケージが発見されたすべての場所の(x、y)座標のリストがあります。これは通常、20〜50回の観測値です。 以下のプロットは、このデータがどのように見えるかを示しています。

ユースケース:出荷追跡

このデータは問題のように見えます。実際には、2つの異なる種類の問題があります。

最初の問題は、私たちが扱っているデータが高次元であるということです。 たとえば、すべてのパッケージが50の場所で発見された場合、データのディメンションは100になります。これは、処分した200のサンプルと比較すると、かなりのように聞こえます。

2番目の問題:出荷ルートが異なれば、実際には観測数も異なるため、データを表形式で表すために座標を使用してリストを単純に積み重ねることはできません(たとえあったとしても、それでも実際には意味がありません)。

商人は指でテーブルをせっかちに叩き、データサイエンティストはパニックの兆候を見せないように一生懸命努力しています。

これは、距離行列と埋め込みが役立つ場所です。 2つの出荷ルートを比較する方法を見つける必要があります。 フレシェ距離は妥当な選択のようです。 距離があれば、距離行列を計算できます。

注:この手順には時間がかかる場合があります。 $ O(n ^ 2)$の距離を計算する必要があります。各距離には、$ O(k ^ 2)$の反復があります。ここで、$ n $はサンプルの数で、$k$は1つのサンプルの観測数です。 距離関数を効率的に書くことが重要です。 たとえば、Pythonでは、numbaを使用してこの計算を何倍も高速化できます。

埋め込みの視覚化

これで、埋め込みを使用して、次元の数を200からほんの数に減らすことができます。 交易路が少ないことがはっきりとわかるので、2次元または3次元でもデータの適切な表現を見つけたいと思うかもしれません。 前に説明した埋め込み(PCA、カーネルPCA、およびMDS)を使用します。

以下のプロットでは、ラベル付けされたルートデータ(デモンストレーションのために提供)と、2Dおよび3D(左から右)への埋め込みによるその表現を確認できます。 ラベル付けされたデータは、6つの交易路で接続された4つの交易所を示しています。 6つの貿易ルートのうち2つは双方向であり、合計8つの出荷グループ(6 + 2)になります。 ご覧のとおり、3D埋め込みを使用して、8つの出荷グループすべてをかなり明確に分離しました。

埋め込みの視覚化

これは良いスタートです。

モデルパイプラインへの埋め込み

これで、埋め込みをトレーニングする準備が整いました。 MDSは最良の結果を示しましたが、かなり遅いです。 また、scikit-learnの実装はサンプル外変換をサポートしていません。 研究では問題ありませんが、本番環境では問題になる可能性があるため、代わりにカーネルPCAを使用します。 カーネルPCAの場合、事前に動径カーネルを距離行列に適用することを忘れないでください。

出力次元の数をどのように選択しますか? 分析の結果、3Dでも問題なく動作することがわかりました。 安全のため、重要な情報を省略しないように、埋め込み出力を10Dに設定しましょう。 最高のパフォーマンスを得るには、出力次元の数をモデルのハイパーパラメーターとして設定し、相互検証によって調整することができます。

したがって、ほぼすべての分類モデルの入力として使用できる10個の数値特徴があります。 1つの線形モデルと1つの非線形モデルについてはどうでしょうか。たとえば、ロジスティック回帰と勾配ブースティングです。 比較のために、入力として完全距離行列を使用したこれら2つのモデルも使用してみましょう。 さらに、SVMもテストしてみましょう(SVMは距離行列を直接操作するように設計されているため、埋め込みは必要ありません)。

テストセットのモデル精度を以下に示します(モデルの分散を推定できるように、10個のトレインおよびテストデータセットが生成されました)。

  • 埋め込み(KernelPCA + GB)と組み合わせた勾配ブースティングが1位になります。 埋め込みなし(GB)の勾配ブースティングを上回りました。 ここで、カーネルPCAが有用であることが証明されました。
  • ロジスティック回帰は大丈夫でした。 興味深いのは、埋め込みなし(LR)のロジスティック回帰が埋め込みあり(KernelPCA + LR)よりも優れていることです。 これは完全に予想外ではありません。 線形モデルはあまり柔軟性がありませんが、過剰適合するのは比較的困難です。 ここで、埋め込みによって引き起こされる情報の損失は、入力の次元が小さいことの利点を上回っているようです。
  • 最後になりましたが、このモデルの差異は非常に重要ですが、 SVMも良好に機能しました。

モデルの精度

モデルの精度

このユースケースのPythonコードは、GitHubで入手できます。

結論

埋め込みとは何かを説明し、実際の問題を解決するために距離行列と組み合わせて使用​​する方法を示しました。 評決の時間:

埋め込みは、データサイエンティストが使用する必要があるものですか? 物語の両面を見てみましょう。

埋め込みを使用することの長所と短所

長所:

  • このアプローチでは、距離を定義できる限り、通常とは異なるデータ構造や複雑なデータ構造を処理できます。距離は、ある程度の知識、想像力、運があれば、通常は可能です。
  • 出力は低次元の数値データであり、簡単に分析、クラスター化、またはほとんどすべての機械学習モデルのモデル機能として使用できます。

短所:

  • このアプローチを使用すると、必然的にいくつかの情報が失われます。

    • 最初のステップで、元のデータを類似性マトリックスに置き換えるとき
    • 2番目のステップで、埋め込みを使用して次元を削減する場合
  • データと距離関数によっては、距離行列の計算に時間がかかる場合があります。 これは、効率的に記述された距離関数によって軽減される可能性があります。
  • 一部の埋め込みは、データのノイズに非常に敏感です。 これは、追加のデータクリーニングによって軽減される場合があります。
  • 一部の埋め込みは、ハイパーパラメータの選択に敏感です。 これは、注意深い分析またはハイパーパラメータ調整によって軽減される場合があります。

代替案:なぜ使用しないのか…?

  • 距離行列ではなく、データに直接埋​​め込みを使用しないのはなぜですか?
    データを直接効率的に効率的にエンコードできる埋め込みを知っている場合は、必ずそれを使用してください。 問題は、それが常に存在するとは限らないということです。
  • 距離行列でクラスター化を使用しないのはなぜですか?
    データセットをセグメント化することが唯一の目標である場合は、それでもまったく問題ありません。 一部のクラスタリング手法では、埋め込みも利用されます(たとえば、スペクトルクラスタリング)。 詳細については、クラスター化に関するチュートリアルをご覧ください。
  • 距離行列を特徴として使用しないのはなぜですか?
    距離行列のサイズは$(n_ {samples}、n_ {samples})$です。 すべてのモデルがそれを効率的に処理できるわけではありません。一部は過剰適合、一部は適合が遅い、一部は完全に適合しない可能性があります。 ここでは、線形モデルや正則化モデルなど、分散の小さいモデルが適しています。
  • 距離行列でSVMを使用しないのはなぜですか?
    SVMは優れたモデルであり、私たちのユースケースでうまく機能しました。 ただし、いくつかの注意点があります。 まず、他の機能(単純な数値の場合もあります)を追加したい場合、直接追加することはできません。 それらを類似性マトリックスに組み込む必要があり、貴重な情報が失われる可能性があります。 第2に、SVMと同様に、特定の問題に対して別のモデルがより適切に機能する場合があります。
  • ディープラーニングを使用してみませんか?
    確かに、どんな問題でも、十分に長く検索すれば、適切なニューラルネットワークを見つけることができます。 ただし、このニューラルネットワークの検索、トレーニング、検証、および展開のプロセスは、必ずしも単純なものではないことに注意してください。 したがって、いつものように、最善の判断を下してください。

一文で

複雑な非数値データを操作する場合、特にデータをベクトル空間に直接変換できず、モデルに低次元の入力を使用したい場合は、距離行列と組み合わせた埋め込みが非常に便利なツールです。