PySpark ile Big Data Temelleri
Upendra Devisetty
Science Analyst, CyVerse
İşbirlikçi filtreleme, ortak ilgi alanları olan kullanıcıları bulur
Genellikle öneri sistemlerinde kullanılır
Yaklaşımlar:
Kullanıcı-Kullanıcı İşbirlikçi filtreleme: Hedef kullanıcıya benzer kullanıcıları bulur
Öğe-Öğe İşbirlikçi filtreleme: Hedef kullanıcının beğendiğine benzer öğeleri bulur ve önerir
Rating sınıfı, (kullanıcı, ürün, puan) üçlüsünü saran bir yapıdır
RDD'yi ayrıştırıp kullanıcı, ürün ve puan üçlüsü oluşturmak için kullanışlıdır
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)
Veriyi eğitim ve test olarak ayırmak, kestirimsel modellemeyi değerlendirmek için kritiktir
Genelde eğitim için testten daha büyük bir kısım ayrılır
PySpark randomSplit() yöntemi, verilen ağırlıklarla rastgele böler ve birden çok RDD döndürür
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 içindeki Alternating Least Squares (ALS) algoritması işbirlikçi filtreleme sağlar
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() yöntemi, kullanıcı-ürün çiftleri için tahmini puanları döndürür
Puan içermeyen bir RDD alır ve puanları üretir
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, (gerçek puan - tahmin puanı) karesinin ortalamasıdır
MSE = rates_preds.map(lambda r: (r[1][0] - r[1][1])**2).mean()
PySpark ile Big Data Temelleri