https://codeascraft.com/2014/11/17/personalized-recommendations-at-etsy/
1 comment | 0 points | by WazanovaNews 約5時間前 edited
Etsyのレコメンデーションエンジンが、同社がオープンソースとして提供している機械学習パッケージ Conjecture (Scalding DSL + Hadoop)に追加されました。大まかな仕組みについては下記の通りです。
作業としては、まず過去データを利用したユーザの興味度合いのマトリックスをつくりモデル化し、次に ユーアごとに興味度合いが最大となるアイテムのセットを見つけるレコメンデーションの計算をする。
データソースとしては数段階のレビューデータではなく、商品アイテムに対するユーザの実際のアクション(お気に入りボタンが押されたか、もしくは購入されたかなど)のデータでバイナリマトリックスを作成している。例えば、あるユーザのお気に入りアイテムには「1」、そうでないものには「0」が適用される。(参考マトリックス)
ユーザとアイテムの相性を低次元モデルで解析。ユーザ軸とアイテム軸それぞれで、「洋服」「特定の模様」「背景色が茶色」などの要素を見つける。例えば、ユーザのCoreyさんとある特定の棚の相性のスコアは、ユーザ / アイテムそれぞれにとっての、「棚(が好きか or であるか)」「幾何学模様(が好きか or であるか)」という係数を掛け合わせて足すことで計算できる。
- Coreyさんの「棚が好き」が0.1、「幾何学模様が好き」が0.8
- ある棚の商品アイテムの「棚であるか」が0.9、「幾何学模様であるか」0.1
の場合、計算式は 0.1*0.9 + 0.8*0.1 = 0.17 となる。(参考図)
バイナリマトリックスで「0」が適用されたものは、興味がないとは限らず、まだ閲覧してないだけかもしれない。よって、この論文(PDFファイル)を参考に、ゼロでないデータにゼロのデータよりも重きを置いている。このような取組みにより再構築されるマトリックスにおいては、あるユーザにとってゼロであったところにプラスの数が入る場合がある。興味を示したアイテムと似たようなベクターのものに網をかけることができるからである。
各ユーザのマトリックスとアイテムのマトリックスを交互に重み付けをしてエラーを排除することを繰り返し、モデル全体の最適化をする。このメソッドについては、Rを使ったデモを参照されたし。また、本番環境でも使えるMapReduceのコードはこちら。
上記のメソッドでは時間がかかることがあるので、更にStochastic SVDをファンクションとして実装し、任意のScalding Hadoop MapReduceのジョブから呼び出せるようにした。しかし、重み付けによるエラー排除の作業には向かない。気の利いた正規直交構造のマトリックスをつくれるので、新規ユーザのベクターを構築するにはよい。また、お気に入り以外の切り口、例えばユーザが作成するお宝リストを使ったベクター構築に使えるので、お薦めアイテムにバラエティをもたせることができる。
レコメンデーションの計算における候補アイテムの選定には、局所性鋭敏型ハッシュを使っている。ユーザとアイテムのベクターのスペースをハッシュのバケットに分けて、ユーザごとに同じバケットにマップされたアイテム群を取り出す。(参考図)実装しているコードはこちら。
クオリティ向上のため、いくつか独自の工夫をした。
- 人気アイテムが必要以上に多くのユーザにレコメンドされないように、レコメンデーションの計算前にベクターを正規化。
- 多くの出品者を公平に扱うために、ユーザあたりにレコメンドされる同一出品者のアイテム数を制限。
- レコメンデーションにバラエティをもたせるために、候補アイテムの内から、より高いランキングのアイテムに似ている性質(局所性型ハッシュ分析における距離が近い)のものをフィルタリングしている。
- 局所性型ハッシュ分析によりユーザ間の類似性も判断し、同じような嗜好のユーザへのレコメンドアイテムリストを参考に他のユーザのリストの再計算をしている。更なる検証は必要だが、概ねレコメンドの精度はあがる。
#etsy