Apriori函数要求输入为布尔型DataFrame,需用TransactionEncoder或get_dummies转换原始交易数据,并设置合理min_support(如0.05→0.01)避免内存爆炸;association_rules应结合support、confidence与lift(>3为强关联)筛选可执行规则。

Apriori 函数的输入必须是布尔型 DataFrame,不是原始商品列表
直接把 ['牛奶', '面包', '啤酒'] 这样的列表喂给 apriori() 会报错 TypeError: Data must be of type bool。它不接受字符串或类别型数据,只认 True/False —— 每行代表一次交易,每列代表一个商品,值为 True 表示该商品出现在这笔订单里。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
pandas.get_dummies()或mlxtend.preprocessing.TransactionEncoder转换原始交易数据 - 别漏掉
te_ary = te.fit(data).transform(data)后的转换步骤,否则仍是 list of list - 转成
DataFrame时务必指定列名(即商品名),否则后续规则分析无法识别项集含义
支持度阈值设太低会导致内存爆炸或计算卡死
apriori(df, min_support=0.01) 看似合理,但对万级交易、千级商品的超商数据,min_support=0.01 意味着只要出现 100 次就算频繁项集——可能生成数百万个候选项集,apriori() 会在第 3–4 层组合就耗尽内存或跑数小时。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 先用
df.sum().sum() / len(df)算出平均单笔订单商品数,再估算合理min_support:比如 5000 笔交易、平均每单 8 件,则支持度 ≥ 0.002(即 ≥10 次)已能覆盖多数有效组合 - 从高往低调:先试
min_support=0.05,看返回多少条频繁项集;若少于 20 条,再逐步降到 0.02、0.01 - 加
use_colnames=True和max_len=3限制项集长度,避免无意义的 5 商品组合
association_rules() 的 metric='confidence' 不等于“买了 A 就会买 B”的实际概率
置信度 confidence(A→B) = support(A∪B) / support(A) 是条件概率的估计,但它依赖 support(A) 的统计稳定性。如果 A 出现次数很少(比如仅 3 次),而其中 2 次都带 B,置信度高达 0.67,但这个数字毫无业务指导意义。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 过滤规则前,先用
rules[rules['support'] > 0.005]卡住最低支持度,排除小样本干扰 - 别只看
confidence,搭配lift:lift > 1 表示正相关,> 3 才算强关联;lift ≈ 1 说明 A 和 B 独立 - 导出结果时保留
antecedents和consequents的 frozenset,方便后续用list(x)[0]提取单品做推荐位排序
超商数据常含空交易或重复商品,不清洗会污染支持度计算
原始 POS 数据里常见两类噪声:一是整行为空(扫码失败/退单未删),二是同一订单中重复记录同一商品(如“牛奶×2”被拆成两行“牛奶”)。前者让分母变大,后者让分子虚高,最终所有支持度系统性偏低或偏高。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 加载后立刻执行
df = df.dropna(how='all')去空行,再用df = df.apply(lambda x: x.drop_duplicates(), axis=1)去单行内重复 - 检查是否有“未知”“促销赠品”“会员卡”等非商品类字段混入,它们会稀释真实商品的共现信号
- 对高频低毛利品(如矿泉水、口香糖),可考虑在编码前按
value_counts()截断,只保前 200 名商品,避免长尾干扰主规则挖掘
真正难的不是跑通 apriori(),而是判断哪条规则值得放进收银台弹窗——要看 lift 是否显著、支持度是否稳定、业务上是否可执行。比如“啤酒 → 尿布”在训练集上 lift=2.1,但如果门店根本不卖尿布,这条规则再漂亮也没用。


















