読者です 読者をやめる 読者になる 読者になる

AMP Campをひと通りさらってみる:第4回 Movie Recommendation with MLlib

これ順番が動画順なので、厳密にはAMP CampのWebページのメニュー順番とは異なっていますね。。。第4回目はMLlibで一応自分の中では本丸です。

Movie Recommendation with MLlibのメモ

  • MovieLensのデータを使ったMLlibのサンプル

Data set

Collaborative filtering

  • 協調フィルタリングの説明
    • 色々あるけど、好みにまつわる隠れた要因を見つけ出す手法の一つであるALS(Alternating Least Squares)をMLlibは実装しているのでそれを利用する

Create training examples

  • 自分の評価結果を作成するPythonスクリプトが用意されていてそれを利用する
    • 推薦に使われる

Setup

  • まずはじめにSparkConfを作成
  • ratingを読み込むためにSparkContextを作成
  • ratingを(Int, Ratingオブジェクト)のペアに分解
    • timestampの数値をランダムなキーとして保持
    • Ratingオブジェクトはタプルのラッパー
  • ratingと同じようにmovieのidとタイトルを取得している
    • 読み込んで、splitしたものをcollectして集めて、map化している。

Running the program

  • ratingのレコード数、ユニークユーザー数などの項目を取得するコードを追加
  • sbtでビルドして、spark-submitで動かす

自分のパスだと以下の様な感じで

$ cd machine-learning/scala
$ ../../spark/bin/spark-submit --class MovieLensALS target/scala-2.10/movielens-als-assembly-0.1.jar ../../data/movielens/medium ../personalRatings.txt

Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
15/01/03 00:39:02 INFO Slf4jLogger: Slf4jLogger started
15/01/03 00:39:02 INFO Remoting: Starting remoting
15/01/03 00:39:03 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://sparkDriver@192.168.0.6:56004]
15/01/03 00:39:03 INFO Remoting: Remoting now listens on addresses: [akka.tcp://sparkDriver@192.168.0.6:56004]
2015-01-03 00:39:03.976 java[32045:1903] Unable to load realm info from SCDynamicStore
15/01/03 00:39:04 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
15/01/03 00:39:04 WARN LoadSnappy: Snappy native library not loaded
15/01/03 00:39:04 INFO FileInputFormat: Total input paths to process : 1
15/01/03 00:39:05 INFO FileInputFormat: Total input paths to process : 1
Got 1000209 ratings from 6040users on 3706 movies.

という感じで準備オッケー

Splitting training data

  • データをtraining, test, validationに分ける
    • そのためにtimestampを使ったランダムなキーを残しておいた

Training using ALS

  • rankとlambdaというパラメータが重要
    • だけど時間の都合上8パターン(rank2パターン、lambda2パターン、繰り返し回数2パターンの組み合わせ23=8パターン)で試す
    • RMSEが最小のものを良いモデルとして選択

Recommending movies for you

  • 事前に作成した自分のレーティングを基にオススメの映画をレコメンド

Comparing to a naive baseline

  • ratingの平均をbaselineとしてどれだけ改善したか

Augmenting matrix factors

  • もし興味をもったらMatrixFactorizationModelの実装を見てみましょうね

ALSの参考

レコメンドも前職の途中までは真面目に勉強していましたが約2年くらいブランクがあるので色々おさらいが必要そうです。。。

動画のメモ


AMP Camp 5: MLlib - Ameet Talwalkar - YouTube

  • MLlibの紹介
    • MLlib自体はともかく、MLbase/MLpipelie/MLoptというもう少し大きな話があった
  • K-meansの話
  • 映画のレコメンドを例に挙げた協調フィルタリングの話
    • 欠損値がある
    • レーティングはより小さな要因から決定されていると仮定
      • user/movie factorに分解
    • ALSはユーザーはuser, movieの双方をアップデートしていく
      • 並列にアップデートできる
    • ALSを使ったレコメンドがハンズオンの内容
  • パフォーマンス(AWS上の16nodeの話)
    • Mahoutよりも速い(もはやこういったベンチには段々意味がないと思うけど。。。)
    • スケーラビリティもMahoutよりもよい
    • 50node, 660M users, 2.4M items, 3.5B ratingsが40minuiteで完了
  • 1.0から1.1になってパフォーマンスが大幅アップ
  • ML pipelineの対応
    • 1.2からの対応
    • workflowの記述が簡単に
    • モデルのチューニングに関する標準的なインターフェースを備える
  • ML Dataset = SchemaRDDという感じでSparkSQLと統合を図る

なんとなくScalaのコードも見慣れつつあるので、ソースコードも読める気はしてきています。MLlibはもっと深堀りしていきたいですね。