文章目录

  • 1 理论知识
  • 1.1 支持度、置信度、提升度
  • 1.2 Apriori算法
  • 1.3 FP-Growth算法
  • 2 导包
  • 3 数据预处理
  • 4 挖掘关联规则
  • Apriori算法
  • FP-Growth算法


1 理论知识

1.1 支持度、置信度、提升度

Support(支持度):表示某个项集出现的频率,也就是包含该项集的交易数与总交易数的比例。例如P(A)表示项集A的比例,数据挖掘 关联规则 数据挖掘关联规则实战_数据挖掘 关联规则表示项集A和项集B同时出现的比例。

Confidence(置信度):表示当A项出现时B项同时出现的频率,记作{A→B}。换言之,置信度指同时包含A项和B项的交易数与包含A项的交易数之比。公式表达:{A→B}的置信度=数据挖掘 关联规则 数据挖掘关联规则实战_算法_02
Lift(提升度):指A项和B项一同出现的频率,但同时要考虑这两项各自出现的频率。公式表达:{A→B}的提升度={A→B}的置信度/P(B)=数据挖掘 关联规则 数据挖掘关联规则实战_数据挖掘 关联规则_03

提升度反映了关联规则中的A与B的相关性,提升度>1且越高表明正相关性越高,提升度<1且越低表明负相关性越高,提升度=1表明没有相关性。负值,商品之间具有相互排斥的作用。

1.2 Apriori算法

Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集,简称频集。
该算法的基本思想是:首先找出所有的频集,这些项集出现的频繁性至少和预定义的最小支持度一样。然后由频集产生强关联规则,这些规则必须满足最小支持度和最小可信度。然后使用第1步找到的频集产生期望的规则,产生只包含集合的项的所有规则,其中每一条规则的右部只有一项,这里采用的是中规则的定义。一旦这些规则被生成,那么只有那些大于用户给定的最小可信度的规则才被留下来。为了生成所有频集,使用了递推的方法。
Apriori算法采用了逐层搜索的迭代的方法,算法简单明了,没有复杂的理论推导,也易于实现。但其有一些难以克服的缺点:
(1)对数据库的扫描次数过多。
(2)Apriori算法会产生大量的中间项集。
(3)采用唯一支持度。
(4)算法的适应面窄。

1.3 FP-Growth算法

针对Apriori算法的固有缺陷,J.Han等提出了不产生候选挖掘频繁项集的方法:FP-树频集算法。采用分而治之的策略,在经过第一遍扫描之后,把数据库中的频集压缩进一棵频繁模式树(FP-tree),同时依然保留其中的关联信息,随后再将FP-tree分化成一些条件库,每个库和一个长度为1的频集相关,然后再对这些条件库分别进行挖掘。当原始数据量很大的时候,也可以结合划分的方法,使得一个FP-tree可以放入主存中。实验表明,FP-growth对不同长度的规则都有很好的适应性,同时在效率上较之Apriori算法有巨大的提高。

2 导包

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from efficient_apriori import apriori
from sklearn.datasets import load_breast_cancer
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules, fpgrowth

3 数据预处理

查看官网数据集解释:

  1. Class Name: 2 (democrat, republican)
  2. handicapped-infants: 2 (y,n)
  3. water-project-cost-sharing: 2 (y,n)
  4. adoption-of-the-budget-resolution: 2 (y,n)
  5. physician-fee-freeze: 2 (y,n)
  6. el-salvador-aid: 2 (y,n)
  7. religious-groups-in-schools: 2 (y,n)
  8. anti-satellite-test-ban: 2 (y,n)
  9. aid-to-nicaraguan-contras: 2 (y,n)
  10. mx-missile: 2 (y,n)
  11. immigration: 2 (y,n)
  12. synfuels-corporation-cutback: 2 (y,n)
  13. education-spending: 2 (y,n)
  14. superfund-right-to-sue: 2 (y,n)
  15. crime: 2 (y,n)
  16. duty-free-exports: 2 (y,n)
  17. export-administration-act-south-africa: 2 (y,n)
