Подтвердить что ты не робот

Как настроить предпочтения для неявной обратной связи ALS в совместной фильтрации?

Я пытаюсь использовать Spark MLib ALS с неявной обратной связью для совместной фильтрации. Входные данные имеют только два поля userId и productId. У меня нет рейтингов продуктов, просто информация о том, какие продукты пользователи купили, что все. Поэтому для обучения ALS я использую:

def trainImplicit(ratings: RDD[Rating], rank: Int, iterations: Int): MatrixFactorizationModel

(http://spark.apache.org/docs/1.0.0/api/scala/index.html#org.apache.spark.mllib.recommendation.ALS $)

Для этого API требуется объект Rating:

Rating(user: Int, product: Int, rating: Double)

С другой стороны, документация на trainImplicit говорит: Обучить матричную модель факторизации, учитывая RDD рейтингов "неявных предпочтений", заданных пользователями для некоторых продуктов, в виде (userID, productID, предпочтения).

Когда я установил рейтинг/предпочтения 1, как в:

val ratings = sc.textFile(new File(dir, file).toString).map { line =>
  val fields = line.split(",")
  // format: (randomNumber, Rating(userId, productId, rating))
  (rnd.nextInt(100), Rating(fields(0).toInt, fields(1).toInt, 1.0))
}

 val training = ratings.filter(x => x._1 < 60)
  .values
  .repartition(numPartitions)
  .cache()
val validation = ratings.filter(x => x._1 >= 60 && x._1 < 80)
  .values
  .repartition(numPartitions)
  .cache()
val test = ratings.filter(x => x._1 >= 80).values.cache()

И затем поездом ALSL:

 val model = ALS.trainImplicit(ratings, rank, numIter)

Я получаю RMSE 0.9, что является большой ошибкой в ​​случае предпочтений, принимающих значение 0 или 1:

val validationRmse = computeRmse(model, validation, numValidation)

/** Compute RMSE (Root Mean Squared Error). */
 def computeRmse(model: MatrixFactorizationModel, data: RDD[Rating], n: Long): Double = {
val predictions: RDD[Rating] = model.predict(data.map(x => (x.user, x.product)))
val predictionsAndRatings = predictions.map(x => ((x.user, x.product), x.rating))
  .join(data.map(x => ((x.user, x.product), x.rating)))
  .values
math.sqrt(predictionsAndRatings.map(x => (x._1 - x._2) * (x._1 - x._2)).reduce(_ + _) / n)
}

Итак, мой вопрос: к какому значению я должен установить Rating в:

Rating(user: Int, product: Int, rating: Double)

для неявного обучения (в методе ALS.trainImplicit)?

Обновление

С

  val alpha = 40
  val lambda = 0.01

Я получаю:

Got 1895593 ratings from 17471 users on 462685 products.
Training: 1136079, validation: 380495, test: 379019
RMSE (validation) = 0.7537217888106758 for the model trained with rank = 8 and numIter = 10.
RMSE (validation) = 0.7489005441881798 for the model trained with rank = 8 and numIter = 20.
RMSE (validation) = 0.7387672873747732 for the model trained with rank = 12 and numIter = 10.
RMSE (validation) = 0.7310003522283959 for the model trained with rank = 12 and numIter = 20.
The best model was trained with rank = 12, and numIter = 20, and its RMSE on the test set is 0.7302343904091481.
baselineRmse: 0.0 testRmse: 0.7302343904091481
The best model improves the baseline by -Infinity%.

Это все еще большая ошибка, я думаю. Также я получаю странное улучшение базовой линии, когда базовая модель просто означает (1).

4b9b3361

Ответ 1

Вы можете указать уровень достоверности альфа. Значение по умолчанию: 1.0: но попробуйте ниже.

val alpha = 0.01
val model = ALS.trainImplicit(ratings, rank, numIterations, alpha)

Сообщите нам, как это происходит.

Ответ 2

'rating' в классе Rating - это двойное значение.

Согласно http://apache-spark-user-list.1001560.n3.nabble.com/ALS-implicit-error-pyspark-td16595.html, "рейтинг" может быть значением > 1.

И согласно https://docs.prediction.io/templates/recommendation/training-with-implicit-preference/, "рейтинг" может быть числом наблюдений для данного пользователя + элемента

Ответ 3

Это еще более странно, потому что вы тренируетесь со всем набором вместо того, чтобы использовать подмножество "training"

Насколько хорошо распределены исходные данные? у вас есть большое количество предметов без предпочтений или предметов, которые предпочитают много?

В "Collaborative Filtering for Implicit Feedback Datasets" используемая альфа - 40, вы можете поэкспериментировать с разными значениями, но