2

У меня есть 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 вещь здесь. Поэтому я не уверен, что здесь неправильно.

Я могу понять, что поскольку данные обучения не имеют всех пользователей и элементов, матрица факторов факторов также будет иметь только много факторов пользователя и элемента. Итак, как мне это преодолеть? В конце концов, мне в основном нужна матрица прогнозов для всех пользователей и элементов.

+0

Возможный дубликат [Spark ALS predAll возвращает пусто] (http://stackoverflow.com/questions/37379751/spark-als-predictall-returns-empty) –

+0

В чем проблема? Да, вы можете использовать свою модель, обученную на «поезде», чтобы предсказать «тест» или «originalDF», но последний не даст хорошей оценки производительности модели. – mtoto

ответ

1

Все идентификаторы:

  • пользователей
  • продукты

, для которого вы хотите предсказания должны присутствовать в обучающем наборе. Использование случайного разделения не является методом, который может быть использован для обеспечения того, что (он не эквивалентен маскировке данных).

+1

Тогда что такое метод ?. В рекомендательной системе нужно маскировать некоторые оценки для каждого пользователя. Это означает, что мы в основном не используем некоторые из этих рейтингов в данных обучения. Это то, что я использовал, используя randomSplit. Как вы думаете, что является лучшей альтернативой? – Baktaawar

+0

Возможно, вам повезло с использованием стратифицированной выборки пользователем (если прогнозы для всех пользователей более важны) или по продукту (если прогнозы для всех продуктов) более важны. Вы также можете добавить отсутствующие значения после первой выборки. –

+0

Хорошо. См. Редактирование. – Baktaawar