Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Sparkでレコメンドエンジンを作ってみた

SparkのMLlibを使ってレコメンドエンジンを作ってみました。

  • Login to see the comments

Sparkでレコメンドエンジンを作ってみた

  1. 1. Sparkでレコメンドエンジン を作ってみた 藤田 真太郎 1
  2. 2. 目次  なぜレコメンドエンジンを作ろうと思ったか  レコメンドエンジンの実装方法  環境  結果  デモ  分かったこと・苦労したこと  次にやりたいこと 2
  3. 3. なぜレコメンドエンジンを作ろうと思っ たか 木内さんからの一言 「協調フィルタリングをSpark MLlibで実装してみましょう。」 「あなたへのおすすめ」みたいなもの 3
  4. 4. レコメンドエンジンの実装方法  ルールベース  コンテンツベース  協調フィルタリング (この方法で実装) アイテムベース・ユーザーベース・ALS など  アソシエーション分析 など… 4 人間が手作業で行う コンピュータ で計算する
  5. 5. レコメンドエンジンの実装方法 Apache Spark の MLlib にある ALS (交互最小二乗法)を使う。 評価行列 (元データ) 商品 特徴行列 ユーザ 特徴行列 ALS 評価行列 (中間データ) 予測された 5
  6. 6. 環境  Softlayer上の仮想マシン  CentOS6  Apache Spark 1.3.1 (最新は1.4.0)  Scala 2.11.5 (推奨は2.10.x) 6
  7. 7. 結果 サンプルデータの評価行列から、評価値を予測した評価行列 を作ることができた。(ちゃんと動いた) その評価行列からユーザと商品のIDを指定することにより 対応する予測した評価値を参照することができた。 7
  8. 8. デモ 8 1 2 3 4 1 5.0 1.0 5.0 1.0 2 5.0 5.0 1.0 3 1.0 5.0 1.0 5.0 4 1.0 5.0 5.0 商品ID ユーザID
  9. 9. デモ 9 1 2 3 4 1 5.0 1.0 5.0 1.0 2 5.0 5.0 1.0 3 1.0 5.0 1.0 5.0 4 1.0 5.0 5.0 商品ID ユーザID ユーザ2 と ユーザ1 は似たような評価をつけているので ユーザ2 は 商品2 の評価を 1.0くらいにすると予想される。 また ユーザ4 は ユーザ3と似ているので ユーザ4 は 商品3に1.0くらいで評価をすると予想される。
  10. 10. 10 1.交互最小二乗法を使い、評価行列を予測する。 すごくたくさんのログが出る。 testml.jar は https://spark.apache.org/docs/latest/mllib-collaborative-filtering.html のサンプルコードをコンパイルしたもの。 # spark-submit testml.jar 2.評価値を確認するスクリプトと結果 # ./result.sh Please input userID productID: 2 2 ~ ログ ~ Rating: 0.988170663317684
  11. 11. 11 result.shのソースコード re.jar のソースコード #!/bin/sh read -p "Please input userID productID: " IDs echo "$IDs" > result.conf spark-submit re.jar > re.log rm -rf myModel echo " " echo "Rating: `head -1 re.log`" import org.apache.spark.mllib.recommendation.ALS import org.apache.spark.mllib.recommendation.MatrixFactorizationModel import org.apache.spark.mllib.recommendation.Rating import org.apache.spark.SparkConf import org.apache.spark.SparkContext import scala.io.Source import java.io.File object testml { def main(args: Array[String]) { val conf = new SparkConf().setAppName("example") val sc = new SparkContext(conf) val model = MatrixFactorizationModel.load(sc, "myModelPath") val line = Source.fromFile("./result.conf").mkString line.split(" ") val userid = line(0).toString.toInt val productid = line(2).toString.toInt val rating = model.predict(userid, productid) println(rating); model.save(sc, "myModel") sc.stop } }
  12. 12. 分かったこと・苦労したこと  ALSは特徴行列を計算するときにランダム値を使う部分が あり、計算するたびに予測結果が微妙に異なる。(評価結 果には影響しない)  中間データは上書きしてくれない。  Scala は奥が深い。 12
  13. 13. 次にやりたいこと  サンプルデータは小さいのでもう少し大きなデータで協調 フィルタリングをかけてみたい。 13
  14. 14. 参考資料 14 協調フィルタリングのサンプルコード https://spark.apache.org/docs/latest/mllib-collaborative-filtering.html IDを指定して評価値を取り出すコマンド[predict(user: Int, product: Int)] https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.mllib.recommendation.MatrixFactorizationModel Scalaのコンパイル方法 http://www.ne.jp/asahi/hishidama/home/tech/scala/spark/submit.html

×