核心问题:关联规则挖掘中,如何处理类别型属性和连续型属性?如何发现“先后顺序”上的规律?
第一部分:类别型属性的处理
1.1 类别型属性面临的挑战
类别型属性(如性别、职业、地区)在关联规则中常用作规则的前提(LHS)。但当某个属性取值过多或分布极不均匀时,会带来问题:
| 取值过多 | 每个取值对应的支持度可能都很低,无法满足最小支持度阈值 | 职业有100种,每种只出现1-2次 |
| 分布极不均匀 | 某个取值占比极高(如>85%),会产生大量冗余规则 | “个人电脑=是”占95%,几乎所有规则都带这个条件 |
| 二元化后项数爆炸 | 将类别属性转为二元属性(One-Hot)会大幅增加项的数量 | 100个职业 → 100个二元项 |
1.2 解决方案
① 分组聚合(Grouping)
-
将稀有的属性值归入“其他”类别。
-
例如:职业中的“工程师、程序员、架构师” → 归为“IT从业者”。
② 删除高占比属性
-
如果某个取值占比超过85%,该属性几乎没有区分能力,直接删除。
-
例如:“是否拥有个人电脑”若95%为“是”,则这个属性对挖掘几乎无用。
③ 避免互斥项集的候选
-
二元化后,同一个属性的两个取值(如“网上购物=是”和“网上购物=否”)是互斥的,它们永远不会在同一个事务中同时出现。
-
因此,任何同时包含这两个项的候选集支持度恒为0,应在候选生成阶段直接剔除,避免浪费计算资源。
第二部分:连续型属性的离散化方法
为了让关联规则算法能处理连续型属性(如年龄、收入、温度),需要将其转换为离散区间。以下是三种主流方法:
2.1 等宽法(Equal Width)
定义:将属性的值域均匀划分为 k 个等宽区间。
公式:区间宽度 = (max – min) / k
示例(年龄数据:18,22,25,28,30,33,35,40,45,50,55,60,65,70,k=3):
-
区间1 [18, 35.33):{18,22,25,28,30,33,35} → 7人
-
区间2 [35.33, 52.66):{40,45,50} → 3人
-
区间3 [52.66, 70]:{55,60,65,70} → 4人
优点:简单直观,计算快。
缺点:对异常值极其敏感;样本分布可能极不均衡(如上例,青年组7人,中年组仅3人)。
2.2 等深法(Equal Depth / Frequency)
定义:将数据划分为 k 个区间,每个区间包含大致相同数量的数据点。
示例(同上数据,k=3):
-
区间1 [18, 30]:{18,22,25,28,30} → 5人
-
区间2 (30, 50]:{33,35,40,45,50} → 5人
-
区间3 (50, 70]:{55,60,65,70} → 4人
优点:样本分布均衡,不受异常值影响。
缺点:可能将非常接近的值(如30和33)分到不同区间,丢失了"邻近性"信息。
2.3 基于聚类的划分(Clustering-based)
定义:使用K-Means等聚类算法,根据数据的自然分布进行分组。
优点:分组结果更贴合数据内在规律。
缺点:计算复杂度相对较高,需要预先指定聚类数k。
2.4 三种方法对比
| 等宽法 | 数值范围 | 简单直观 | 对异常值敏感,分布可能不均 |
| 等深法 | 样本数量 | 分布均衡,抗异常值 | 可能破坏邻近性 |
| 聚类法 | 自然分布 | 贴合数据内在规律 | 计算复杂度高 |
第三部分:离散化区间的"过细"与"过粗"问题
离散化后,区间划分的粒度直接影响挖掘结果:
3.1 区间划分太窄(支持度不足)
场景:将年龄分为 [21,23)、[23,25)、[25,35)、[35,50)
问题:
-
规则 {年龄∈[21,23), 网上聊天=是} 支持度仅 0.2
-
规则 {年龄∈[23,25), 网上聊天=是} 支持度仅 0.4
两条规则都不满足最小支持度阈值,潜在规律被错误丢弃。
3.2 区间划分太宽(置信度被稀释)
场景:将年龄合为 [21,50)
问题:
-
规则 {年龄∈[21,50), 网上聊天=是} 支持度 0.6(达标)
-
但置信度仅为 3/5 = 0.6(若置信度阈值为0.8,则不达标)
原本在 [21,25) 区间中置信度为 100%(3人全是"是")的强规律,被大区间稀释后丢失了价值。
3.3 最优解:邻近区间动态合并
策略:从窄区间开始,逐步合并邻近区间,直到支持度达标且置信度保持较高水平。
结果:{年龄∈[21,25), 网上聊天=是}:
-
支持度 = 0.6(达标)
-
置信度 = 3/3 = 100%(完美!)
💡 核心原则:支持度满足统计显著性,置信度保证预测准确率。区间划分需要在两者之间找到平衡。
第四部分:基于统计的方法处理连续型属性
除了离散化,另一种方法是将连续型属性作为规则的后件(RHS),用统计量(均值、中位数、标准差)来描述。
4.1 基本思路
将目标连续属性从其他属性中抽离出来
在剩余属性上挖掘频繁项集
对每个频繁项集,计算目标属性的统计量(如均值、标准差)
进行假设检验,判断该规则是否具有统计显著性
4.2 关联规则的统计检验
场景:挖掘出规则 {年收入>100k, 网上购物=是} → 年龄
问题:这条规则真的有意义吗?还是随机波动?
检验方法:
-
零假设 H₀:满足规则前提的用户,其平均年龄不显著高于不满足前提的用户
-
备择假设 H₁:满足规则前提的用户,其平均年龄显著高于不满足前提的用户
检验统计量(Z检验):
设:

