如何将 Pandas 数据帧加载到 Surprise 数据集中?

How to load Pandas dataframe into Surprise dataset?

我正在根据用户对 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)

谁能帮我解决这个错误?

问题出在您将字典转换为 pandas 数据框的方式。要使 Dataset 能够处理 pandas 数据帧,您只需要三列。第一列应该是用户 ID,第二列是项目 ID,第三列是实际评分。 这就是我构建数据框的方式,该数据框将 运行 in "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)

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