一、任务内容
(1)了解Groceries_dataset.csv中事务集的属性信息,根据每个用户每天的购买记录构造事务(比如用户1000在2015年3月15日对应的事务为{‘sausage’,’whole milk’,’semi-finished bread’,’yogurt’}),然后按照用户ID递增,时间递增的方式对事务进行排序;
(2)选择事务集中前100条事务,选择合适的支持度阈值,使用Apriori算法和FP-growth算法挖掘频繁项集(推荐使用mlxtend包的apriori和fpgrowth函数),并对比apriori算法和fpgrowth算法的时间复杂度;
(3)重复步骤(3),依次选择前500条,前1000条事务,对比apriori算法和fpgrowth算法的时间复杂度;
(4)使用前100条事务时,选择合适的置信度阈值,利用挖掘到的频繁项集生成强关联规则(推荐使用mlxtend包的association_rules函数)。然后使用提升度、全置信度、最大置信度、Kluc度量和余弦度量评估这些强关联规则。
二、实现过程
1. 了解Groceries_dataset.csv中事务集的属性信息,根据每个用户每天的购买记录构造事务,然后按照用户ID递增,时间递增的方式对事务进行排序;
打开Groceries_dataset.csv文件,如下图所示:
观察发现共有三列,分别为会员ID,时间和购买商品,每一行只有一种商品。需要根据ID和时间进行合并,生成事务集。
编写函数loadDataset读入数据并进行合并、转化为二元表:读入.csv文件,使用df.groupby()将数据按ID和时间分组合并,提取合并后grouped['itemDescription']作为dataset;使用mlxtend包中的TransactionEncoder将list转化为dataframe类型的二元表,输出如下图所示:
输出显示[14963 rows x 167 columns],说明该数据集中商品种类共167种,共有14963条事务。
相关代码如下所示:
def loadDataset():
csv_file = 'Groceries_dataset.csv' # 用你的数据集文件名替换
df = pd.read_csv(csv_file)
# 将数据按ID和时间分组合并
grouped = df.groupby(['Member_number', 'Date'])['itemDescription'].apply(list).reset_index()
merged_dataset = grouped['itemDescription'].tolist()
# print(merged_dataset)
Encoder = TransactionEncoder()
encoded_data = Encoder.fit_transform(merged_dataset)
df_encoded = pd.DataFrame(encoded_data, columns=Encoder.columns_)
# pd