【问题标题】:How to load Pandas dataframe into Surprise dataset?如何将 Pandas 数据框加载到 Surprise 数据集中?
【发布时间】:2020-08-07 13:08:28
【问题描述】:

我正在构建一个基于用户对 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)

谁能帮我解决这个错误?

【问题讨论】:

标签: python pandas recommender-systems


【解决方案1】:

问题出在您将字典转换为 pandas 数据框的方式上。要使 Dataset 能够处理 pandas 数据框,您只需要三列。第一列应该是用户 ID,第二列是项目 ID,第三列是实际评分。 这就是我将如何构建一个将在“数据集”中运行的数据框:

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)

如果你注意的话,我会从字典中取出每个键,它本质上是一个用户 ID,将它变成一个 pandas 列,以及评级和评级的索引,这将是原始项目 ID 的列。然后,我从每个键构建一个临时数据帧,该数据帧在最终数据帧和主数据帧中相互堆叠。 希望这会有所帮助。

【讨论】:

  • 非常感谢您的帮助!当我运行此代码时,我收到此错误:NameError: name 'rating' is not defined
  • @ChargingMuffin 对不起,是的,有一个错字,我编辑了我的答案。
猜你喜欢
  • 2016-09-19
  • 2016-06-08
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 2019-09-04
  • 2023-03-17
  • 2017-11-16
  • 2017-06-03
相关资源
最近更新 更多