Fundamental Big Data dengan PySpark
Upendra Devisetty
Science Analyst, CyVerse
Collaborative filtering mencari pengguna dengan minat serupa
Umum dipakai untuk sistem rekomendasi
Pendekatan collaborative filtering:
User-User Collaborative filtering: Menemukan pengguna yang mirip dengan pengguna target
Item-Item Collaborative filtering: Menemukan dan merekomendasikan item yang mirip dengan item milik pengguna target
Kelas Rating adalah pembungkus untuk tuple (user, product, rating)
Berguna untuk mengurai RDD dan membuat tuple berisi user, product, dan 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)
Membagi data menjadi train dan test penting untuk evaluasi pemodelan prediktif
Biasanya porsi train lebih besar daripada test
Metode randomSplit() di PySpark membagi acak sesuai bobot dan menghasilkan beberapa RDD
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]
Algoritma Alternating Least Squares (ALS) di spark.mllib mendukung 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)
Metode predictAll() mengembalikan daftar rating prediksi untuk pasangan user-produk masukan
Metode ini menerima RDD tanpa rating untuk menghasilkan rating
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 adalah rata-rata kuadrat dari (actual rating - predicted rating)
MSE = rates_preds.map(lambda r: (r[1][0] - r[1][1])**2).mean()
Fundamental Big Data dengan PySpark