2016-12-20 2 views
3

я следовал за руководство, данное в ссылке http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.htmlСпарк 2,0 ALS Рекомендация как рекомендовать пользователю

Но это является устаревшим, как он использует искры Mlib RDD подход. Новый 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) 

который даст список продуктов с наибольшей вероятностью пользователя симпатия их.

Но теперь нет метода прогнозирования. Любая идея, как рекомендовать список продуктов, данный пользователь Id

ответ

5

Используйте transform метод на модели:

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

Там же билет JIRA реализовать рекомендовать (User | Продукт) метод, но это еще не по умолчанию филиал

Теперь у вас есть DataFrame со счетом для пользователя

вы можете просто использовать OrderBy и предела, чтобы показать 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 может быть какой-то большой DataFrame пользователем продукта, например, все пользователи х все продукты

+0

Преобразование преобразует только данную таблицу и добавляет значения предсказания для этого конкретного пользователя и фильма, но мне нужен список, так как мы собираемся использовать поток, в который придет пользовательский интерфейс, и мы можем рекомендовать его продукты. Но спасибо за вашу помощь – user2983451

+1

@ user2983451 Добавлен код для рекомендации продукта N для данного пользователя;) –

0

Вот что я сделал, чтобы получить рекомендации для конкретного пользователя с spark.ml:

import com.github.fommil.netlib.BLAS.{getInstance => blas} 

userFactors.lookup(userId).headOption.fold(Map.empty[String, Float]) { user => 

    val ratings = itemFactors.map { case (id, features) => 
    val rating = blas.sdot(features.length, user, 1, features, 1) 
    (id, rating) 
    } 

    ratings.sortBy(_._2).take(numResults).toMap 
} 

Оба userFactors и itemFactors в моем случае - RDD[(String, Array[Float])], но вы должны быть способны сделать что-то подобное с DataFrames.

Смежные вопросы