この投稿では、ディープラーニングのあまり知られていない応用分野である構造化データに焦点を当てます。この記事の著者は、サンフランシスコ大学 (USF) の大学院生である Kerem Turgutlu です。 この記事で説明した手順に従ってディープラーニング手法を使用して構造化データを処理すると、次のような利点があります。
機械学習/ディープラーニングやあらゆる種類の予測モデリングタスクでは、まずデータが来て、次にアルゴリズム/メソッドが来ます。これは、画像分類、NLP、その他多くの「非従来型」データ処理など、特定のタスクを解決する前に、一部の機械学習手法で多くの特徴エンジニアリングが必要になる主な理由でもあります。これらのデータは、ロジスティック回帰モデルやランダムフォレストモデルに直接入力して処理することはできません。対照的に、ディープラーニングは、複雑で時間のかかる特徴エンジニアリングを行わなくても、これらのタイプのタスクで優れたパフォーマンスを実現できます。ほとんどの場合、これらの機能にはドメイン知識、創造性、そして多くの試行錯誤が必要です。もちろん、ドメインの専門知識と巧みな特徴エンジニアリングは依然として非常に価値がありますが、この投稿で紹介したテクニックは、ドメインの知識がなくても Kaggle のコンペティションで上位 3 位に入るのに十分です。参照: http://blog.kaggle.com/2016/01/22/rossmann-store-sales-winners-interview-3rd-place-cheng-gui/ 図1: かわいい犬と怒った猫 特徴生成の複雑な性質と強力さ(CNN の畳み込み層など)により、ディープラーニングは画像、テキスト、音声データに関連するさまざまな問題に広く使用されてきました。これらの問題は間違いなく人工知能の発展にとって非常に重要であり、この分野のトップ研究者は毎年互いに競い合っており、猫、犬、船の分類などのタスクでは毎年前年よりも成績が向上しています。しかし、実際の業界でのアプリケーションでは、これがほとんど見られません。なぜでしょうか? 企業のデータベースには構造化されたデータが含まれており、それが私たちの日常生活を形作る分野です。 まず、構造化データを定義しましょう。構造化データでは、行は収集されたデータ ポイントまたは観測値、列は各観測値の個々の属性を表すフィールドと考えることができます。たとえば、オンライン小売店のデータには、顧客の取引イベントを表す列と、購入した商品、数量、価格、タイムスタンプなどの情報を含む列が含まれる場合があります。 以下に販売者のデータをいくつか示します。行は個々の販売イベントを表し、列はこれらの販売イベントに関する情報を示します。
次に、構造化データタスクにニューラル ネットワークを使用する方法について説明します。実際、理論上は、任意のアーキテクチャで完全に接続されたネットワークを作成し、「列」を入力として使用するのは簡単です。いくつかのドット積と損失関数によるバックプロパゲーションを実行すると、予測を行うことができるトレーニング済みのネットワークが得られます。 非常に単純でわかりやすいように見えますが、構造化データを扱う場合には、ニューラル ネットワークよりもツリーベースの方法が好まれることが多いです。それはなぜでしょうか? これは、アルゴリズムの観点から、つまりアルゴリズムがデータをどのように扱い、処理するかという観点から理解できます。 構造化データと非構造化データは、人によって処理方法が異なります。非構造化データは「非従来型」ですが、通常はピクセル、ボクセル、オーディオ周波数、レーダー後方散乱、センサー測定値などの単位量の単一のエンティティを扱います。構造化データに関しては、さまざまなデータ型を扱う必要があることがよくあります。これらのデータ型は、数値データとカテゴリデータの 2 つのカテゴリに分類されます。ニューラル ネットワークを含むほとんどのアルゴリズムではカテゴリ データを直接処理できないため、トレーニング前にカテゴリ データを前処理する必要があります。 変数をエンコードするためのオプションには、ラベル/値エンコードやワンホットエンコードなど、多数あります。しかし、これらの手法では、カテゴリ階層の記憶と現実的な表現に関して依然として問題が残っています。メモリの問題はより重大な場合があるので、例を使って説明しましょう。 コラムの情報は曜日であると仮定します。この変数にワンホットまたは任意のラベル エンコーディングを使用する場合は、各レベル間に等しく任意の距離/差があると想定する必要があります。
しかし、これらの方法は両方とも、2 日間の差が等しいと想定していますが、これは明らかに当てはまらないことはわかっており、アルゴリズムもこれを認識している必要があります。 「ニューラルネットワークの連続的な性質により、カテゴリ変数への適用が制限されます。したがって、整数として表されるカテゴリ変数にニューラルネットワークを直接適用すると、良い結果は得られません。」[1] ツリーベースのアルゴリズムでは、各状態を見つけるために必要に応じて分岐できるため、カテゴリ変数が連続していると想定する必要はありませんが、ニューラル ネットワークの場合はそうではありません。エンティティの埋め込みは、この問題の解決に役立ちます。エンティティ埋め込みを使用すると、離散値を、同様の関数出力を持つ値が互いに近くなる多次元空間にマッピングできます。たとえば、売上の問題のために州を国の空間に埋め込むと、類似した州の売上はこの投影された空間内でより近くなります。 カテゴリ変数の階層については仮定を立てたくないので、ユークリッド空間で各カテゴリのより適切な表現を学習します。この表現は単純で、ワンホットエンコーディングと学習可能な重みのドット積に等しくなります。 埋め込みは、各単語をベクトルとして表現できる NLP の分野で非常に幅広く応用されています。 Glove と word2vec は 2 つの有名な埋め込み方法です。図4[2]から埋め込みの威力が分かります。これらのベクターは、目的に合っている限り、自由にダウンロードして使用できます。実際、ベクターに含まれる情報を表現するには最適な方法です。 埋め込みはさまざまなコンテキスト(教師ありおよび教師なしの両方の方法)で使用できますが、私たちの主な目標は、カテゴリ変数に対してこのマッピングを実行する方法を理解することです。 エンティティの埋め込み 「エンティティ埋め込み」の呼び方は人それぞれですが、単語埋め込みで見たユースケースとそれほど違いはありません。結局のところ、私たちが関心を持っているのは、グループ化されたデータの高次元ベクトル表現を持つことだけです。これらのデータは、単語、曜日、国などです。単語埋め込みからメタデータ埋め込み (この場合はカテゴリ) へのこの変換により、Yoshua Bengio らは、通常では勝つことが不可能な単純な自動アプローチを使用して、2015 年の Kaggle コンテストで優勝することができました。参考: https://www.kaggle.com/c/pkdd-15-predict-taxi-service-trajectory-i 「顧客ID、タクシーID、日時情報からなる個別のメタデータを処理するために、モデルを使用して、これらの各情報の埋め込みを共同で学習します。このアプローチは、各単語が固定サイズのベクトル空間(単語埋め込みと呼ばれる)にマッピングされる自然言語モデリング手法[2]に触発されています。[3] ニューラル ネットワークでこれらの機能を学習する方法を段階的に説明します。完全に接続されたニューラル ネットワークを定義し、数値変数とカテゴリ変数を個別に処理します。 各カテゴリ変数について: 1. ランダム埋め込み行列mxDを初期化します。
図6: 埋め込み行列 2. 次に、ニューラル ネットワークを通過するたびに、埋め込み行列内の特定のラベル (「dow」の場合は Monday など) を検索し、1xD ベクトルを生成します。 図7: 検索後の埋め込みベクトル 3. この 1×D ベクトルを入力ベクトル (数値ベクトル) に追加します。このプロセスは、各特定の行を検索することによって取得される各クラスの埋め込みベクトルを追加する行列拡張と考えることができます。 4. バックプロパゲーションを実行する際に、損失関数を最小化するために、これらの埋め込みベクトルを勾配方式で更新します。 入力は通常は更新されませんが、埋め込み行列の場合は、勾配をこれらのマップされた特徴に戻し、最適化するという特別なケースがあります。 これは、反復ごとにカテゴリ埋め込みがより適切に表現されるプロセスと考えることができます。 注: 経験則として、カーディナリティがそれほど高くないカテゴリは保持する必要があります。変数の特定のレベルが観測値の 90% を占める場合、その変数は予測値が高くないため、避けた方がよい場合があります。 良いニュース 埋め込みベクトルの検索を実行し、requires_grad=True を許可してそれらを学習することで、上記のアーキテクチャをお気に入りのフレームワーク (できれば動的フレームワーク) に実装できます。しかし、Fast.ai はこれらすべてのステップとそれ以上を達成しました。このライブラリは、構造化ディープラーニングを容易にするだけでなく、差分学習率、SGDR、循環学習率、学習率の検出など、最先端の機能を多数提供します。これらは私たちが活用できる機能です。これらのトピックの詳細については、次のブログをご覧ください。
Fast.aiを使用して実装 このセクションでは、上記の手順を実装し、構造化データをより効率的に処理できるニューラル ネットワークを構築する方法について説明します。 ここでは、人気のある Kaggle コンペティションを見てみましょう: https://www.kaggle.com/c/mercari-price-suggestion-challenge/。これは、データが主にカテゴリであり、カーディナリティがかなり高く (高すぎず)、それ以外にはあまりないため、エンティティ埋め込みに非常に適した例です。 データ: 約140万行
重要な注意: 最適なモデル パラメータはすでにわかっているので、この例では検証セットは含めませんが、ハイパーパラメータを調整するには検証セットを使用する必要があります。 ステップ1: 欠損値自体も重要な情報なので、欠損値をレイヤーとして追加します。
ステップ2: ニューラル ネットワークは正規化されたデータを好むため、データを前処理し、数値列を比例してスケーリングします。データをスケーリングしないと、すべてがドット積と勾配になるため、ネットワークは 1 つの機能に集中しすぎる可能性があります。トレーニング統計に応じてトレーニング データとテスト データの両方をスケーリングする方がよいでしょうが、これはあまり重要ではありません。これは各ピクセルの値を 255 で割るのと同じです。 同じレイヤーに同じエンコーディングを適用したいので、トレーニング データとテスト データを組み合わせました。
ステップ3: モデル データ オブジェクトを作成します。パスは、Fast.ai がモデルとアクティベーションを保存する場所です。
ステップ4: D (埋め込みの次元) を決定します。cat_sz は、各カテゴリ列のタプル (col_name、cardinality+1) のリストです。
ステップ5: Fast.ai ライブラリのコア オブジェクトである学習者を作成します。
ステップ6: この部分については、先ほど触れた他の記事でさらに詳しく説明しています。 Fast.ai を活用してください。 損失が大きくなり始める前のある時点で、学習率を選択する必要があります...
フィッティング わずか 3 エポック後に次の結果が得られることがわかります。
よりフィット
その他にもいろいろ…
したがって、ほんの数分で、それ以上のアクションをとらなくても、これらのシンプルだが効果的な手順により、上位 10% 程度に入ることができます。本当に高い目標がある場合は、item_description 列を使用して、それを複数のカテゴリ変数として使用することをお勧めします。次に、エンティティの埋め込みに作業を実行させます。もちろん、スタッキングと組み合わせも忘れないでください。 参考文献
|
<<: Google エンジニア: AI テクノロジーにより、5 年以内に人間とコンピューターの会話が実現する
>>: Panda Eats SMS: 機械学習に基づく新しいスパムフィルタリングアプリ
自動運転前夜2021年、ビル・ゲイツは「すべての家庭にロボットを」と題する記事を発表し、爆弾処理ロボ...
写真を撮り、テキストコマンドを入力すると、携帯電話が自動的に写真の編集を開始しますか?この魔法のよう...
人工知能は、すべての人の生活に欠かせないものとなっています。 YouTube のおすすめなどの単純な...
[[211015]]現在、TensorFlow のメジャーバージョンは 1.3 にアップグレードさ...
まとめTaobao や Tmall などの電子商取引プラットフォームでは、検索エンジン最適化 (SE...
メタバースの概念がますます普及するにつれて、さまざまな業界がこの豊かな土地を探索し始めました。多くの...
6月22日、2021NIDIアジェンダ中国新小売・デジタルイノベーションサミットが上海で盛大に開催さ...
近年、自然言語処理における事前トレーニングは研究分野でホットな話題となっており、有名なGPT-3も新...
[[244078]]コンピュータサイエンスには多くの用語があり、それらの多くは一貫して使用されてい...
スティーブ・ジョブズが解雇されてから王として復帰するまでに12年かかりましたが、サム・アルトマンの場...