Créer des moteurs de recommandation avec PySpark
Jamen Long
Data Scientist at Nike
# 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
ParamGridBuilder()
CrossValidator()
# Importer ParamGridBuilder from pyspark.ml.tuning import ParamGridBuilder# Créer un ParamGridBuilder param_grid = 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, [])
# 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()
# 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)
# Importer CrossValidator
from pyspark.ml.tuning import CrossValidator
# Instancier un validateur croisé
cv = 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,
)
# 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 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 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 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 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)
# 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
# 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