Advanced Analytics from Spark #3 協調フィルタリング #4

大急ぎで、協調フィルタリングALSを動かしてみたが、もう少し中身のScalaコードを吟味してみよう。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
兎にも角にもAUC以下の部分が難解であるが、そもそもROC曲線とAUCについて、以下のリンクサイトで復習しておこう。
http://www.randpy.tokyo/entry/roc_auc

そこでareaUnderCurve()関数について、チェックしてみる。

であるから、このAUCを算定する関数の引数は3つあり、RDD[Rating]クラスのpositiveData、Broadcast[Array[Int]クラスのbALLItemIDs、と第3引数は関数predicFunction()である。
関数predicFunction()は、RDD([Int, Int)]を引数として、RDD[Rating]を返り値とする。
この関数は、AUCの算定では以下のように使用されている:

返り値であるAUC値は、Doubleの浮動小数点であり、areaUnderCurve()のpositivePredictions.join(negativePredictions).values.map {……}.mean()で返される。
cvDataは、各ユーザにとって良いpositiveなアーティスト群というかたちでの交差検証用CV(Cross validation)集合。第3引数は、MatrixFactoriztionModelのpredict()メソッドである。predict()関数は、ユーザー、アーティスト、レコメンデーションの値を含むRatingという予測値へ変換する。
ちなみにcvDataを覗いてみると

であり、元となっているallDataは、ユーザー・アーティスト・再生回数データrawUserArtistDataとアーティストIDの正しいIDへの変換マップArtistAliasをブロードキャストしたbArtistAliasを引数にして、buidlRating()関数でRatingへ算定変換したもの。

ALSの実装には、入力データをトレーニング用と、モデルの評価に用いるCV用データセットに分ける必要がある。
ここでは、以下のコードにより、90%のデータをトレーニング用、10%を交差検証用に用いる。

————————————————————–
あとの理解は、RecommendationのALSについての理解に尽きると思うので、Sparkの以下のコードが関わるAPIを参照してみよう。

Spark1.4.0のAPI:
https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/mllib/recommendation/package-summary.html
で、Package org.apache.spark.ml.recommendationのClass Summary

val model = ALS.trainImplicit(trainData, 10, 5, 0.01, 1.0)のtrainImplicit()関数は、ALSクラスに対するメソッドで、MaticFactorizationModelのインスタンスを返す。

以下の命令では、MatrixFactorizationModelのインスタンスmodelに対して、メソッドrecommendProductsで、Ratingとして推奨される5つのアーティストが返される。