# Pandas设置
pd.set_option("display.max_columns", None)  # 设置显示完整的列
pd.set_option("display.max_rows", None)  # 设置显示完整的行
pd.set_option("display.expand_frame_repr", False)  # 设置不折叠数据
pd.set_option("display.max_colwidth", 100)  # 设置列的最大宽度

# 加载数据集
dataset = pd.read_csv('../data/house-votes-84.data', delimiter=',', header=None)
columns = [
    '党派', '残疾人婴幼儿法案', '水项目费用分摊', '预算决议案', '医生费用冻结议案', '萨尔瓦多援助', 
    '校园宗教团体决议', '反卫星禁试决议', '援助尼加拉瓜反政府', 'MX导弹议案', '移民决议案', '合成燃料公司削减决议', 
    '教育支出决议', '超级基金起诉权', '犯罪决议案', '免税出口决议案', '南非出口管理决议案'
]
dataset.columns = columns
dataset.head(10)

dataset['残疾人婴幼儿法案'].unique()

for col in columns:
    dataset[col] = dataset[col].apply(lambda x: col + ':' + x)
print(len(dataset))
dataset.head()

# 编码
encoder = TransactionEncoder()
new_array = encoder.fit_transform(dataset.values)

new_df = pd.DataFrame(data=new_array, columns=encoder.columns_)

new_df.head()

数据初始形式:

数据挖掘 关联规则 数据挖掘关联规则实战_数据挖掘_04


数据初步编码形式:

数据挖掘 关联规则 数据挖掘关联规则实战_数据挖掘_05

最终数据形式:

数据挖掘 关联规则 数据挖掘关联规则实战_人工智能_06

4 挖掘关联规则

Apriori算法

最小支持度设置为0.5

# 挖掘频繁项集 最小支持度设置为0.5
fre_itemset1 = apriori(df=new_df, min_support=0.5, use_colnames=True)
print(len(fre_itemset1))
fre_itemset1  # 17条

数据挖掘 关联规则 数据挖掘关联规则实战_算法_07


最小支持度设置为0.45

# 挖掘频繁项集 最小支持度设置为0.45
fre_itemset2 = apriori(df=new_df, min_support=0.45, use_colnames=True)
print(len(fre_itemset2))
fre_itemset2  # 44条

数据挖掘 关联规则 数据挖掘关联规则实战_算法_08


最小支持度设置为0.5 最小置信度设置为0.8

# 关联规则
# 最小支持度设置为0.5 最小置信度设置为0.8
rules1 = association_rules(df=fre_itemset1, metric='confidence', min_threshold=0.8)
rules1  # 14条

数据挖掘 关联规则 数据挖掘关联规则实战_数据挖掘_09


最小支持度设置为0.8 最小置信度设置为0.9

# 最小支持度设置为0.8 最小置信度设置为0.9
rules2 = association_rules(df=fre_itemset1, metric='confidence', min_threshold=0.9)
rules2  # 6条

数据挖掘 关联规则 数据挖掘关联规则实战_数据挖掘 关联规则_10

FP-Growth算法

最小支持度0.4

# fp-growth算法 最小支持度0.4
fre_itemset3 = fpgrowth(df=new_df, min_support=0.4, use_colnames=True)
print(len(fre_itemset3))
fre_itemset3.tail()

数据挖掘 关联规则 数据挖掘关联规则实战_数据挖掘_11


最小支持度0.4,最小置信度0.99

# 关联规则
# 最小支持度设置为0.4 最小置信度设置为0.99
rules3 = association_rules(df=fre_itemset3, metric='confidence', min_threshold=0.99)
print(len(rules3))
rules3

数据挖掘 关联规则 数据挖掘关联规则实战_数据挖掘_12