一些建议是降级到 pandas==0.21,这不是一个真正可行的解决方案!
我遇到了同样的问题,需要紧急修复意外的 int32 溢出。我们的推荐模型之一在生产中运行,并且在某个时候,用户群数量增加到超过 700 万条记录,大约 21k 项。
所以,为了解决我提到的@igorkf 对数据集进行分块的问题,使用 unstack 创建数据透视表并逐渐附加它。
import pandas as pd
from tqdm import tqdm
chunk_size = 50000
chunks = [x for x in range(0, df.shape[0], chunk_size)]
for i in range(0, len(chunks) - 1):
print(chunks[i], chunks[i + 1] - 1)
0 49999
50000 99999
100000 149999
150000 199999
200000 249990
.........................
pivot_df = pd.DataFrame()
for i in tqdm(range(0, len(chunks) - 1)):
chunk_df = df.iloc[ chunks[i]:chunks[i + 1] - 1]
interactions = (chunk_df.groupby([user_col, item_col])[rating_col]
.sum()
.unstack()
.reset_index()
.fillna(0)
.set_index(user_col)
)
print (interactions.shape)
pivot_df = pivot_df.append(interactions, sort=False)
然后我必须制作一个稀疏矩阵作为 lightFM 推荐模型的输入(运行矩阵分解算法)。您可以将它用于需要拆垛的任何用例。使用以下代码,转换为稀疏矩阵-
from scipy import sparse
import numpy as np
sparse_matrix = sparse.csr_matrix(df_new.to_numpy())
注意:Pandas 有 pivot_table 功能,如果您的数据很小,可以使用该功能进行拆垛。就我而言,pivot_table 真的很慢。