ElasticsearchとTasteプラグインで作るレコメンドシステム

23
ElasticsearchTasteプラグインで作る レコメンドシステム 白ヤギ勉強会(16)

Transcript of ElasticsearchとTasteプラグインで作るレコメンドシステム

Page 1: ElasticsearchとTasteプラグインで作るレコメンドシステム

ElasticsearchとTasteプラグインで作る レコメンドシステム

白ヤギ勉強会(第16回)

Page 2: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

■ 名前: 菅谷信介■ 所属: N2SM, Inc.■ オープンソース活動:

• Apache Portals (Jetspeed2) コミッタ• Codehausコミッタ • Seasar Projectコミッタ• CodeLibsプロジェクト運営              などなど・・・

■ Blog: http://www.chazine.com/■ Twitter: https://twitter.com/shinsuke_sugaya/

自己紹介

2

Page 3: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

アジェンダ

■ 概要➜ Elasticsearchとは➜ Mahoutとは

■ Tasteプラグインとは■ 今後対応したいこと■ まとめ

3

Page 4: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

概要ElasticsearchとMahout

4

Page 5: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

Elasticsearchとは

5

■ OSSの分散リアルタイム検索&分析エンジン

➔ Luceneベースの全文検索ができるシステム

➔ ドキュメント指向なデータ操作が可能

➔ 簡単に分散環境(クラスタ)を構築できる

➔ プラグインで機能を拡張できる

◆ ネイティブなプラグイン (Tasteプラグインはコレ)◆ サイトプラグイン

➔ 処理を実行する機能(River)を提供(廃止予定)

弊社(N2SM)ではElasticsearchやFess/Solrなどの検索システム構築支援サービスを提供していますhttp://www.n2sm.net/services/search-support.html

Page 6: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

Mahoutとは

6

■ 機械学習アプリを作るための環境を提供

➜ 2015/4に0.10.0リリース

■ 機械学習に関する様々な実装を提供している

■ 近頃はScala向けのSamsaraを提供

➜ MapReduceはやめて、Sparkにシフトしてきている

■ レコメンドはTasteフレームワークとして提供

Page 7: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

Mahout Tasteとは

7

■ レコメンドエンジン・協調フィルタリング

のフレームワーク

➜ DataModel➜ UserSimilarity➜ ItemSimilarity➜ UserNeighborhood➜ Recommender

■ JavaのAPIを呼び出して、JavaやJavaEEアプリから呼び出して利用する

Page 8: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

Mahoutの問題点

8

■ どこを目指しているのかがわからない・・・

➜ MapReduceからSparkへ➜ JavaからScalaへ

✓ これら自体は良いと思うのだが、プロジェクトとし

ては場当たり的な対応をしている感じが強い

■ 導入できるマーケットがない・・・

➜ 大企業はHadoopはあるけど、Mahout使わないでも

自分たちで解決できる

➜ 中小企業はHadoop入れてまでMahoutを使う動機

がない

Mahoutは個別に見れば良いものもあるが…

Page 9: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

そのあたりの課題を解決していくためにも…

9

Page 10: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

ElasticsearchTaste Plugin

10

Page 11: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

Tasteプラグインとは

11

■ Mahout Tasteをベースのレコメンド機能

➜ Taste部分のソースコードをフォークしている

➜ Elasticsearchのスケールのしやすさを活かす

■ 利用者/商品/嗜好データ管理

■ 情報をElasticsearchのインデックスで管理

■ 利用者/商品ベースのレコメンド

■ 類似利用者の算出

■ テキストレコメンド (タームベクターの情報を利用)■ Pluggableな実装

Page 12: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

Index

データ構造

12

■ 利用者(User)、商品(Item)、嗜好(Preference)をElasitcsearchのIndexのTypeごとに管理する

■ UsersとItemsには任意のデータも登録可能

Preferences

user_iditem_idvalue@timestamp

longlongfloatdate

Users

user_idsystem_id@timestamp(any)

longstringdate(any)

Items

item_idsystem_id@timestamp(any)

longstringdate(any)

Page 13: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

データ登録

13

■ レコメンドに利用されるデータは「利用者(U001)が商品

(I001)に評価(5)を与える」ようなものを想定

■ 利用者、商品、嗜好の3つのTypeに個別に登録するこ