计算 Z 值:

在 95% 置信度(单侧检验)下,临界值为 1.64。
因为 3.11>1.64,拒绝零假设 → 规则具有统计显著性。
💡 解读:满足规则前提的用户(高收入且网上购物),其平均年龄显著高于其他用户,且差异超过了预设的5岁阈值。
4.3 业务价值:充当"伪规则过滤器"
在海量挖掘结果中,统计假设检验充当过滤器的作用:
-
自动剔除无意义的"伪规则"(随机波动造成的虚假关联)
-
显著提升最终挖掘结果的质量与可用性
第五部分:序列模式挖掘(Sequential Pattern Mining)
5.1 什么是序列数据?
与购物篮数据不同,序列数据包含了时间顺序信息。
购物篮数据(无顺序):
{牛奶, 面包, 啤酒}
{尿布, 啤酒}
序列数据(有顺序):
<{首页} {电子产品} {计算机配件} {内存} {购物车} {结算}>
<{高等数学, 线性代数} {概率统计, 数据库} {数据挖掘, 可视化}>
-
花括号 {}:同一时刻发生的事件(可以包含多个项)
-
尖括号 <>:表示先后顺序
5.2 基本概念
| 序列 | 元素(事务)的有序列表 | <{a}, {b, c}, {d}> |
| 子序列 | 在原始序列中能找到顺序一致的对应项集 | <{a}, {d}> 是 <{a}, {b, c}, {d}> 的子序列 |
| 序列支持度 | 包含该序列的数据序列的比例 | 60% 的数据序列包含 <{a}, {d}> |
5.3 序列模式挖掘的Apriori算法
目标:找出所有支持度 ≥ minsup 的序列。
Step 1:找出所有频繁 1-序列(单个事件的序列)
Step 2:产生候选 k-序列
-
通过合并两个频繁 (k-1)-序列来生成候选 k-序列
-
合并规则:序列 s₁ 与 s₂ 可以合并,当且仅当从 s₁ 的第一个元素中去掉一个事件后得到的子序列,与从 s₂ 的最后一个元素中去掉一个事件后得到的子序列相同
Step 3:剪枝
-
如果候选 k-序列的某个 (k-1)-子序列不是频繁的,则删除该候选
Step 4:计算支持度
-
遍历原始数据集,统计每个候选序列的出现次数
5.4 合并规则的直观理解
示例:假设有频繁 2-序列:
-
<{1}, {2}>
-
<{2}, {3}>
可以合并为 <{1}, {2}, {3}>,因为 <{1}, {2}> 去掉最后一个事件得到 <{1}>,<{2}, {3}> 去掉第一个事件得到 <{2}>?不对,这里需要匹配更复杂的规则。
实际上,合并需要满足:前者的后缀与后者的前缀相同。
💡 本质:与Apriori候选项集生成类似,序列的候选生成也利用了"频繁序列的子序列必须频繁"这一原则进行剪枝。
第六部分:本章核心总结
6.1 属性处理方法速记
| 类别型(取值多) | 分组聚合(归入"其他") | 减少项的数量 |
| 类别型(分布偏斜) | 删除高占比属性或取值 | 避免冗余规则 |
| 连续型(离散化) | 等宽/等深/聚类 | 转换为类别,适配关联规则 |
| 连续型(统计方法) | 假设检验(Z检验) | 验证规则的统计显著性 |
6.2 离散化选择建议
| 数据分布均匀,无异常值 | 等宽法 | 简单直观 |
| 数据有异常值,分布不均 | 等深法 | 抗异常值,分布均衡 |
| 追求最佳分组效果 | 聚类法 | 贴合数据内在规律 |
| 不确定最佳区间 | 动态合并(窄→宽) | 在支持度和置信度间找平衡 |
6.3 序列模式 vs 关联规则
| 顺序 | 不考虑顺序(同时出现) | 考虑先后顺序 |
| 表示 | {A} → {B} | <{A}, {B}> |
| 典型场景 | 购物篮分析 | 网站点击路径、课程先修关系 |
6.4 核心公式速记卡



