Création d'un modèle ALS sur les données MovieLens

Créer des moteurs de recommandation avec PySpark

Jamen Long

Data Scientist at Nike

Ajuster un modèle de base

# Fractionner les données
(training_data, test_data) = movie_ratings.randomSplit([0.8, 0.2])

# Créer le modèle ALS
from pyspark.ml.recommendation import ALS

als = ALS(userCol="userId", itemCol="movieId", ratingCol="rating", 
            rank=25, maxIter=100, regParam=.05, nonnegative=True,
            coldStartStrategy="drop", implicitPrefs=False)

# Ajuster le modèle sur l'entraînement
model = als.fit(training_data)  

# Générer des prédictions sur test_data
predictions = model.transform(test_data)

# Indiquer à Spark comment évaluer les prédictions
evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating",
                                predictionCol="prediction")
# Obtenir et afficher le RMSE
rmse = evaluator.evaluate(predictions)
print ("RMSE: "), rmse
RMSE: 1.45
Créer des moteurs de recommandation avec PySpark

Intro à ParamGridBuilder et CrossValidator

ParamGridBuilder()

CrossValidator()
Créer des moteurs de recommandation avec PySpark

ParamGridBuilder

# Importer ParamGridBuilder
from pyspark.ml.tuning import ParamGridBuilder

# Créer un ParamGridBuilder param_grid = ParamGridBuilder()
Créer des moteurs de recommandation avec PySpark

Ajouter des hyperparamètres à ParamGridBuilder

# Importer ParamGridBuilder
from pyspark.ml.tuning import ParamGridBuilder

# Créer un ParamGridBuilder et ajouter des hyperparamètres
param_grid = ParamGridBuilder()
                    .addGrid(als.rank, [])
                    .addGrid(als.maxIter, [])
                    .addGrid(als.regParam, [])
Créer des moteurs de recommandation avec PySpark

Ajouter des valeurs d'hyperparamètres à ParamGridBuilder

# Importer ParamGridBuilder
from pyspark.ml.tuning import ParamGridBuilder

# Créer un ParamGridBuilder, avec hyperparamètres et valeurs
param_grid = ParamGridBuilder()
                    .addGrid(als.rank, [5, 40, 80, 120])
                    .addGrid(als.maxIter, [5, 100, 250, 500])
                    .addGrid(als.regParam, [.05, .1, 1.5])
                    .build()
Créer des moteurs de recommandation avec PySpark

CrossValidator

# Importer CrossValidator
from pyspark.ml.tuning import CrossValidator

# Créer le validateur croisé et indiquer à Spark quoi utiliser pour entraîner
# et évaluer un modèle
cv = CrossValidator(estimator = als,
                    estimatorParamMaps = param_grid,
                    evaluator = evaluator,
                    numFolds = 5)
Créer des moteurs de recommandation avec PySpark

Instanciation de CrossValidator et estimateur

# Importer CrossValidator
from pyspark.ml.tuning import CrossValidator

# Instancier un validateur croisé
cv = CrossValidator()
Créer des moteurs de recommandation avec PySpark

ParamMaps de CrossValidator

# Importer CrossValidator
from pyspark.ml.tuning import CrossValidator

# Indiquer à Spark quoi utiliser pour entraîner un modèle
cv = CrossValidator(estimator = als,
                    estimatorParamMaps = param_grid,
                    )
Créer des moteurs de recommandation avec PySpark

CrossValidator

# Importer CrossValidator
from pyspark.ml.tuning import CrossValidator

# Indiquer à Spark l'algorithme, les valeurs d'hyperparamètres, la méthode
# d'évaluation de chaque modèle et le nombre de plis à utiliser
cv = CrossValidator(estimator = als,
                    estimatorParamMaps = param_grid,
                    evaluator = evaluator,
                    numFolds = 5)
Créer des moteurs de recommandation avec PySpark

Répartition aléatoire

# Créer les ensembles d'entraînement et de test (répartition 80/20)
(training, test) = movie_ratings.randomSplit([0.8, 0.2])

# Créer un modèle ALS générique sans hyperparamètres
als = ALS(userCol="userId", itemCol="movieId", ratingCol="rating", 
            coldStartStrategy="drop", nonnegative = True, 
            implicitPrefs = False)
Créer des moteurs de recommandation avec PySpark

ParamGridBuilder

# Créer les ensembles d'entraînement et de test (répartition 80/20)
(training, test) = movie_ratings.randomSplit([0.8, 0.2])

