Nền tảng Big Data với PySpark
Upendra Devisetty
Science Analyst, CyVerse
Lọc cộng tác tìm người dùng có sở thích chung
Thường dùng cho hệ thống gợi ý
Các cách tiếp cận lọc cộng tác:
User-User Collaborative filtering: Tìm người dùng giống với người dùng mục tiêu
Item-Item Collaborative filtering: Tìm và gợi ý mục giống với các mục của người dùng mục tiêu
Lớp Rating là một lớp bao quanh bộ 3 (user, product, rating)
Hữu ích để phân tách RDD và tạo bộ 3 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)
Chia dữ liệu thành tập huấn luyện và kiểm tra rất quan trọng để đánh giá mô hình dự đoán
Thông thường phần lớn dữ liệu dành cho huấn luyện so với kiểm tra
randomSplit() của PySpark chia ngẫu nhiên theo trọng số cho trước và trả về nhiều 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]
Thuật toán Alternating Least Squares (ALS) trong spark.mllib hỗ trợ lọc cộng tác
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() trả về danh sách điểm dự đoán cho cặp user–product đầu vào
Phương thức nhận một RDD không có điểm để tạo điểm
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 là giá trị trung bình của bình phương (điểm thực - điểm dự đoán)
MSE = rates_preds.map(lambda r: (r[1][0] - r[1][1])**2).mean()
Nền tảng Big Data với PySpark