Netflix предлагает большое количество телешоу, доступных для потоковой передачи. Он рекомендует названия для пользователей. Если вы используете Netflix, вы, возможно, заметили, что они создают потрясающие жанры четкости: романтические драмы, где главный герой - левша. Как они пришли к этим жанрам? Как они справляются с предоставлением отличных рекомендаций своим более чем 90 миллионам подписчиков, которые уже привыкли получать рекомендации практически от каждой платформы, которую они используют? Глубокое обучение, алгоритмы и творчество.
Совместная фильтрация обычно используется для рекомендательных систем. Эти методы направлены на заполнение недостающих записей в матрице ассоциации пользователь-элемент. В настоящее время spark.ml поддерживает совместную фильтрацию на основе моделей, при которой пользователи и продукты описываются небольшим набором скрытых факторов, которые можно использовать для прогнозирования отсутствующих записей. spark.ml использует алгоритм альтернативных наименьших квадратов (ALS) для изучения этих скрытых факторов. Реализация в spark.ml имеет следующие параметры:
PySpark - это результат сотрудничества Apache Spark и Python. Apache Spark - это платформа кластерных вычислений с открытым исходным кодом, построенная на скорости, простоте использования и потоковой аналитике, тогда как Python - это универсальный язык программирования высокого уровня.
сначала мы должны установить pyspark и подготовить его к работе ... Я предоставил несколько ссылок, которые помогут вам с этой задачей.
Https://medium.com/@GalarnykMichael/install-spark-on-windows-pyspark-4498a5d8d66c фактически https://aws.amazon.com/premiumsupport/knowledge-center/emr-pyspark-python-3x/ »
In your bash cmd use -- pip install findspark-- and then set SparkContext --- as follows
import findspark findspark.init('/home/sak/spark-2.4.3-bin-hadoop2.7') #here you sould set the path to spark folder in your machine/server import pyspark from pyspark import SparkContext, SparkConf conf = SparkConf().setAppName("MyApp).setMaster("local") # you could replace local with year url if you want sc = SparkContext(conf=conf)
Здесь мы должны запустить Spark session, чтобы начать с Spark sql из pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()
Теперь импортируем необходимую библиотеку
from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml.recommendation import ALS
from pyspark.sql import Row
Теперь мы читаем данные в формате искры RDD и присваиваем им названия, а затем преобразуем их в sql.Data frame.
lines = spark.read.text("sample_movielens_ratings.txt").rdd
parts = lines.map(lambda row: row.value.split("::"))
ratingsRDD = parts.map(lambda p: Row(userId=int(p[0]), movieId=int(p[1]),rating=float(p[2]), timestamp=int(p[3])))
ratings = spark.createDataFrame(ratingsRDD)
(training, test) = ratings.randomSplit([0.8, 0.2])
Теперь мы строим модель рекомендаций с помощью ALS на обучающих данных. Обратите внимание, что мы установили стратегию холодного старта на «падение», чтобы гарантировать отсутствие показателей оценки NaN.
als = ALS(maxIter=5, regParam=0.01, userCol="userId", itemCol="movieId", ratingCol="rating",coldStartStrategy="drop")
model = als.fit(training)
Теперь мы можем оценить модель, вычислив RMSE на тестовых данных.
predictions = model.transform(test)
evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating",predictionCol="prediction")
rmse = evaluator.evaluate(predictions)
print("Root-mean-square error = " + str(rmse))
Результат будет примерно таким
Root-mean-square error = 1.6638709815338888
Сгенерируйте 10 лучших рекомендаций фильмов для каждого пользователя
userRecs = model.recommendForAllUsers(10)
Сгенерируйте 10 лучших рекомендаций пользователей для каждого фильма
movieRecs = model.recommendForAllItems(10)
Создавайте 10 лучших рекомендаций по фильмам для определенной группы пользователей.
users = ratings.select(als.getUserCol()).distinct().limit(3)
userSubsetRecs = model.recommendForUserSubset(users, 10)
Создание 10 лучших рекомендаций пользователей для определенного набора фильмов.
movies = ratings.select(als.getItemCol()).distinct().limit(3)
movieSubSetRecs = model.recommendForItemSubset(movies, 10)
Показать результаты
userRecs.show() movieRecs.show() userSubsetRecs.show() movieSubSetRecs.show()
+------+--------------------+ |userId| recommendations| +------+--------------------+ | 28|[[34, 6.2745895],...| | 26|[[94, 5.3556576],...| | 27|[[32, 4.5518517],...| | 12|[[19, 5.7531867],...| | 22|[[44, 5.652228], ...| | 1|[[52, 4.6947684],...| | 13|[[93, 3.8497524],...| | 6|[[25, 4.4996967],...| | 16|[[51, 4.749304], ...| | 3|[[62, 5.261743], ...| | 20|[[90, 6.108018], ...| | 5|[[55, 4.80991], [...| | 19|[[32, 3.8459191],...| | 15|[[46, 4.9723687],...| | 17|[[46, 5.135776], ...| | 9|[[49, 5.1126733],...| | 4|[[52, 3.8264365],...| | 8|[[52, 5.0733185],...| | 23|[[90, 6.6885557],...| | 7|[[25, 5.151322], ...| +------+--------------------+ only showing top 20 rows +-------+--------------------+ |movieId| recommendations| +-------+--------------------+ | 31|[[12, 3.7749054],...| | 85|[[8, 4.8402247], ...| | 65|[[23, 4.866437], ...| | 53|[[8, 4.883639], [...| | 78|[[23, 1.4780338],...| | 34|[[28, 6.2745895],...| | 81|[[28, 4.8189664],...| | 28|[[18, 5.008406], ...| | 76|[[14, 4.9252243],...| | 26|[[26, 4.680863], ...| | 27|[[11, 5.1526017],...| | 44|[[22, 5.652228], ...| | 12|[[28, 4.7525043],...| | 91|[[28, 5.519838], ...| | 22|[[22, 4.2934175],...| | 93|[[2, 5.158542], [...| | 47|[[10, 4.1678576],...| | 1|[[11, 4.5958223],...| | 52|[[8, 5.0733185], ...| | 13|[[23, 3.8065495],...| +-------+--------------------+ only showing top 20 rows +------+--------------------+ |userId| recommendations| +------+--------------------+ | 26|[[94, 5.3556576],...| | 19|[[32, 3.8459191],...| | 29|[[46, 4.9788456],...| +------+--------------------+ +-------+--------------------+ |movieId| recommendations| +-------+--------------------+ | 65|[[23, 4.866437], ...| | 26|[[26, 4.680863], ...| | 29|[[14, 5.337469], ...| +-------+--------------------+
Ссылка на проект и вместе с датасетами в github