MovieLens Verilerinde ALS modeli oluşturma

PySpark ile Öneri Motorları Oluşturma

Jamen Long

Data Scientist at Nike

Basit bir modeli uydurma

# Veriyi böl
(training_data, test_data) = movie_ratings.randomSplit([0.8, 0.2])

# ALS modeli kur
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)

# Modeli eğitim verisine uydur
model = als.fit(training_data)  

# test_data üzerinde tahminler üret
predictions = model.transform(test_data)

# Spark'a tahminleri nasıl değerlendireceğini söyle
evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating",
                                predictionCol="prediction")
# RMSE'yi al ve yazdır
rmse = evaluator.evaluate(predictions)
print ("RMSE: "), rmse
RMSE: 1.45
PySpark ile Öneri Motorları Oluşturma

ParamGridBuilder ve CrossValidator'a giriş

ParamGridBuilder()

CrossValidator()
PySpark ile Öneri Motorları Oluşturma

ParamGridBuilder

# ParamGridBuilder paketini içe aktar
from pyspark.ml.tuning import ParamGridBuilder

# Bir ParamGridBuilder oluştur param_grid = ParamGridBuilder()
PySpark ile Öneri Motorları Oluşturma

ParamGridBuilder'a Hiperparametre Ekleme

# ParamGridBuilder paketini içe aktar
from pyspark.ml.tuning import ParamGridBuilder

# Bir ParamGridBuilder oluştur ve hiperparametreleri ekle
param_grid = ParamGridBuilder()
                    .addGrid(als.rank, [])
                    .addGrid(als.maxIter, [])
                    .addGrid(als.regParam, [])
PySpark ile Öneri Motorları Oluşturma

ParamGridBuilder'a Hiperparametre Değerleri Ekleme

# ParamGridBuilder paketini içe aktar
from pyspark.ml.tuning import ParamGridBuilder

# Bir ParamGridBuilder oluştur, hiperparametre ve değerlerini ekle
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()
PySpark ile Öneri Motorları Oluşturma

CrossValidator

# CrossValidator paketini içe aktar
from pyspark.ml.tuning import CrossValidator

# Çapraz doğrulayıcı oluştur; eğitirken ve değerlendirirken ne kullanılacağını belirt
cv = CrossValidator(estimator = als,
                    estimatorParamMaps = param_grid,
                    evaluator = evaluator,
                    numFolds = 5)
PySpark ile Öneri Motorları Oluşturma

CrossValidator başlatma ve estimator

# CrossValidator paketini içe aktar
from pyspark.ml.tuning import CrossValidator

# Bir çapraz doğrulayıcı başlat
cv = CrossValidator()
PySpark ile Öneri Motorları Oluşturma

CrossValidator ParamMaps

# CrossValidator paketini içe aktar
from pyspark.ml.tuning import CrossValidator

# Modeli eğitirken ne kullanılacağını belirt
cv = CrossValidator(estimator = als,
                    estimatorParamMaps = param_grid,
                    )
PySpark ile Öneri Motorları Oluşturma

CrossValidator

# CrossValidator paketini içe aktar
from pyspark.ml.tuning import CrossValidator

# Spark'a hangi algoritma, hiperparametre değerleri, nasıl değerlendirme
# ve eğitim sırasında kullanılacak kat sayısını belirt
cv = CrossValidator(estimator = als,
                    estimatorParamMaps = param_grid,
                    evaluator = evaluator,
                    numFolds = 5)
PySpark ile Öneri Motorları Oluşturma

Rastgele bölme

# Eğitim ve test seti oluştur (80/20 böl)
(training, test) = movie_ratings.randomSplit([0.8, 0.2])

# Hiperparametresiz genel ALS modeli kur
als = ALS(userCol="userId", itemCol="movieId", ratingCol="rating", 
            coldStartStrategy="drop", nonnegative = True, 
            implicitPrefs = False)
PySpark ile Öneri Motorları Oluşturma

ParamGridBuilder

# Eğitim ve test seti oluştur (80/20 böl)
(training, test) = movie_ratings.randomSplit([0.8, 0.2])

# Hiperparametresiz genel ALS modeli kur
als = ALS(userCol="userId", itemCol="movieId", ratingCol="rating", 
            coldStartStrategy="drop", nonnegative = True, 
            implicitPrefs = False)

# Her hiperparametre için denenecek değerleri belirt
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()
PySpark ile Öneri Motorları Oluşturma

Evaluator

# Eğitim ve test seti oluştur (80/20 böl)
(training, test) = movie_ratings.randomSplit([0.8, 0.2])

# Hiperparametresiz genel ALS modeli kur
als = ALS(userCol="userId", itemCol="movieId", ratingCol="rating", 
            coldStartStrategy="drop", nonnegative = True, 
            implicitPrefs = False)

# Her hiperparametre için denenecek değerleri belirt
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()

# Model performansının nasıl değerlendirileceğini belirt           
evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating", 
            predictionCol="prediction")
PySpark ile Öneri Motorları Oluşturma

CrossValidator

# Hiperparametresiz genel ALS modeli kur
als = ALS(userCol="userId", itemCol="movieId", ratingCol="rating", 
            coldStartStrategy="drop", nonnegative = True, 
            implicitPrefs = False)

# Her hiperparametre için denenecek değerleri belirt
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()

# Model performansının nasıl değerlendirileceğini belirt           
evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating", 
            predictionCol="prediction")

# CrossValidator kullanarak çapraz doğrulama adımını kur 
from pyspark.ml.tuning import CrossValidator
cv = CrossValidator(estimator = als,
                    estimatorParamMaps = param_grid,
                    evaluator = evaluator,
                    numFolds = 5)
PySpark ile Öneri Motorları Oluşturma

En iyi model

# Her hiperparametre için denenecek değerleri belirt
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()

# Model performansının nasıl değerlendirileceğini belirt           
evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating", 
            predictionCol="prediction")

# CrossValidator kullanarak çapraz doğrulama adımını kur 
from pyspark.ml.tuning import CrossValidator
cv = CrossValidator(estimator = als,
                    estimatorParamMaps = param_grid,
                    evaluator = evaluator,
                    numFolds = 5)

# Çapraz doğrulamayı eğitim verisi üzerinde çalıştır                    
model = cv.fit(training)                    

# Çapraz doğrulamadan en iyi değer kombinasyonunu çıkar
best_model = model.bestModel
PySpark ile Öneri Motorları Oluşturma

Tahminler ve performans değerlendirme

# Çapraz doğrulamadan en iyi değer kombinasyonunu çıkar
best_model = model.bestModel

# Test seti tahminleri üret ve RMSE ile değerlendir
predictions = best_model.transform(test)
rmse = evaluator.evaluate(predictions)

# Değerlendirme metriklerini ve model parametrelerini yazdır
print ("**En İyi 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()

PySpark ile Öneri Motorları Oluşturma

Hadi pratik yapalım!

PySpark ile Öneri Motorları Oluşturma

Preparing Video For Download...