LightFM train_interactions, совместно используемые поездами и тестовыми наборами: это приведет к неправильной оценке, проверьте разделение данных - PullRequest
0 голосов
/ 02 апреля 2020

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, если они доступны!

1 Ответ

0 голосов
/ 07 апреля 2020

LightFM предоставляет способ разделения вашего набора данных, вы смотрели на него? С этим это может работать. https://making.lyst.com/lightfm/docs/cross_validation.html

...