ElasticsearchとTasteプラグインで作るレコメンドシステム
-
Upload
shinsuke-sugaya -
Category
Technology
-
view
443 -
download
2
Transcript of ElasticsearchとTasteプラグインで作るレコメンドシステム
ElasticsearchとTasteプラグインで作る レコメンドシステム
白ヤギ勉強会(第16回)
白ヤギ勉強会(第16回)
■ 名前: 菅谷信介■ 所属: N2SM, Inc.■ オープンソース活動:
• Apache Portals (Jetspeed2) コミッタ• Codehausコミッタ • Seasar Projectコミッタ• CodeLibsプロジェクト運営 などなど・・・
■ Blog: http://www.chazine.com/■ Twitter: https://twitter.com/shinsuke_sugaya/
自己紹介
2
白ヤギ勉強会(第16回)
アジェンダ
■ 概要➜ Elasticsearchとは➜ Mahoutとは
■ Tasteプラグインとは■ 今後対応したいこと■ まとめ
3
白ヤギ勉強会(第16回)
概要ElasticsearchとMahout
4
白ヤギ勉強会(第16回)
Elasticsearchとは
5
■ OSSの分散リアルタイム検索&分析エンジン
➔ Luceneベースの全文検索ができるシステム
➔ ドキュメント指向なデータ操作が可能
➔ 簡単に分散環境(クラスタ)を構築できる
➔ プラグインで機能を拡張できる
◆ ネイティブなプラグイン (Tasteプラグインはコレ)◆ サイトプラグイン
➔ 処理を実行する機能(River)を提供(廃止予定)
弊社(N2SM)ではElasticsearchやFess/Solrなどの検索システム構築支援サービスを提供していますhttp://www.n2sm.net/services/search-support.html
白ヤギ勉強会(第16回)
Mahoutとは
6
■ 機械学習アプリを作るための環境を提供
➜ 2015/4に0.10.0リリース
■ 機械学習に関する様々な実装を提供している
■ 近頃はScala向けのSamsaraを提供
➜ MapReduceはやめて、Sparkにシフトしてきている
■ レコメンドはTasteフレームワークとして提供
白ヤギ勉強会(第16回)
Mahout Tasteとは
7
■ レコメンドエンジン・協調フィルタリング
のフレームワーク
➜ DataModel➜ UserSimilarity➜ ItemSimilarity➜ UserNeighborhood➜ Recommender
■ JavaのAPIを呼び出して、JavaやJavaEEアプリから呼び出して利用する
白ヤギ勉強会(第16回)
Mahoutの問題点
8
■ どこを目指しているのかがわからない・・・
➜ MapReduceからSparkへ➜ JavaからScalaへ
✓ これら自体は良いと思うのだが、プロジェクトとし
ては場当たり的な対応をしている感じが強い
■ 導入できるマーケットがない・・・
➜ 大企業はHadoopはあるけど、Mahout使わないでも
自分たちで解決できる
➜ 中小企業はHadoop入れてまでMahoutを使う動機
がない
Mahoutは個別に見れば良いものもあるが…
白ヤギ勉強会(第16回)
そのあたりの課題を解決していくためにも…
9
白ヤギ勉強会(第16回)
ElasticsearchTaste Plugin
10
白ヤギ勉強会(第16回)
Tasteプラグインとは
11
■ Mahout Tasteをベースのレコメンド機能
➜ Taste部分のソースコードをフォークしている
➜ Elasticsearchのスケールのしやすさを活かす
■ 利用者/商品/嗜好データ管理
■ 情報をElasticsearchのインデックスで管理
■ 利用者/商品ベースのレコメンド
■ 類似利用者の算出
■ テキストレコメンド (タームベクターの情報を利用)■ Pluggableな実装
白ヤギ勉強会(第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)
白ヤギ勉強会(第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" }'
白ヤギ勉強会(第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" } }'
白ヤギ勉強会(第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" }}'
白ヤギ勉強会(第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" }}'
白ヤギ勉強会(第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" }}'
白ヤギ勉強会(第16回)
拡張ポイント (その1)
18
■ DataModelに対する利用者または商品の絞り込み
■ 差し替え可能な機能
➜ Recommender✓ UserBasedRecommender✓ ItemBasedRecommender
➜ Neighborhood✓ NearestNUserNeighborhood✓ ThresholdUserNeighborhood
"neighborhood": { "factory": "org.codelibs.elasticsearch.taste.neighborhood.NearestNUserNeighborhoodFactory", "neighborhood_size": 100 }
使用例
白ヤギ勉強会(第16回)
拡張ポイント (その2)
19
➜ Similarity✓ CityBlockSimilarity✓ LogLikelihoodSimilarity✓ SpearmanCorrelationSimilarity✓ TanimotoCoefficientSimilarity✓ EuclideanDistanceSimilarity✓ PearsonCorrelationSimilarity✓ UncenteredCosineSimilarity
➜ Evaluator✓ RMSEvaluator✓ AverageAbsoluteDifferenceEvaluator
白ヤギ勉強会(第16回)
今後対応したいこと
20
■ 分散処理化
➜ Elasticsearchのクラスタ内通信を利用して、計算を
分散処理をしたい
➜ Riverが廃止になるので、適切な運用方法の提供
■ 交差検定等での評価方法の強化
■ Bulk APIの対応
白ヤギ勉強会(第16回)
まとめ
21
白ヤギ勉強会(第16回)
■ Mahoutの課題について➜ TasteをElasticsearch上で実現することで、簡単に
導入できるようにする■ Tasteプラグインについて➜ 商品レコメンド➜ 類似利用者➜ テキストレコメンド
■ 今後対応したいこと➜ 分散処理化➜ バルクAPI対応
まとめ
22
白ヤギ勉強会(第16回)
Q&A
23