# Créer un modèle ALS générique sans hyperparamètres
als = ALS(userCol="userId", itemCol="movieId", ratingCol="rating", 
            coldStartStrategy="drop", nonnegative = True, 
            implicitPrefs = False)

# Indiquer à Spark quelles valeurs essayer pour chaque hyperparamètre
from pyspark.ml.tuning import ParamGridBuilder
param_grid = ParamGridBuilder()
                    .addGrid(als.rank, [5, 40, 80, 120])
                    .addGrid(als.maxIter, [5, 100, 250, 500])
                    .addGrid(als.regParam, [.05, .1, 1.5])
                    .build()
Créer des moteurs de recommandation avec PySpark

Évaluateur

# Créer les ensembles d'entraînement et de test (répartition 80/20)
(training, test) = movie_ratings.randomSplit([0.8, 0.2])

# Créer un modèle ALS générique sans hyperparamètres
als = ALS(userCol="userId", itemCol="movieId", ratingCol="rating", 
            coldStartStrategy="drop", nonnegative = True, 
            implicitPrefs = False)

# Indiquer à Spark quelles valeurs essayer pour chaque hyperparamètre
from pyspark.ml.tuning import ParamGridBuilder
param_grid = ParamGridBuilder()
                    .addGrid(als.rank, [5, 40, 80, 120])
                    .addGrid(als.maxIter, [5, 100, 250, 500])
                    .addGrid(als.regParam, [.05, .1, 1.5])
                    .build()

# Indiquer à Spark comment évaluer la performance du modèle           
evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating", 
            predictionCol="prediction")
Créer des moteurs de recommandation avec PySpark

CrossValidator

# Créer un modèle ALS générique sans hyperparamètres
als = ALS(userCol="userId", itemCol="movieId", ratingCol="rating", 
            coldStartStrategy="drop", nonnegative = True, 
            implicitPrefs = False)

# Indiquer à Spark quelles valeurs essayer pour chaque hyperparamètre
from pyspark.ml.tuning import ParamGridBuilder
param_grid = ParamGridBuilder()
                    .addGrid(als.rank, [5, 40, 80, 120])
                    .addGrid(als.maxIter, [5, 100, 250, 500])
                    .addGrid(als.regParam, [.05, .1, 1.5])
                    .build()

# Indiquer à Spark comment évaluer la performance du modèle           
evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating", 
            predictionCol="prediction")

# Construire l'étape de validation croisée avec CrossValidator 
from pyspark.ml.tuning import CrossValidator
cv = CrossValidator(estimator = als,
                    estimatorParamMaps = param_grid,
                    evaluator = evaluator,
                    numFolds = 5)
Créer des moteurs de recommandation avec PySpark

Meilleur modèle

# Indiquer à Spark quelles valeurs essayer pour chaque hyperparamètre
from pyspark.ml.tuning import ParamGridBuilder
param_grid = ParamGridBuilder()
                    .addGrid(als.rank, [5, 40, 80, 120])
                    .addGrid(als.maxIter, [5, 100, 250, 500])
                    .addGrid(als.regParam, [.05, .1, 1.5])
                    .build()

# Indiquer à Spark comment évaluer la performance du modèle           
evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating", 
            predictionCol="prediction")

# Construire l'étape de validation croisée avec CrossValidator 
from pyspark.ml.tuning import CrossValidator
cv = CrossValidator(estimator = als,
                    estimatorParamMaps = param_grid,
                    evaluator = evaluator,
                    numFolds = 5)

# Exécuter la validation croisée sur l'entraînement                    
model = cv.fit(training)                    

# Extraire la meilleure combinaison issue de la validation croisée
best_model = model.bestModel
Créer des moteurs de recommandation avec PySpark

Prédictions et évaluation des performances

# Extraire la meilleure combinaison issue de la validation croisée
best_model = model.bestModel

# Générer les prédictions sur le test et évaluer avec le RMSE
predictions = best_model.transform(test)
rmse = evaluator.evaluate(predictions)

# Afficher les mesures d'évaluation et les paramètres du modèle
print ("**Best Model**")
print ("RMSE = "), rmse
print ("  Rank: "), best_model.rank
print ("  MaxIter: "), best_model._java_obj.parent().getMaxIter()
print ("  RegParam: "), best_model._java_obj.parent().getRegParam()

Créer des moteurs de recommandation avec PySpark

Passons à la pratique !

Créer des moteurs de recommandation avec PySpark

Preparing Video For Download...