你就当自己是医生,想从病人数据里找出 “哪些症状一起出现时,大概率是感冒”—— 这就是关联规则挖掘要干的事。
先看一个简单的 “病人数据集”
假设我们收集了 5 个病人的病例(每条就是一个 “事务”,症状就是 “项目”):
病人 ID |
症状(项目) |
诊断结果 |
1 号 |
发烧、咳嗽、嗓子痛 |
感冒 |
2 号 |
发烧、咳嗽、头痛 |
感冒 |
3 号 |
发烧、嗓子痛 |
感冒 |
4 号 |
头痛、腹泻 |
肠胃炎 |
5 号 |
咳嗽、嗓子痛 |
感冒 |
我们的目标:从这些数据里找出 “哪些症状组合” 和 “感冒” 强相关,比如 “如果发烧 + 咳嗽,那么大概率是感冒”。
第一步:找 “频繁项集”—— 哪些症状经常一起出现?
“频繁项集” 就是 “经常同时出现的症状组合”。这里需要先定一个 “最小支持度”(可以理解为 “至少出现几次才算频繁”)。假设我们定最小支持度 = 2 次(至少在 2 个病人身上出现)。
- 找 “频繁 1 项集”(单个高频症状):
所以频繁 1 项集有:{发烧}、{咳嗽}、{嗓子痛}、{头痛}
-
- 发烧:在 1、2、3 号病人出现 → 出现 3 次(≥2)→ 算频繁项集
- 咳嗽:在 1、2、5 号病人出现 → 3 次 → 算
- 嗓子痛:在 1、3、5 号病人出现 → 3 次 → 算
- 头痛:在 2、4 号出现 → 2 次 → 算
- 腹泻:只在 4 号出现 → 1 次 → 不算(非频繁)
- 找 “频繁 2 项集”(两个症状经常一起出现):
所以频繁 2 项集有:{发烧,咳嗽}、{发烧,嗓子痛}、{咳嗽,嗓子痛}
-
- 发烧 + 咳嗽:在 1、2 号出现 → 2 次(≥2)→ 算
- 发烧 + 嗓子痛:在 1、3 号出现 → 2 次 → 算
- 咳嗽 + 嗓子痛:在 1、5 号出现 → 2 次 → 算
- 发烧 + 头痛:只在 2 号出现 → 1 次 → 不算
- ...(其他组合出现次数不够,都不算)
- 找 “频繁 3 项集”(三个症状一起出现):
到这里,最大的频繁项集就是 2 项集。
-
- 发烧 + 咳嗽 + 嗓子痛:只在 1 号出现 → 1 次 → 不够 → 不算
第二步:从频繁项集里找 “强关联规则”
有了频繁项集,就可以生成 “如果 A,那么 B” 的规则,再用 “置信度”(规则靠谱吗)筛选。假设最小置信度 = 0.8(80% 以上靠谱)。
- 从 {发烧,咳嗽} 生成规则:
- 规则:发烧→咳嗽(如果病人发烧,那么他同时咳嗽的概率)
计算:发烧的病人有 3 个(1、2、3 号),其中同时咳嗽的有 2 个(1、2 号)→ 置信度 = 2/3≈67% <80% → 不靠谱
-
- 规则:咳嗽→发烧(如果病人咳嗽,那么他同时发烧的概率)
咳嗽的病人有 3 个(1、2、5 号),其中同时发烧的有 2 个(1、2 号)→ 置信度 = 2/3≈67% <80% → 不靠谱
-
- 规则:{发烧,咳嗽}→感冒(如果病人又发烧又咳嗽,那么他得感冒的概率)
发烧 + 咳嗽的病人有 2 个(1、2 号),这 2 个都诊断为感冒 → 置信度 = 2/2=100% ≥80% → 强规则!
- 从 {咳嗽,嗓子痛} 生成规则:
- 规则:{咳嗽,嗓子痛}→感冒
咳嗽 + 嗓子痛的病人有 2 个(1、5 号),都得感冒 → 置信度 = 100% ≥80% → 强规则!
总结:用关联规则挖掘到的医学结论
通过上面的步骤,我们从数据中挖出了两条靠谱的规则:
- 如果病人同时有 “发烧 + 咳嗽”,那么有 100% 的概率是感冒;
- 如果病人同时有 “咳嗽 + 嗓子痛”,那么有 100% 的概率是感冒。
这就是关联规则挖掘的核心:先找 “经常一起出现的项目”(频繁项集),再从里面挑 “靠谱的如果… 那么…”(强关联规则)。
再回头看算法
- Apriori 算法:就像我们上面一步步找的过程 —— 先找单个频繁症状,再找两个的组合,组合里如果包含 “不频繁的症状”(比如腹泻)就直接扔掉(剪枝),效率更高;
- FP-growth 算法:更聪明,把所有症状的关系画成一棵 “树”,不用像 Apriori 那样反复扫描数据,直接从树上找频繁项集,速度更快。
不管用哪种算法,最终目的都是帮我们从杂乱的数据中,挖出像 “症状 A + 症状 B→疾病 C” 这样的实用规律,这就是关联规则挖掘的价值啦。