Как загрузить Pandas фрейм данных в набор данных Surprise? - PullRequest
0 голосов
/ 07 августа 2020

Я создаю рекомендательную систему на основе оценок пользователей для 11 различных элементов.

Я начал со словаря (user_dict) оценок пользователей:

{'U1': [3, 4, 2, 5, 0, 4, 1, 3, 0, 0, 4], 
 'U2': [2, 3, 1, 0, 3, 0, 2, 0, 0, 3, 0], 
 'U3': [0, 4, 0, 5, 0, 4, 0, 3, 0, 2, 4], 
 'U4': [0, 0, 2, 1, 4, 3, 2, 0, 0, 2, 0], 
 'U5': [0, 0, 0, 5, 0, 4, 0, 3, 0, 0, 4], 
 'U6': [2, 3, 4, 0, 3, 0, 3, 0, 3, 4, 0], 
 'U7': [0, 4, 3, 5, 0, 5, 0, 0, 0, 0, 4], 
 'U8': [4, 3, 0, 3, 4, 2, 2, 0, 2, 3, 2], 
 'U9': [0, 2, 0, 3, 1, 0, 1, 0, 0, 2, 0], 
 'U10': [0, 3, 0, 4, 3, 3, 0, 3, 0, 4, 4],  
 'U11': [2, 2, 1, 2, 1, 0, 2, 0, 1, 0, 2], 
 'U12': [0, 4, 4, 5, 0, 0, 0, 3, 0, 4, 5], 
 'U13': [3, 3, 0, 2, 2, 3, 2, 0, 2, 0, 3], 
 'U14': [0, 3, 4, 5, 0, 5, 0, 0, 0, 4, 0], 
 'U15': [2, 0, 0, 3, 0, 2, 2, 3, 0, 0, 3], 
 'U16': [4, 4, 0, 4, 3, 4, 0, 3, 0, 3, 0], 
 'U17': [0, 2, 0, 3, 1, 0, 2, 0, 1, 0, 3], 
 'U18': [2, 3, 1, 0, 3, 2, 3, 2, 0, 2, 0], 
 'U19': [0, 5, 0, 4, 0, 3, 0, 4, 0, 0, 5], 
 'U20': [0, 0, 3, 0, 3, 0, 4, 0, 2, 0, 0], 
 'U21': [3, 0, 2, 4, 2, 3, 0, 4, 2, 3, 3], 
 'U22': [4, 4, 0, 5, 3, 5, 0, 4, 0, 3, 0], 
 'U23': [3, 0, 0, 0, 3, 0, 2, 0, 0, 4, 0], 
 'U24': [4, 0, 3, 0, 3, 0, 3, 0, 0, 2, 2], 
 'U25': [0, 5, 0, 3, 3, 4, 0, 3, 3, 4, 4]}

Затем я загрузил словарь в фрейм данных Pandas с помощью этого кода:

df=  pd.DataFrame(user_dict)
userRatings_df = df.T
print(userRatings_df)

Это печатает данные следующим образом:

     0  1  2  3  4  5  6  7  8  9  10
U1   3  4  2  5  0  4  1  3  0  0   4
U2   2  3  1  0  3  0  2  0  0  3   0
U3   0  4  0  5  0  4  0  3  0  2   4
U4   0  0  2  1  4  3  2  0  0  2   0
U5   0  0  0  5  0  4  0  3  0  0   4
U6   2  3  4  0  3  0  3  0  3  4   0
U7   0  4  3  5  0  5  0  0  0  0   4
U8   4  3  0  3  4  2  2  0  2  3   2
U9   0  2  0  3  1  0  1  0  0  2   0
U10  0  3  0  4  3  3  0  3  0  4   4
U11  2  2  1  2  1  0  2  0  1  0   2
U12  0  4  4  5  0  0  0  3  0  4   5
U13  3  3  0  2  2  3  2  0  2  0   3
U14  0  3  4  5  0  5  0  0  0  4   0
U15  2  0  0  3  0  2  2  3  0  0   3
U16  4  4  0  4  3  4  0  3  0  3   0
U17  0  2  0  3  1  0  2  0  1  0   3
U18  2  3  1  0  3  2  3  2  0  2   0
U19  0  5  0  4  0  3  0  4  0  0   5
U20  0  0  3  0  3  0  4  0  2  0   0
U21  3  0  2  4  2  3  0  4  2  3   3
U22  4  4  0  5  3  5  0  4  0  3   0
U23  3  0  0  0  3  0  2  0  0  4   0
U24  4  0  3  0  3  0  3  0  0  2   2
U25  0  5  0  3  3  4  0  3  3  4   4

Когда я пытаюсь загрузить в набор данных Surprise, я запускаю этот код :

reader = Reader(rating_scale=(1,5))

userRatings_data=Dataset.load_from_df(userRatings_df[[1,2,3,4,5,6,7,8,9,10]], 
reader)

Я получаю эту ошибку:

ValueError: too many values to unpack (expected 3)

Может ли кто-нибудь помочь мне исправить эту ошибку?

1 Ответ

0 голосов
/ 07 августа 2020

Проблема заключается в том, как вы конвертируете свой словарь в pandas фрейм данных. Чтобы набор данных мог обрабатывать фрейм данных pandas, вам потребуется всего три столбца. Первый столбец должен быть идентификатором пользователя, второй столбец - идентификатором элемента, а третий столбец - фактическим рейтингом. Вот как я бы создал фреймворк, который работал бы в «Dataset»:

DF = pd.DataFrame()
for key in user_dict.keys():
    df = pd.DataFrame(columns=['User', 'Item', 'Rating'])
    df['Rating'] = pd.Series(user_dict[key])
    df['Item'] = pd.DataFrame(df.index)
    df['User'] = key

    DF = pd.concat([DF, df], axis = 0)

DF = DF.reset_index(drop=True)

Если вы обратите внимание, я беру каждый ключ из словаря, который по сути является идентификатором пользователя, превращаю его в Столбец pandas вместе с рейтингами и индексами рейтингов, который будет столбцом для необработанных идентификаторов элементов. Затем из каждого ключа я создаю временный фрейм данных, который накладывается друг на друга в конечном и основном фрейме данных. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...