pandas用pivot_table生成评分矩阵报int32溢出错误如何解决?
问题判断
你的操作逻辑没有错误。报错核心原因是全量评分矩阵规模远超pivot_table的处理上限:26744个movieId与138493个userId组合后总单元格数超过37亿,既触发了pivot_table底层int32类型的索引溢出,就算强行生成稠密矩阵也会占用超过100GB内存,完全不具备实际运行可行性。
解决方法
方法1:缩小输入数据集规模(论坛建议的落地实现)
通过过滤低活跃度用户、低热度电影压缩数据规模,可自行调整阈值匹配硬件性能:
# 计算用户评分次数、电影被评分次数 user_rating_count = ratings['userId'].value_counts() movie_rating_count = ratings['movieId'].value_counts() # 示例:保留评分≥20次的用户,和被评分≥50次的电影 valid_users = user_rating_count[user_rating_count >= 20].index valid_movies = movie_rating_count[movie_rating_count >= 50].index # 过滤得到小规模子数据集 small_ratings = ratings[ratings['userId'].isin(valid_users) & ratings['movieId'].isin(valid_movies)] # 再生成评分矩阵即可正常运行 ratings_matrix = small_ratings.pivot_table(index='movieId', columns='userId', values='rating').fillna(0) ratings_matrix.head(5)
方法2:使用稀疏矩阵存储(推荐,适配全量数据)
评分矩阵属于极度稀疏矩阵,99%以上的单元格都是空值,用稀疏矩阵存储可以完全避免内存浪费和溢出问题,适合需要处理全量数据的场景:
from scipy.sparse import csr_matrix # 对userId、movieId做连续编码,避免索引不连续浪费空间 ratings['user_code'] = ratings['userId'].astype('category').cat.codes ratings['movie_code'] = ratings['movieId'].astype('category').cat.codes # 生成稀疏评分矩阵 ratings_sparse = csr_matrix((ratings['rating'], (ratings['movie_code'], ratings['user_code'])))
后续的矩阵运算大多数机器学习库都可以直接适配csr格式的稀疏矩阵,不需要转成稠密矩阵。
方法3:使用分块计算框架
如果业务要求必须使用全量稠密矩阵做计算,可以换用Dask等支持分块计算的框架,将大矩阵拆分为多个小分块分批处理,规避内存和溢出限制。
内容的提问来源于stack exchange,提问作者hubbaka ghoyati
相关产品推荐
相关产品推荐

