在学习数据挖掘,刚学到关联规则的apriori算法,老师要求自己写一写。
本着能用库就不自己敲详细代码的原则,找到了这个叫做apyori的库。
自己在CSDN上搜了搜大佬的案例,主要是参考的这个大佬的案例。
但是我照着大佬写的还是不能运行,可能是我的数据跟大佬不一致导致的。
在小npy的帮助下改成了下面这样。
import pandas as pd
from apyori import apriori
# 读取原始数据
df = pd.read_excel("excel数据文件路径")
# 数据转换成apriori可处理的形式
# 以列表的形式进行分许
transactions = df.groupby(by='OrderID').apply(lambda x: list(x.CategoryName))
# min_support -- The minimum support of relations (float).
# min_confidence -- The minimum confidence of relations (float).
# min_lift -- The minimum lift of relations (float).
# max_length
min_supp = 0.1 #设定最小支持度
min_conf = 0.1 #设定最小置信度
min_lift = 0.1 #设定最小提升度
# 调用apriori方法,在这里不满足最小支持度、置信度和提升度的项集以及规则会被自动排除
ap = list(apriori(transactions=transactions, min_support=min_supp,
min_confidence=min_conf, min_lift=min_lift))
#实际上关联规则运算到这里就已经完成了,后续的工作是为了使结果能够更好的输出。
#支持度(support),先输入空列表,再进行赋值
supports=[]
#置信度
confidences=[]
#提升度
lifts=[]
#基于项items_base
bases=[]
#推导项items_add
adds=[]
'''
这里用嵌套循环来读取,是因为关联规则运算结果ap实际上是一个多维列表
r是从列表中取出频繁项集,而x是从频繁项集中取出关联规则。
'''
for r in ap:
for x in r.ordered_statistics:
supports.append(r.support)
confidences.append(x.confidence)
lifts.append(x.lift)
bases.append(list(x.items_base))
adds.append(list(x.items_add))
#将结果存储为dataframe
result = pd.DataFrame({
'support':supports,
'confidence':confidences,
'lift':lifts,
'base':bases,
'add':adds
})
# 选择支持度大于0.5,自信度大于0.5,提升度大于1
res = result[(result.lift > 1) & (result.support > 0.5) & (result.confidence > 0.5)]
#dataframe输出有时候会省略中间的变量,下面这行代码是为了让它能够全部显示
pd.set_option('display.max_columns',None)
print(res[:3]) #输出前三个规则
下面是输出的结果的提升度前三的关联规则(我手上这个数据的支持度和置信度都不是很高,是数据的问题)