とも可能だが、Tasteプラグインでは1リクエストで登録

可能なAPI(_taste/event)を提供

$ curl -XPOST localhost:9200/インデックス名/_taste/event -d '{ "user":{"id":"U001"}, "item":{"id":"I001"}, "value":5, "timestamp":"2014/01/01 00:00:00" }'

Page 14: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

商品レコメンド

14

■ 同じ評価の利用者からの商品をレコメンド

■ TasteのUserBasedRecommenderを利用

➜ ItemBasedRecommenderによる方法も提供

■ 利用方法

■ 〜Factoryにより類似利用者の計算を差し替え可能

$ curl -XPOST localhost:9200/_taste/action/recommended_items_from_user -d '{ "num_of_items": 10, "index_info": { "index": "movielens" } }'

Page 15: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

商品レコメンドの評価

15

■ 平均二乗誤差などを簡単に確認できる

■ TasteのEvaluatorを利用$ curl -XPOST localhost:9200/_taste/action/evaluate_items_from_user -d '{ "evaluation_percentage": 1.0, "training_percentage": 0.9, "margin_for_error": 1.0, "index_info": { "index": "movielens" }, "neighborhood": { "factory": "org.codelibs.elasticsearch.taste.neighborhood.NearestNUserNeighborhoodFactory", "neighborhood_size": 100 }, "evaluator": { "id": "movielens_result", "factory": "org.codelibs.elasticsearch.taste.eval.RMSEvaluatorFactory" }}'

Page 16: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

類似利用者

16

■ 同じ評価の類似する利用者を取得

■ TasteのNeighborhoodを利用

■ 利用方法

■ 〜Factoryにより計算方法を差し替え可能

$ curl -XPOST localhost:9200/_taste/action/similar_users -d '{ "num_of_users": 10, "data_model": { "cache": { "weight": "100m" } }, "index_info": { "index": "movielens" }}'

Page 17: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

テキストレコメンド

17

■ 利用者/商品/嗜好→ドキュメント/ターム/出現数として、協

調フィルタリングによるドキュメントのレコメンド

■ Elasticsearch(Lucene)のタームベクター情報を用いて、

テキスト文書をベクトル化する

curl -XPOST localhost:9200/_taste/action/generate_term_values?pretty -d '{ "source": { "index": "ap", "type": "article", "fields": ["description"] }, "event": { "index": "ap_term", "user_type": "doc", "item_type": "term", "preference_type": "preference" }}'

Page 18: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

拡張ポイント (その1)

18

■ DataModelに対する利用者または商品の絞り込み

■ 差し替え可能な機能

➜ Recommender✓ UserBasedRecommender✓ ItemBasedRecommender

➜ Neighborhood✓ NearestNUserNeighborhood✓ ThresholdUserNeighborhood

"neighborhood": { "factory": "org.codelibs.elasticsearch.taste.neighborhood.NearestNUserNeighborhoodFactory", "neighborhood_size": 100 }

使用例

Page 19: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

拡張ポイント (その2)

19

➜ Similarity✓ CityBlockSimilarity✓ LogLikelihoodSimilarity✓ SpearmanCorrelationSimilarity✓ TanimotoCoefficientSimilarity✓ EuclideanDistanceSimilarity✓ PearsonCorrelationSimilarity✓ UncenteredCosineSimilarity

➜ Evaluator✓ RMSEvaluator✓ AverageAbsoluteDifferenceEvaluator

Page 20: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

今後対応したいこと

20

■ 分散処理化

➜ Elasticsearchのクラスタ内通信を利用して、計算を

分散処理をしたい

➜ Riverが廃止になるので、適切な運用方法の提供

■ 交差検定等での評価方法の強化

■ Bulk APIの対応

Page 21: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

まとめ

21

Page 22: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

■ Mahoutの課題について➜ TasteをElasticsearch上で実現することで、簡単に

導入できるようにする■ Tasteプラグインについて➜ 商品レコメンド➜ 類似利用者➜ テキストレコメンド

■ 今後対応したいこと➜ 分散処理化➜ バルクAPI対応

まとめ

22

Page 23: ElasticsearchとTasteプラグインで作るレコメンドシステム

白ヤギ勉強会(第16回)

Q&A

23