基于MovieLens数据集高效生成用户观影二分类矩阵的方法
高效生成用户-电影二分类矩阵方案
你之前的实现速度慢是因为采用了嵌套循环+逐次DataFrame筛选的逻辑,属于纯Python层的迭代操作,时间复杂度极高。直接使用Pandas内置的矢量化运算方法可以大幅提升运行效率,具体实现如下:
方案1:使用pd.crosstab(最简洁,推荐)
pd.crosstab原生支持统计两个列的组合出现频次,刚好匹配需求:每个(userId, movieId)组合出现一次则标记为1,未出现则为0。
代码示例:
import pandas as pd # 1. 提取全量用户ID、电影ID列表 all_user_ids = sorted(ratings_df["userId"].unique()) all_movie_ids = sorted(movies_df["movieId"].unique()) # 2. 生成交叉统计矩阵 user_movie_matrix = pd.crosstab( index=ratings_df["userId"], columns=ratings_df["movieId"] ) # 3. 补全所有用户、电影的组合,缺失值填充为0 user_movie_matrix = user_movie_matrix.reindex( index=all_user_ids, columns=all_movie_ids, fill_value=0 )
方案2:使用pivot_table
如果更熟悉透视表语法,也可以用pivot_table实现相同效果:
user_movie_matrix = ratings_df.pivot_table( index="userId", columns="movieId", aggfunc="size", # 统计组合出现次数 fill_value=0 ).reindex( index=all_user_ids, columns=all_movie_ids, fill_value=0 )
性能说明
- 原嵌套列表推导式的时间复杂度为O(U*M)(U为用户总数,M为电影总数),且每次迭代都要触发Python层的DataFrame过滤操作,MovieLens small数据集下通常需要几秒到几十秒才能跑完。
- 上述内置方法底层为C实现的矢量化运算,相同数据集下运行耗时在100ms以内,效率提升百倍以上。
内容的提问来源于stack exchange,提问作者OverFitter
相关产品推荐
相关产品推荐

