别再死记公式了!用Python的mlxtend库5分钟搞定Apriori算法置信度计算
·
用Python的mlxtend库5分钟实现Apriori算法置信度计算
在超市购物时,你是否注意过货架上尿布和啤酒常常摆放在一起?这并非偶然,而是数据挖掘中关联规则分析的经典案例。传统教学中,我们往往需要手动计算支持度、置信度等指标,过程繁琐且容易出错。现在,借助Python生态中的mlxtend库,只需几行代码就能快速完成这些计算。
1. 环境准备与数据导入
1.1 安装必要库
首先确保你的Python环境已安装以下库:
pip install mlxtend pandas numpy
mlxtend是一个专门为数据科学和机器学习扩展功能的库,其中包含实现Apriori算法的模块。与纯手工计算相比,它能自动处理繁琐的计数和比值运算。
1.2 准备示例数据
我们使用一个简化版的超市购物数据集来演示:
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
dataset = [
['奶粉', '莴苣'],
['莴苣', '尿布', '啤酒', '甜菜'],
['奶粉', '尿布', '啤酒', '橙汁'],
['奶粉', '莴苣', '尿布', '啤酒'],
['奶粉', '莴苣', '尿布', '橙汁']
]
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
df = pd.DataFrame(te_ary, columns=te.columns_)
这段代码将原始交易数据转换为one-hot编码格式,每列代表一个商品,每行表示一次交易是否包含该商品。转换后的数据如下:
| 交易ID | 奶粉 | 莴苣 | 尿布 | 啤酒 | 甜菜 | 橙汁 |
|---|---|---|---|---|---|---|
| 1 | True | True | False | False | False | False |
| 2 | False | True | True | True | True | False |
| 3 | True | False | True | True | False | True |
| 4 | True | True | True | True | False | False |
| 5 | True | True | True | False | False | True |
2. 计算频繁项集与支持度
2.1 发现频繁项集
Apriori算法的第一步是找出所有满足最小支持度的项集:
from mlxtend.frequent_patterns import apriori
frequent_itemsets = apriori(df, min_support=0.4, use_colnames=True)
print(frequent_itemsets)
输出结果将显示所有支持度大于40%的项集:
| 支持度 | 项集 |
|---|---|
| 0.8 | (奶粉) |
| 0.8 | (莴苣) |
| 0.8 | (尿布) |
| 0.6 | (啤酒) |
| 0.4 | (橙汁) |
| 0.6 | (奶粉, 莴苣) |
| 0.6 | (奶粉, 尿布) |
| 0.4 | (奶粉, 啤酒) |
| 0.4 | (莴苣, 尿布) |
| 0.4 | (莴苣, 啤酒) |
| 0.6 | (尿布, 啤酒) |
| 0.4 | (奶粉, 莴苣, 尿布) |
| 0.4 | (尿布, 啤酒, 奶粉) |
2.2 支持度计算原理
支持度衡量的是项集在整个数据集中出现的频率。例如:
- 尿布单独出现的支持度 = 包含尿布的交易数 / 总交易数 = 4/5 = 0.8
- (尿布, 啤酒)组合的支持度 = 同时包含两者的交易数 / 总交易数 = 3/5 = 0.6
3. 生成关联规则与置信度计算
3.1 提取关联规则
基于频繁项集,我们可以生成关联规则并计算置信度:
from mlxtend.frequent_patterns import association_rules
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.5)
print(rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']])
输出结果示例:
| 前项 | 后项 | 支持度 | 置信度 | 提升度 |
|---|---|---|---|---|
| (尿布) | (啤酒) | 0.6 | 0.75 | 1.25 |
| (啤酒) | (尿布) | 0.6 | 1.0 | 1.25 |
| (奶粉) | (莴苣) | 0.6 | 0.75 | 0.9375 |
| (莴苣) | (奶粉) | 0.6 | 0.75 | 0.9375 |
3.2 置信度解读
以第一条规则 尿布 -> 啤酒 为例:
- 支持度 :0.6(3/5),表示同时购买尿布和啤酒的交易占比
- 置信度 :0.75(3/4),表示购买尿布的顾客中有75%也会购买啤酒
- 提升度 :1.25,表示购买尿布的顾客购买啤酒的可能性比普通顾客高25%
置信度的计算公式为:
confidence(X→Y) = support(X∪Y) / support(X)
在代码中,association_rules函数自动完成了这些计算,无需手动处理。
4. 实战应用与优化技巧
4.1 参数调优建议
实际应用中,需要根据数据特点调整参数:
# 调整最小支持度和置信度阈值
frequent_itemsets = apriori(df, min_support=0.2, use_colnames=True)
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.3)
# 添加提升度过滤
high_lift_rules = rules[rules['lift'] > 1.2]
提示:min_support设置过高可能导致漏掉有价值的低频规则,设置过低则会产生大量无意义规则。
4.2 结果可视化
使用热图直观展示规则强度:
import seaborn as sns
import matplotlib.pyplot as plt
# 创建规则矩阵
rules_matrix = rules.pivot(index='antecedents',
columns='consequents',
values='confidence')
plt.figure(figsize=(10,6))
sns.heatmap(rules_matrix, annot=True, cmap='YlGnBu')
plt.title('关联规则置信度热图')
plt.show()
4.3 处理大规模数据
当面对超市场景的真实数据时(可能有数万条交易记录),可以采用以下优化策略:
- 分块处理 :将数据按时间或门店分块,分别分析后再汇总
- 采样分析 :对数据进行随机采样,快速验证规则有效性
- 并行计算 :利用mlxtend的并行计算功能加速处理
# 启用多线程计算
frequent_itemsets = apriori(df, min_support=0.1,
use_colnames=True,
max_len=4,
low_memory=True)
5. 业务解读与决策支持
5.1 典型应用场景
- 商品陈列优化 :将高置信度关联商品摆放在相邻位置
- 促销组合设计 :对关联性强的商品设计捆绑优惠
- 库存管理 :根据关联规则预测商品需求变化
- 个性化推荐 :基于用户已选商品推荐关联商品
5.2 避免常见误区
- 相关≠因果 :高置信度仅表示共现频率,不一定是因果关系
- 数据时效性 :消费模式会随时间变化,需定期更新分析
- 特殊事件影响 :节假日等特殊时期的购买模式可能与平时不同
5.3 扩展思考
除了基本的支持度-置信度框架,还可以考虑:
- 序列模式挖掘 :分析购买时间先后顺序
- 多层次关联 :同时考虑商品类别和具体SKU
- 负关联规则 :识别互斥的商品组合
# 计算全指标
detailed_rules = association_rules(
frequent_itemsets,
metric="confidence",
min_threshold=0.4,
support_only=False
)
# 添加杠杆率和确信度
detailed_rules['leverage'] = detailed_rules['support'] - (
detailed_rules['antecedent support'] * detailed_rules['consequent support'])
detailed_rules['conviction'] = (1 - detailed_rules['consequent support']) / (
1 - detailed_rules['confidence'])
更多推荐
所有评论(0)