Principes fondamentaux des mégadonnées avec PySpark
Upendra Devisetty
Science Analyst, CyVerse
Le filtrage collaboratif consiste à trouver des utilisateurs aux intérêts communs
Il est couramment utilisé pour les systèmes de recommandation
Approches de filtrage collaboratif :
Utilisateur-Utilisateur : trouve des utilisateurs similaires à l’utilisateur cible
Article-Article : trouve et recommande des articles similaires à ceux de l’utilisateur cible
La classe Rating encapsule le tuple (utilisateur, produit, note)
Utile pour parser le RDD et créer un tuple utilisateur, produit, note
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)
Séparer les données en ensembles d’entraînement et de test est essentiel pour évaluer un modèle prédictif
En général, la part d’entraînement est bien plus grande que celle de test
randomSplit() de PySpark répartit aléatoirement selon des poids et renvoie plusieurs 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]
L’algorithme ALS (Alternating Least Squares) de spark.mllib implémente le filtrage collaboratif
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)
La méthode predictAll() renvoie une liste de notes prévues pour des paires utilisateur-produit en entrée
Elle prend un RDD sans notes pour générer les prédictions
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))]
La MSE est la moyenne du carré de (note réelle - note prédite)
MSE = rates_preds.map(lambda r: (r[1][0] - r[1][1])**2).mean()
Principes fondamentaux des mégadonnées avec PySpark