09 关联规则挖掘(Association Rule Mining)

核心问题:"买了A的顾客,有多大可能性也会买B?"

经典案例:"啤酒与尿布" ------ 发现看似无关的商品之间隐藏的关联。


一、基础概念:看懂"购物篮"数据

1.1 事务(Transaction)与项(Item)

  • 事务:一条交易记录。比如:"顾客A在2023年1月1日购买的商品清单"。

  • :事务中的每一个商品。比如:{牛奶, 面包, 啤酒}。

1.2 项集(Itemset)

  • 包含一个或多个项的集合。

  • k-项集 :包含 k 个项的集合。例如:{牛奶, 面包} 是一个 2-项集

1.3 支持度计数(Support Count, σ)

  • 某个项集在所有事务中出现的次数

  • 记法:σ({牛奶,面包})=4,表示有4笔订单同时包含牛奶和面包。


二、关联规则与两大核心指标

一条关联规则形如:X → Y (读作"X 推导出 Y"),其中 X 和 Y 是不相交的项集(例如 {牛奶} → {面包})。

判断这条规则是否有用,主要看两个数值:

2.1 支持度(Support)

  • 公式(N 为总事务数)

  • 含义 :同时包含 X 和 Y 的事务,占总事务的比例

  • 作用 :衡量规则在数据中出现的频率。太低的规则没有统计意义。

2.2 置信度(Confidence)

  • 公式

  • 含义 :在包含 X 的事务中,同时包含 Y 的条件概率 P(Y∣X)。

  • 作用 :衡量规则的强度,即"买了 X 的人,有多大几率也买 Y"。

💡 手算示例(总事务数 N=1000):

  • 包含"茶"的事务:200个(σ(茶)=200)

  • 同时包含"茶"和"咖啡"的事务:150个

  • 规则 {茶} → {咖啡}

    • 支持度 = 150 / 1000 = 15%

    • 置信度 = 150 / 200 = 75%

解读:所有订单中有15%同时买了茶和咖啡;在买茶的顾客中,75%也买了咖啡。

2.3 挖掘目标

给定两个阈值:最小支持度(minsup)最小置信度(minconf) ,找出所有满足 支持度 ≥ minsup置信度 ≥ minconf 的规则。


三、暴力拆解:关联规则挖掘的两步走

直接暴力搜索所有规则是不现实的。假设有 d 个不同的商品,所有可能的规则数量惊人:

例如 d=6(6种商品),就有 602 条规则需要检验;如果 d=100,规则数量将远超宇宙原子数!

因此,我们分两步走:

  1. 频繁项集生成 :找出所有支持度 ≥ minsup 的项集(称为频繁项集)。

  2. 规则生成:从每个频繁项集中,枚举所有可能的划分(X → Y),筛选出置信度 ≥ minconf 的规则。

核心策略:先找"常客"(频繁项集),再看"搭配"(高置信度)


四、Apriori 算法:最经典的频繁项集挖掘算法

4.1 核心原则(Apriori Principle)

"如果一个项集是频繁的,那么它的所有子集也一定是频繁的。"

(反过来说:"如果一个项集是非频繁的,那么它的所有超集一定是非频繁的。")

🚀 剪枝应用(避开计算爆炸)

假设我们发现 {A, B} 是不频繁的(低于 minsup)。

那么,任何包含 {A, B} 的超集(如 {A, B, C}, {A, B, D, E})一定也是不频繁的,可以直接丢弃,无需再计算它们的支持度!

4.2 算法流程(逐层搜索)

  1. 生成候选1-项集 :扫描数据,剔除不频繁的,得到 频繁1-项集(L₁)

  2. 生成候选2-项集(C₂):将 L₁ 中的项两两组合。

  3. 剪枝 :扫描数据计算 C₂ 的支持度,剔除不频繁的,得到 频繁2-项集(L₂)

  4. 循环:用 L₂ 生成候选3-项集(C₃)... 直到无法生成新的频繁项集为止。

4.3 候选项集生成详解(连接步与剪枝步)

  • Step 1:连接(Join)

    将两个只有最后一个项不同的频繁3-项集合并。

    • 例如:{A, B, C} 和 {A, B, D} 合并 → {A, B, C, D}
  • Step 2:剪枝(Prune)

    根据Apriori原则,检查新生成的4-项集的所有3-项子集是否都在中。

    如果有一个3-项子集不在 中,该4-项集就不可能是频繁的,直接删除!

🔥 PPT手算验证(重点)

