14

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ır
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%. 

sanırım. Ayrıca, taban çizgisi modelinin basitçe anlam ifade ettiği garip temel iyileştirme elde ediyorum (1).

+0

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? –

+0

, lütfen burada n'in ne olacağını anlayabiliyor musunuz? Teşekkürler, –

cevap

2

Alfa güven düzeyini belirleyebilirsiniz. Varsayılan 1.0: ancak daha düşük bir değer deneyin.

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

Bunun nasıl gideceğini bize bildirin.

+0

Güncelleme – zork

+0

Alpha görmek tavsiye edilir. – javadba

0

bütüne ile seti eğitim yerine orijinal verilerdir dağıtılan Ne kadar iyi "eğitim" alt kümesini

kullanıyor beri Hatta daha garip? Tercih edilmeyen çok sayıda eşya veya çok tercih edilen eşyalarınız var mı?"Örtülü Görüşleri Veri kümeleri için İşbirlikçi Filtreleme" kullanılan alfa olarak

farklı değerlerle denemeler isteyebilirsiniz ama sınıf değerlendirmesi

İlgili konular