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