tl; dr: Работа с набором данных Yelp для составления системы рекомендаций, но при работе с Матрица тестовых взаимодействий и матрица взаимодействий обучаются по 68 взаимодействиям. Это приведет к неправильной оценке, проверьте разделение данных. * Ошибка 1002 * при запуске следующего кода LightFM.
test_auc = auc_score(model,
test,
#train_interactions=train, #Unable to run with this line uncommented
item_features=sparse_features_matrix,
num_threads=NUM_THREADS).mean()
print('Hybrid test set AUC: %s' % test_auc)
Полная версия: Работа с набором данных Yelp для создания системы рекомендаций.
Отключение кода, приведенного в примере документации (https://making.lyst.com/lightfm/docs/examples/hybrid_crossvalidated.html) для гибридной совместной фильтрации.
Я запустил свой код следующим образом:
from sklearn.model_selection import train_test_split
from lightfm import LightFM
from scipy import sparse
from lightfm.evaluation import auc_score
train, test = train_test_split(sparse_Rating_Matrix, test_size=0.25,random_state=4)
# Set the number of threads; you can increase this
# if you have more physical cores available.
NUM_THREADS = 2
NUM_COMPONENTS = 100
NUM_EPOCHS = 3
ITEM_ALPHA = 1e-6
# Define a new model instance
model = LightFM(loss='warp',
item_alpha=ITEM_ALPHA,
no_components=NUM_COMPONENTS)
# Fit the hybrid model. Note that this time, we pass
# in the item features matrix.
model = model.fit(train,
item_features=sparse_features_matrix,
epochs=NUM_EPOCHS,
num_threads=NUM_THREADS)
# Don't forget the pass in the item features again!
train_auc = auc_score(model,
train,
item_features=sparse_features_matrix,
num_threads=NUM_THREADS).mean()
print('Hybrid training set AUC: %s' % train_auc)
test_auc = auc_score(model,
test,
#train_interactions=train, # Unable to run with this line uncommented
item_features=sparse_features_matrix,
num_threads=NUM_THREADS).mean()
print('Hybrid test set AUC: %s' % test_auc)
У меня было 2 проблемы:
1) Выполнение рассматриваемой строки без комментариев (train_interactions = train) первоначально дало Несогласованная форма
, которая была решена с помощью следующего: "test" набор данных был изменен следующим блоком кода, чтобы добавить блок нулей под ним, пока размеры не будут соответствовать размеру моего набора данных поезда (согласно этой рекомендации: https://github.com/lyst/lightfm/issues/369):
#Add X users to Test so that the number of rows in Train match Test
N = train.shape[0] #Rows in Train set
n,m = test.shape #Rows & columns in Test set
z = np.zeros([(N-n),m]) #Create the necessary rows of zeros with m columns
test = test.todense() #Temporarily convert Test into a numpy array
test = np.vstack((test,z)) #Vertically stack Test on top of the blank users
test = sparse.csr_matrix(test) #Convert back to sparse
2) После того, как проблема с формой была решена, я попытался реализовать "train_interactions = train"
Но столкнулся с Матрица тестовых взаимодействий и матрица взаимодействий поездов разделяют 68 inter действия. Это приведет к неправильной оценке, проверьте разделение данных.
И я не уверен, как решить эту вторую проблему. Есть идеи?
Подробности:
- "sparse_features_matrix "является разреженной матрицей {items x category}, где, если бы элемент был" Italian "и" Pizza ", то категории" Italian "и" Pizza "имели бы значение" 1 "для строки этого элемента ..." 0 "elsewhere.
-" sparse_Rating_Matrix "- это разреженная матрица из {users x items}, содержащая значения пользовательских оценок ресторана (item).
04/08/2020 Обновление:
LightFM У меня есть целый объект класса Database (), который вы должны использовать для подготовки набора данных перед оценкой модели. Я нашел отличный пост на github (https://github.com/lyst/lightfm/issues/494), где пользователь Med-ELOMARI предлагает потрясающий обзор небольшой набор тестовых данных.
Когда я подготовил свои данные с помощью этого метода, я смог добавить user_features, которые я хотел смоделировать (например, User_1592 любит блюда "тайской", "мексиканской", "суши" кухни). ).
За турбо коммен t, я использовал метод random_train_test_split LightFM (первоначально разделил мои данные с помощью метода train_test_split sklearn) и запустил auc_score с новыми наборами поездов / тестов И с правильно (насколько я знаю) подготовленной моделью, которую я до сих пор сталкиваюсь с тем же кодом ошибки:
Ввод:
%%time
(train,test) = random_train_test_split(lightfm_interactions,test_percentage=0.25) #LightFM's method to split
# Don't forget the pass in the item features again!
train_auc = auc_score(model_users,
train,
user_features=lightfm_user_features_list,
num_threads=NUM_THREADS).mean()
print('User_feature training set AUC: %s' % train_auc)
test_auc = auc_score(model_users,
test,
#train_interactions=train, #Still can't get this to function
user_features=lightfm_user_features_list,
num_threads=NUM_THREADS).mean()
print('User_feature test set AUC: %s' % test_auc)
Вывод, если используется "train_interactions = train":
ValueError: Test interactions matrix and train interactions matrix share 435 interactions. This will cause incorrect evaluation, check your data split.
Однако хорошая новость --- путем переключения с sklearn's train_test_split на LightFM's random_train_test_split AU C показатель моей модели изменился с 0,49 до 0,96 на тренировках. Поэтому я думаю, что важно придерживаться методов LightFM, если они доступны!