5

リンクhttp://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.htmlにあるガイドに従いました

しかし、spark Mlib RDD アプローチを使用しているため、これは時代遅れです。New Spark 2.0 には DataFrame アプローチがあります。今私の問題は、更新されたコードを入手したことです

val ratings = spark.read.textFile("data/mllib/als/sample_movielens_ratings.txt")
  .map(parseRating)
  .toDF()
val Array(training, test) = ratings.randomSplit(Array(0.8, 0.2))

// Build the recommendation model using ALS on the training data
val als = new ALS()
  .setMaxIter(5)
  .setRegParam(0.01)
  .setUserCol("userId")
  .setItemCol("movieId")
  .setRatingCol("rating")
val model = als.fit(training)
// Evaluate the model by computing the RMSE on the test data
val predictions = model.transform(test)

ここに問題があります. 古いコードでは得られたモデルは MatrixFactorizationModel でした. 今は独自のモデルを持っています(ALSModel)

MatrixFactorizationModel では、直接行うことができます

val recommendations = bestModel.get
  .predict(userID)

これにより、ユーザーが好きになる可能性が最も高い製品のリストが得られます。

しかし、現在、.predict メソッドはありません。ユーザーIDを指定して製品のリストを推奨する方法

4

3 に答える 3

6

transformモデルでメソッドを使用する:

import spark.implicits._
val dataFrameToPredict = sparkContext.parallelize(Seq((111, 222)))
    .toDF("userId", "productId")
val predictionsOfProducts = model.transform (dataFrameToPredict)

recommend(User|Product) メソッドを実装するための jira チケットがありますが、まだデフォルト ブランチにはありません

これで、ユーザーのスコアを含む DataFrame ができました

orderBy と limit を使用して、N 個の推奨商品を表示できます。

// where is for case when we have big DataFrame with many users
model.transform (dataFrameToPredict.where('userId === givenUserId))
    .select ('productId, 'prediction)
    .orderBy('prediction.desc)
    .limit(N)
    .map { case Row (productId: Int, prediction: Double) => (productId, prediction) }
    .collect()

DataFrame dataFrameToPredict は、すべてのユーザー x すべての製品など、大きなユーザー製品の DataFrame にすることができます。

于 2016-12-20T15:02:47.053 に答える