PySpark के साथ Big Data Fundamentals
Upendra Devisetty
Science Analyst, CyVerse
Collaborative filtering यानी ऐसे उपयोगकर्ताओं को खोजना जिनकी रुचियाँ मिलती-जुलती हों
Collaborative filtering आम तौर पर recommender systems में उपयोग होता है
Collaborative filtering के तरीके:
User-User Collaborative filtering: लक्ष्य उपयोगकर्ता से मिलते-जुलते उपयोगकर्ताओं को ढूँढता है
Item-Item Collaborative filtering: लक्ष्य उपयोगकर्ता के आइटम्स जैसे मिलते-जुलते आइटम्स ढूँढकर recommend करता है
Rating क्लास (user, product, rating) ट्यूपल का एक रैपर है
RDD को पार्स करने और user, product, rating का ट्यूपल बनाने में उपयोगी
from pyspark.mllib.recommendation import Rating
r = Rating(user = 1, product = 2, rating = 5.0)
(r[0], r[1], r[2])
(1, 2, 5.0)
प्रेडिक्टिव मॉडलिंग का मूल्यांकन करने के लिए डेटा को training और testing सेट में बाँटना ज़रूरी है
आम तौर पर training के लिए डेटा का बड़ा हिस्सा और testing के लिए छोटा हिस्सा रखा जाता है
PySpark का randomSplit() दिए वेट्स के अनुसार रैंडम स्प्लिट करता है और कई RDDs लौटाता है
data = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
training, test=data.randomSplit([0.6, 0.4])
training.collect()
test.collect()
[1, 2, 5, 6, 9, 10]
[3, 4, 7, 8]
spark.mllib में Alternating Least Squares (ALS) एल्गोरिदम collaborative filtering देता है
ALS.train(ratings, rank, iterations)
r1 = Rating(1, 1, 1.0)
r2 = Rating(1, 2, 2.0)
r3 = Rating(2, 1, 2.0)
ratings = sc.parallelize([r1, r2, r3])
ratings.collect()
[Rating(user=1, product=1, rating=1.0),
Rating(user=1, product=2, rating=2.0),
Rating(user=2, product=1, rating=2.0)]
model = ALS.train(ratings, rank=10, iterations=10)
predictAll() मेथड इनपुट user-product पेयर्स के लिए अनुमानित रेटिंग्स की सूची लौटाता है
यह मेथड रेटिंग्स के बिना RDD लेता है और रेटिंग्स जनरेट करता है
unrated_RDD = sc.parallelize([(1, 2), (1, 1)])
predictions = model.predictAll(unrated_RDD)
predictions.collect()
[Rating(user=1, product=1, rating=1.0000278574351853),
Rating(user=1, product=2, rating=1.9890355703778122)]
rates = ratings.map(lambda x: ((x[0], x[1]), x[2]))
rates.collect()
[((1, 1), 1.0), ((1, 2), 2.0), ((2, 1), 2.0)]
preds = predictions.map(lambda x: ((x[0], x[1]), x[2])) preds.collect()[((1, 1), 1.000027857), ((1, 2), 1.9890355703)]
rates_preds = rates.join(preds)
rates_preds.collect()
[((1, 2), (2.0, 1.9890355703)), ((1, 1), (1.0, 1.000027857))]
MSE (actual rating - predicted rating) के वर्ग का औसत मान है
MSE = rates_preds.map(lambda r: (r[1][0] - r[1][1])**2).mean()
PySpark के साथ Big Data Fundamentals