У меня есть Spark Dataframe Userid, ItemID, Оценки. Я создаю систему рекомендаций.Разделение в системе Рекомендаций
Данные выглядит следующим образом:
originalDF.show(5)
+----+----+------+
|user|item|rating|
+----+----+------+
| 353| 0| 1|
| 353| 1| 1|
| 353| 2| 1|
| 354| 3| 1|
| 354| 4| 1|
+----+----+------+
Он имеет 56K уникальных пользователей и 8.5K уникальных предметов.
Итак, если вы видите, что каждый UserID имеет запись (RoW) для каждого элемента и соответствующий рейтинг. Так много записей на идентификатор пользователя.
Теперь я разделил это на поезд, вал и тест, взяв случайный раскол 0,6,0,2,0,2%. Таким образом, в основном 60% случайных записей идут на обучение, 20% для проверки и оставшиеся 20% для теста, как показано ниже:
random_split=originalDF.randomSplit(split_perc,seed=20)
return random_split[0],random_split[1],random_split[2]
Это оставляет меня следующий набор данных отсчитывает
train,validation,test=train_test_split(split_sdf,[0.6,0.2,0.2])
print "Training size is {}".format(train.count())
print "Validation size is {}".format(validation.count())
print "Test size is {}".format(test.count())
'/'
print "Original Dataset Size is {}".format(split_sdf.count())
Training size is 179950
Validation size is 59828
Test size is 60223
Original Dataset Size is 300001
Сейчас я тренируюсь искрой pyspark.ml.ALS для данных обучения.
als = ALS(rank=120, maxIter=15, regParam=0.01, implicitPrefs=True)
model = als.fit(train)
Когда я проверяю userFactors и itemFactors от модели объекта я получаю это:
itemF=model.itemFactors
itemF.toPandas().shape
Out[111]:
(7686, 2)
In [113]:
userF=model.userFactors
userF.toPandas().shape
Out[113]:
(47176, 2)
Это означает, что только дает мне предсказанный фактор матрицы нет. уникальных пользователей и предметов в данных обучения.
Теперь, как получить предсказание для всех элементов для каждого пользователя ?.
Если я
prediction=model.transform(originalDF)
где OriginalDF является весь набор данных, который был разбит на поезд, вал и испытание было, что дать прогноз для всех элементов для каждого пользователя ?.
Мой вопрос: если у моего набора данных было 56K пользователей X 8.5K, тогда я хочу найти матрицу прогноза для тех же 56K X8.5K, а не только для данных обучения 47K X7.6K.
Что я здесь делаю неправильно ?. Я понимаю, что данные работают только на учебных материалах 47k X7.6K вместо исходных данных рейтинга 56k X8.5K. Так что я разбиваю данные на поезд, не так ли?
Я знаю, что для системы рекомендаций следует случайным образом маскировать некоторые оценки для некоторых элементов для каждого пользователя и использовать оставшиеся для обучения и тестировать их на эти замаскированные значения. Я сделал то же самое здесь, так как каждая запись для пользователя - это рейтинг для другого элемента. Когда мы произвольно раскалываемся, мы по существу маскируем некоторые оценки для пользователя и не используем их для обучения.
Просьба сообщить.
Edit:
В типичной Рекомендатор системе с матрицей пользователя X элемента (56K пользователей X 8.5 пунктов)
Мы в основном маски (сделать это до 0) некоторые случайные рейтинги запись для каждого пользователя. Затем вся эта матрица передается в recutor algo, и она разбивает ее на произведение матрицы двух факторов.
Однако в Spark мы не используем матрицу элементов Userx. Мы в основном ставим каждый столбец столбцов как отдельную строку для каждого пользователя, а не столбцы позиций 8.5K.
Таким образом, если вы видите, что маскирование (внесение некоторых номиналов предметов в 0) в исходную матрицу пользовательского элемента, то такое же, что и не используя некоторые случайные строки для каждого пользователя в кадре данных искры. Правильно?
Вот я нашел один способ разделить (что я тоже) данные в поезд и вал
training_RDD, validation_RDD, test_RDD = small_ratings_data.randomSplit([6, 2, 2], seed=0L)
validation_for_predict_RDD = validation_RDD.map(lambda x: (x[0], x[1]))
test_for_predict_RDD = test_RDD.map(lambda x: (x[0], x[1]))
Я использовал подобную randomSplit вещь здесь. Поэтому я не уверен, что здесь неправильно.
Я могу понять, что поскольку данные обучения не имеют всех пользователей и элементов, матрица факторов факторов также будет иметь только много факторов пользователя и элемента. Итак, как мне это преодолеть? В конце концов, мне в основном нужна матрица прогнозов для всех пользователей и элементов.
Возможный дубликат [Spark ALS predAll возвращает пусто] (http://stackoverflow.com/questions/37379751/spark-als-predictall-returns-empty) –
В чем проблема? Да, вы можете использовать свою модель, обученную на «поезде», чтобы предсказать «тест» или «originalDF», но последний не даст хорошей оценки производительности модели. – mtoto