Python使用efficient_apriori处理1200万电商数据的提速方案咨询
关联规则计算加速可行方案
- 预处理阶段优化,降低数据规模
读csv时指定数据类型减少内存占用,加快读写速度;提前过滤掉出现次数小于最小支持度阈值(你场景中是100)的商品,这部分商品不可能出现在符合要求的频繁项集里,直接删除能大幅减少后续计算量;聚合环节可以先按id_customer排序后用itertools.groupby生成交易元组,比pandas的groupby在超大数据量下效率更高。
优化后预处理代码示例:import pandas as pd from itertools import groupby # 读数据时指定dtype减少内存开销 orders = pd.read_csv( "orders.csv", sep=";", dtype={"id_customer": "int32", "name": "category"} ) # 过滤出现次数小于100的低频商品 item_counts = orders["name"].value_counts() valid_items = item_counts[item_counts >= 100].index orders = orders[orders["name"].isin(valid_items)] # 按用户id排序后聚合 orders = orders.sort_values("id_customer") customer = [tuple(g[1]) for g in groupby(orders["name"], orders["id_customer"])] # 可提前把处理好的交易数据存下来,后续不用重复处理 import pickle with open("transactions.pkl", "wb") as f: pickle.dump(customer, f) - 替换更高效的算法实现
Apriori算法本身需要多次扫描全量数据集,天然不适合超大数据量,建议替换为FP-Growth算法,仅需扫描2次数据集,计算效率提升可达1-2个量级,可直接使用fpgrowth-py等优化过的库实现,示例代码:
如果需要保留Apriori逻辑,也可替换为C扩展实现的版本,比纯Python实现的from fpgrowth import fpgrowth import pickle with open("transactions.pkl", "rb") as f: customer = pickle.load(f) itemsets = fpgrowth(customer, min_support=100/len(customer)) # 后续生成关联规则可自行实现或用配套工具efficient_apriori快5-10倍。 - 运行环境拆分优化
你提到PyPy不支持pandas,可将任务拆分为两个独立步骤:用CPython完成pandas相关的预处理工作,把生成的交易列表序列化存储后,用PyPy单独加载数据运行关联规则计算部分,这部分逻辑不依赖pandas,可完全享受PyPy的执行速度提升。 - 分布式算力扩展
若单机性能仍不满足要求,可使用Spark MLlib中的FPGrowth实现,单机local模式即可自动利用多核CPU并行计算,集群模式下可轻松处理千万级甚至亿级数据量。
内容的提问来源于stack exchange,提问作者vojta
相关产品推荐
相关产品推荐