假设

  • 连接生成:ABCD(ABC+ABD)、ABCE(ABC+ABE)、ABDE(ABD+ABE)。

  • 剪枝检验 ABCE :它的子集 ACE 和 BCE 不在 F3 中 → 删除

  • 剪枝检验 ABDE :它的子集 ADE 不在 F3 中 → 删除

  • 保留 ABCD :其子集 ABC, ABD, ACD, BCD 全部在 F3 中 → 保留

    最终 C4={ABCD}C4​={ABCD},完美符合 PPT。

4.4 支持度计数加速:Hash 树

当候选集非常多时,Apriori 使用 Hash 树(哈希树) 来存储候选项集。遍历每个事务时,只需将事务中的项集哈希到树的特定叶子节点进行匹配,大大减少了比较次数。


五、规则生成:从频繁项集中提炼"高价值"规则

拿到频繁项集 Y 后,我们要把它分成两部分:前提(LHS)结论(RHS)

5.1 置信度剪枝原理(重要定理)

定理 :如果规则 X→Y−X不满足置信度阈值,那么将 X缩小为 X′(即 X′⊂X)后,新规则 X′→Y−X′也一定不满足置信度阈值。

通俗理解 :如果"A+B → C"不可靠,那么"A → B+C"会更不可靠(因为前提条件更少,样本更多,误差波动更大)。基于此原理,我们可以在规则生成时大胆剪枝,只从频繁项集的最大子集开始递推。


六、频繁项集的紧致表示(压缩存储)

随着数据增大,频繁项集数量可能爆炸。我们有两种方法压缩它们:

6.1 极大频繁项集(Maximal Frequent Itemset)

  • 定义 :如果一个频繁项集的所有直接超集都是非频繁的,它就是极大频繁项集。

  • 作用 :它确定了频繁项集的边界。其所有子集必定是频繁的,但它本身丢失了子集的具体支持度信息。

6.2 闭频繁项集(Closed Frequent Itemset)

  • 定义 :如果项集 X 的所有直接超集 的支持度计数都小于 X 的支持度计数,则 X是闭项集。如果 X 同时是频繁的,称为闭频繁项集。

  • 优势:比极大频繁项集保留了更多的支持度信息,同时大大压缩了项集数量。

类型 保留支持度信息? 典型用途
极大频繁项集 不保留(只知边界) 快速判断一个项集是否频繁
闭频繁项集 保留(精确支持度) 更精准地恢复所有频繁项集的支持度

七、评估标准:置信度的陷阱与更优度量

高置信度不一定代表"强关联",甚至可能是误导!

7.1 置信度的局限性(PPT 经典案例)

数据

  • P(咖啡)=0.8(80%的人买咖啡)

  • P(咖啡∣茶)=0.75(喝茶的人中75%买咖啡)

矛盾 :虽然置信度 0.75 很高,但 喝茶反而降低了买咖啡的概率 (因为总体是 0.8)。这规则是误导性的!它只是咖啡整体热销的假象。

7.2 提升度(Lift)------ 解决误导的关键

计算上面的例子

  • 规则 {茶} → {咖啡}:Lift = 0.75 / 0.8 = 0.9375(<1)。

  • 结论:虽然置信度高,但茶和咖啡实际上是负相关的(抑制关系)。而如果另一个规则 {茶} → {蜂蜜},置信度 0.5,P(蜂蜜)=0.12,Lift=0.5/0.12≈4.17(>1),这才是真正有意义的强关联!

7.3 辛普森悖论(Simpson's Paradox)

警告:聚合数据看起来的关联,在细分群体中可能完全相反!

PPT例子 :整体上看,买 HDTV 的人更倾向于买健身器(置信度 0.55 vs 不买的 0.45)。

但将人群分为大学生在职人员后:

  • 大学生组:买 HDTV 的反而更少买健身器(0.1 vs 0.118)。

  • 在职组:差距也变得极小。

    结论 :数据分组后,之前的"强关联"消失了。这说明忽略了潜在混杂因素(如收入、年龄),挖掘时需警惕!


八、本章核心公式与要点速记卡


九、总结:实战建议

  1. 先设最小支持度:过滤掉噪音(太冷门的商品搭配没意义)。

  2. 提升度比置信度重要:高置信度 + 提升度 > 1,才是真正靠谱的"捆绑销售"依据。

  3. 注意辛普森悖论:在对整体数据做关联分析后,一定要按关键维度(如地区、用户等级)分层验证,防止被虚假关联欺骗。

  4. 算法选择

    • 传统小数据:Apriori 足够。

    • 大数据(亿级事务) :使用 FP-Growth (不产生候选集,直接压缩数据)或 PCY 等改进算法。