14

मैं सहयोगी फ़िल्टरिंग के लिए निहित प्रतिक्रिया के साथ स्पार्क एमएलआईबी एएलएस का उपयोग करने की कोशिश कर रहा हूं। इनपुट डेटा में केवल दो फ़ील्ड userId और productId हैं। मेरे पास कोई उत्पाद रेटिंग है, केवल उपयोगकर्ताओं द्वारा खरीदे गए उत्पादों के बारे में जानकारी, बस इतना ही है। तो ए एल एस प्रशिक्षित करने के लिए मैं का उपयोग करें:सहकारी फ़िल्टरिंग में एएलएस निहित प्रतिक्रिया के लिए वरीयताओं को कैसे सेट करें?

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

trainImplicit पर दूसरी ओर प्रलेखन पर कहता है: ट्रेन एक मैट्रिक्स गुणन मॉडल

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 वस्तु की आवश्यकता है उपयोगकर्ताओं द्वारा कुछ उत्पादों को दिए गए 'निहित प्राथमिकताओं' रेटिंग का आरडीडी दिया गया है (उपयोगकर्ता आईडी, उत्पाद आईडी, वरीयता) जोड़े के रूप में।

जब मैं के रूप 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) 
} 

तो मेरा प्रश्न है: क्या मूल्य (ALS.trainImplicit विधि में) अंतर्निहित प्रशिक्षण के लिए

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

: ue मैं में rating सेट करना चाहिए?

अद्यतन

के साथ:

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)।

+0

क्या है हो सकता है यहां 'numPartitions'? यह एक दिलचस्प सवाल है। इसके अलावा अंतर्निहित डेटा के लिए हम वास्तव में एक आरएमएसई प्राप्त कर सकते हैं, आरएमएसई 1-5 पसंद के पैमाने पर सही है? –

+0

क्या आप कृपया बता सकते हैं कि आप यहाँ क्या होगा, आप computeRMSE के लिए गुजर रहे हैं। धन्यवाद, –

उत्तर

2

आप अल्फा आत्मविश्वास स्तर निर्दिष्ट कर सकते हैं। डिफ़ॉल्ट 1.0 है: लेकिन कम प्रयास करें।

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

हमें बताएं कि यह कैसे जाता है।

+0

कृपया मेरा अपडेट देखें – zork

+0

अल्फा होने की अनुशंसा की जाती है << 1 – javadba

0

यह और भी अजीब जब से तुम सेट के बजाय "प्रशिक्षण" सबसेट

कितनी अच्छी तरह से वितरित मूल डेटा का उपयोग कर पूरे के साथ प्रशिक्षित कर रहे हैं क्या है? क्या आपके पास वरीयता या वस्तुओं के बिना बड़ी संख्या में आइटम हैं जिन्हें बहुत पसंद किया जाता है?

"अंतर्निहित प्रतिक्रिया डेटासेट के लिए सहयोगात्मक छनन" अल्फा इस्तेमाल किया 40 है, तो आप विभिन्न मूल्यों के साथ प्रयोग करने के लिए चाहते हो सकता है, लेकिन

1

में वर्ग रेटिंग 'रेटिंग' एक डबल मूल्य है।

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/ के अनुसार, 'रेटिंग' दिए गए उपयोगकर्ता + आइटम के लिए टिप्पणियों की संख्या

संबंधित मुद्दे