AMP Campをひと通りさらってみる:第4回 Movie Recommendation with MLlib
- 第1回 IntroductionとGetting Started
- 第2回 Data Exploration Using Spark
- 第3回 Explore In-Memory Data Store Tachyon
これ順番が動画順なので、厳密にはAMP CampのWebページのメニュー順番とは異なっていますね。。。第4回目はMLlibで一応自分の中では本丸です。
Movie Recommendation with MLlibのメモ
- MovieLensのデータを使ったMLlibのサンプル
Data set
- データセットはGetting Startedより取得できる
Collaborative filtering
Create training examples
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年くらいブランクがあるので色々おさらいが必要そうです。。。
- カエルでもわかる!Spark / MLlib でやってみる協調フィルタリング(前編)
- カエルでもわかる!Spark / MLlib でやってみる協調フィルタリング(後編)
- Amazon Elastic MapReduceで、Apache Mahoutの分散次元縮約(Parallel ALS)を動かす
- Apache Mahoutの分散次元縮約(Parallel ALS)を解説しよう。
- MatrixFacorization を使った評価予測 ―アルゴリズムシリーズ 3―
動画のメモ
AMP Camp 5: MLlib - Ameet Talwalkar - YouTube
- MLlibの紹介
- MLlib自体はともかく、MLbase/MLpipelie/MLoptというもう少し大きな話があった
- K-meansの話
- 映画のレコメンドを例に挙げた協調フィルタリングの話
- パフォーマンス(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はもっと深堀りしていきたいですね。