「TalkingData AdTracking Fraud Detection Challenge」コンペのディスカッションで、なんでNNでEntity Embedding使っているの?という質問がありました。
そこでおすすめされていた論文を読んだのでメモします。
タイトルは、「Entity Embeddings of Categorical Variables」
導入
- unstructuredなデータを扱う問題に対して、NNはよい結果を残してきましたが、structuredなデータを扱う問題に対しては、decision treeベースのアルゴリズムが優勢のようです
- これは、NNは、非連続な関数を扱うのに向いていないためと思われます(back propできないから?)
- categoricalな変数に対しては、OHE(One Hot Encoding)がよく使われていますが、欠点としてはリソースを大量に使うことと、値間の関連性を表現できないことです。(直交表現だから?)
- そこで、NLPで使われているword embedding(Word2Vecとかの)をcategoricalな変数に適用してみます
- word embeddingの特徴は、似通った語句は似たような値になるのに加えて、演算できること: King - Queen ≂ Man - Woman
- これによって、値の近さが表現できるようになることを期待 -> 連続関数になってNNにうれしい?
比較対象
- GBT: Gradient Boosted Trees
- structured data系Kaggleコンペで強いやつ
- 領域を分けながら、greedyにカテゴリ分けを進めていく
- 領域の大きさをどのくらいにするかを決めるのがコツ
- structured dataについて
- norminal vs cardinal
- norminalは名目の値 ← red,gree,blueに1,2,3と振るとか数値間の計算に意味がないもの
- cardinal or ordinal は比較とか計算できる値 ← 年齢とか
Entity Embedding(EE)
- 離散値を複数次元空間に展開する処理です
- 重み行列とOHEの積で計算
- それぞれの変数に対してEEを求め、そのままfull connectedのレイヤにつなげていく(concatと呼んでいるのがこれ?)
実験(Kaggleでの例)
- 店情報、日付からの売り上げを予測する問題にEEを適用してみました
- Tips: 日付に祝日とか学校休日とか、スポーツイベント日かとか、Google Trendと連携させたりする人もいましたが、ここでは、EEなしと比較するためにシンプルな状態(もとのデータのみ)で取り組みます
- 売上は桁4つ違うので、 log(Sale)/ log(Salemax) でスケーリングしました
- 結果的にNNに適用したものが最も良好だったが、どの手法にEEを適用しても大きな効果が見られました
分析
- t-SNEで平面に店をマップしたら、なんと地理的な位置関係とそっくりだった!
- これは既知のクラスタリングアルゴリズムが適用できることを示唆しているのでは?
カテゴリかるなデータは、One Hot一択だと思ってました。
シンプルで、リソースも少なくて済み、性能もよくなるとはいいことずくめ!