LightFM как делать прогнозы для новых пользователей (холодный старт) - идентификатор пользователя 8 не в сопоставлении идентификаторов пользователей

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

мой пользовательский фрейм данных:

    User-Id name    age los ou  gender  skills
0   1   Luis    21  IFS architecture    M   python
1   2   Peter   22  ADV pmo M   pm
2   3   Jurgen  23  IFS architecture    M   sql
3   4   Bart    24  IFS architecture    M   python
4   5   Cristina    25  ADV pmo F   pm
5   6   Lambert 33  IFS development M   sql
6   7   Rahul   44  IFS development M   python

Мой фрейм данных trainingds

Training-Id training name   main skill
0   1   basic python    python
1   2   advanced python python
2   3   basic scrum pm
3   4   advanced scrum  pm
4   5   basic sql   sql
5   6   advanced sql    sql

Мое обучение взяло фрейм данных (10 означает, что пользователь прошел это обучение) так что мой вес всего 10 с

User-Id Training-Id TrainingTaken
0   1   1   10
1   1   2   10
2   2   3   10
3   2   4   10
4   3   5   10
5   3   6   10
6   4   1   10
7   4   2   10

Я нашел этого отличного помощника для создания матриц: https://github.com/Med-ELOMARI/LightFM-Dataset-Helper

Так:

items_column = "Training-Id"
user_column = "User-Id"
ratings_column = "TrainingTaken"

items_feature_columns = [
    "training name",
    "main skill"
]

user_features_columns = ["name","age","los","ou", "gender", "skills"]

dataset_helper_instance = DatasetHelper(
    users_dataframe=usersdf,
    items_dataframe=trainingsdf,
    interactions_dataframe=trainingstakendf,
    item_id_column=items_column,
    items_feature_columns=items_feature_columns,
    user_id_column=user_column,
    user_features_columns=user_features_columns,
    interaction_column=ratings_column,
    clean_unknown_interactions=True,
)

# run the routine
# you can alslo run the steps separately one by one | routine function is simplifying the flow
dataset_helper_instance.routine()

вышеупомянутый помощник возвращает матрицу взаимодействия, матрицу весов и т. д.

dataset_helper_instance.weights.todense()
Output menu
matrix([[10., 10.,  0.,  0.,  0.,  0.],
        [ 0.,  0., 10., 10.,  0.,  0.],
        [ 0.,  0.,  0.,  0., 10., 10.],
        [10., 10.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)


dataset_helper_instance.interactions.todense()

matrix([[1., 1., 0., 0., 0., 0.],
        [0., 0., 1., 1., 0., 0.],
        [0., 0., 0., 0., 1., 1.],
        [1., 1., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0., 0.]], dtype=float32)

Затем я тренирую тестовый сплит и подгоняю модель

from lightfm import LightFM
from lightfm.cross_validation import random_train_test_split
(train, test) = random_train_test_split(interactions=dataset_helper_instance.interactions, test_percentage=0.2)

model = LightFM(loss='warp')

model.fit(
    interactions=dataset_helper_instance.interactions,
    sample_weight=dataset_helper_instance.weights,
    item_features=dataset_helper_instance.item_features_list,
    user_features=dataset_helper_instance.user_features_list,
    verbose=True,
    epochs=50,
    num_threads=20,
)

Затем я проверяю AUC и точность:

from lightfm.evaluation import precision_at_k
from lightfm.evaluation import auc_score

train_precision = precision_at_k(model, train,item_features=dataset_helper_instance.item_features_list, user_features=dataset_helper_instance.user_features_list , k=10).mean()
test_precision = precision_at_k(model, test, item_features=dataset_helper_instance.item_features_list, user_features=dataset_helper_instance.user_features_list,k=10).mean()
train_auc = auc_score(model, train,item_features=dataset_helper_instance.item_features_list, user_features=dataset_helper_instance.user_features_list).mean()
test_auc = auc_score(model, test,item_features=dataset_helper_instance.item_features_list, user_features=dataset_helper_instance.user_features_list).mean()
print('Precision: train %.2f, test %.2f. '% (train_precision, test_precision))
print('AUC: train %.2f, test %.2f.' % (train_auc, test_auc))

Precision: train 0.15, test 0.10. 
AUC: train 0.90, test 1.00.

Затем я делаю прогнозы для существующего пользователя

scores = model.predict(user_ids=6, item_ids=[1,2,3,5,6])
print(scores)

[ 0.01860116 -0.20987387  0.06134995  0.08332028  0.13678455]

Отлично, я могу получить прогнозы тренировок для пользователя с идентификатором 6.

Теперь я хочу сделать прогноз для новых пользователей (холодный старт)

Я пробовал следующее:

dataset = Dataset()
new_user_feature = [8,{'name:John', 'Age:33', 'los:IFS','ou:development', 'skills:sql'} ]    
new_user_feature = [8,new_user_feature]
new_user_feature = dataset.build_user_features([new_user_feature])
#predict new users User-Id  name    age los ou  gender  skills
model.predict(0, item_ids=[1,2,3,5,6], user_features=new_user_feature)

Однако я получаю эту ошибку:

ValueError: user id 8 not in user id mappings.

Что мне здесь не хватает?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не могу проверить это, но я думаю, что проблема в том, когда вы пишете:

new_user_feature = [8,{'name:John', 'Age:33', 'los:IFS','ou:development', 'skills:sql'} ]    
new_user_feature = [8,new_user_feature]

Согласно документации, dataset.build_user_features(..) требуется итерация вида (user id, [list of feature names]) или (user id, {feature name: feature weight}).

В вашем случае, я думаю, вы должны заменить две строки выше только на:

new_user_feature = [8,{'name':'John', 'Age':33, 'los':'IFS','ou':'development', 'skills':'sql'} ]
# Is the gender missing?    

Если это не работает, возможно, формат ввода примерно такой:

new_user_feature = [8,['John', 33, 'IFS', 'development', 'sql'] ]    

Дайте мне знать, если это решит проблему

Другие вопросы по теме