Işbirlikçi filtreleme için örtülü geri bildirim ile Spark MLib ALS kullanmaya çalışıyorum. Girdi verilerinin sadece iki alanı vardır userId
ve productId
. Ben ürün puanları var, sadece kullanıcıların ürünleri satın aldım ne hakkında bilgi, hepsi bu. Yani ALS yetiştirmek kullandığım:İşbirlikçi Filtrelemede ALS örtülü geri besleme için tercihler nasıl belirlenir?
trainImplicit
diğer yandan belgelerine üzerinde
Rating(user: Int, product: Int, rating: Double)
söyler: Train bir matris ayrıştırma modeli
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 $)
Bu API Rating
nesneyi gerektirir Bazı ürünler için kullanıcılar tarafından verilen 'örtük tercihler' derecelendirme notu verilen bir RDD verildiğinde (userID, productID, tercih) çiftleri. ALSL
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()
Sonra tren: Ben gibi 1
için derecelendirme/tercihlerini ayarlamak
val model = ALS.trainImplicit(ratings, rank, numIter)
aldığım tercihleri durumunda büyük bir hata olduğu RMSE 0.9, olsun 0 veya 1 değer:
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)
}
Benim sorum şu: (ALS.trainImplicit
yönteminde) örtük eğitimi için
Rating(user: Int, product: Int, rating: Double)
: ue ı rating
belirlesin?
Güncelleme ile
:
val alpha = 40
val lambda = 0.01
alıyorum:
hala büyük bir hatadırGot 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%.
sanırım. Ayrıca, taban çizgisi modelinin basitçe anlam ifade ettiği garip temel iyileştirme elde ediyorum (1).
nedir Belirtilen kullanıcı + öğe için gözlemlerin sayı olabilir numPartitions burada? Bu ilginç bir soru. Ayrıca örtülü veriler için gerçekten bir RMSE alabiliriz, RMSE 1-5 likert ölçeğinde çok daha iyidir? –
, lütfen burada n'in ne olacağını anlayabiliyor musunuz? Teşekkürler, –