मैं सहयोगी फ़िल्टरिंग के लिए निहित प्रतिक्रिया के साथ स्पार्क एमएलआईबी एएलएस का उपयोग करने की कोशिश कर रहा हूं। इनपुट डेटा में केवल दो फ़ील्ड 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)।
क्या है हो सकता है यहां 'numPartitions'? यह एक दिलचस्प सवाल है। इसके अलावा अंतर्निहित डेटा के लिए हम वास्तव में एक आरएमएसई प्राप्त कर सकते हैं, आरएमएसई 1-5 पसंद के पैमाने पर सही है? –
क्या आप कृपया बता सकते हैं कि आप यहाँ क्या होगा, आप computeRMSE के लिए गुजर रहे हैं। धन्यवाद, –