构建推荐系统矩阵遇超大数据集、int32溢出问题该如何解决?
报错原因
这个错误是旧版本Pandas(<1.3.0)中unstack操作底层默认用int32类型存储位置索引,当生成的透视表总元素数超过int32最大值(2^31-1 ≈21亿)时就会触发溢出,和你当前超大规模数据集的场景匹配。
可用解决方案
升级Pandas版本(首选方案)
Pandas 1.3.0及以上版本已经将unstack底层的索引类型替换为int64,可直接解决int32溢出问题,不需要修改原有代码。使用稀疏矩阵存储(推荐,适配交易矩阵稀疏特性)
交易-商品组矩阵通常大部分为空缺值,用稀疏格式存储可减少90%以上内存占用,同时规避溢出问题,示例代码如下:from scipy.sparse import coo_matrix # 将分类列转为category类型获取编码 df["transaction_id"] = df["transaction_id"].astype("category") df["product_group"] = df["product_group"].astype("category") # 直接构造稀疏矩阵 row_idx = df["transaction_id"].cat.codes col_idx = df["product_group"].cat.codes sparse_pivot = coo_matrix( (df["ratings"], (row_idx, col_idx)), shape=( df["transaction_id"].cat.categories.size, df["product_group"].cat.categories.size ) ) # 若需要转回Pandas格式,使用稀疏DataFrame接口 pivot_df = pd.DataFrame.sparse.from_spmatrix( sparse_pivot, index=df["transaction_id"].cat.categories, columns=df["product_group"].cat.categories )分块处理
如果不方便升级版本也不想引入scipy依赖,可以对交易ID做分块,单次处理一小块数据做透视后再拼接:import numpy as np # 拆分唯一交易ID为10个块,可根据内存调整块数 unique_txn = df["transaction_id"].unique() txn_chunks = np.array_split(unique_txn, 10) pivot_chunks = [] for chunk in txn_chunks: chunk_df = df[df["transaction_id"].isin(chunk)] pivot_chunks.append(chunk_df.pivot(index="transaction_id", columns="product_group", values="ratings")) final_pivot = pd.concat(pivot_chunks, axis=0)优化列数据类型
将transaction_id、product_group改为category类型,ratings根据取值范围改为更小的数值类型(比如评分取值1-5可改为int8),降低整体数据内存占用,也能降低溢出概率。
内容的提问来源于stack exchange,提问作者Ad Astra
相关产品推荐
相关产品推荐

