一、实验目的
1. 掌握使用Apriori算法和FP-growth算法挖掘频繁项集。
2. 熟悉使用提升度等度量评估关联规则。
二、实验内容
1. 杂货店商品数据集挖掘关联规则实验
(1)了解Groceries_dataset.csv中事务集的属性信息,并将事务集转换为二元表示形式;
(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. 完成实验(1)(5分)
2. 完成实验(2)(30分)
3. 完成实验(3)(20分)
4. 完成实验(4)(15分)
5. 实验过程与实验结论的记录完整(10分)
6. 表述逻辑清晰(10分)
7. 排版工整自洽,图表标题准确(10分)
四、实验过程
4.1根据每个用户每天的购买记录构造事务
导入.csv文件,将日期解析为 datetime 类型,根据每个用户每天的购买记录构造事务(列表形式),并按照用户ID递增,时间递增的方式排序
- # 读取 CSV 文件,假设 CSV 文件路径为 'Groceries_dataset.csv'
- file_path = 'Groceries_dataset.csv'
- df = pd.read_csv(file_path)
- # 将日期解析为 datetime 类型
- df['Date'] = pd.to_datetime(df['Date'], format='%d-%m-%Y')
- # 根据每个用户每天的购买记录构造事务
- transactions = df.groupby(['Member_number', 'Date'])['itemDescription'].apply(list).reset_index()
- # 对事务进行排序,按照用户ID递增,时间递增的方式排序
- data = transactions.sort_values(by=['Member_number', 'Date'])
对数据进行one-hot编码,将事务集转换为二元表示形式
- # one_hot编码
- df_enconded = pd.get_dummies(data['itemDescription'])
- df_final = pd.concat([data[['Member_number','Date']],df_enconded],axis = 1)
- print(df_final)
4.2提取'itemDescription'列的前100条数据,并将每个事务集改成集合类型(set),方便后续查询的时候自动去重,并具有无序性。
- transactions = data['itemDescription']#.values.tolist()
- # print(transactions)
- transactions = transactions[:100]
- result_list = transactions.apply(lambda x: {item for item in x}).tolist()
4.3 转换事务集为适用于mlxtend的格式,方便后面使用mlxtend包中的两个算法
- # 转换事务集为适用于mlxtend的格式
- te = TransactionEncoder()
- te_ary = te.fit_transform(data)
- df = pd.DataFrame(te_ary, columns=te.columns_)
- print(df)
4.4 设置支持度阈值为0.05,调用库函数apriori算法和FP-growth算法,并进行时间复杂度计算
- # Apriori 算法
- start_time = time.time()
- apriori_result = apriori(df, min_support=0.05, use_colnames=True)
- apriori_time = time.time() - start_time
- # FP-growth 算法
- start_time = time.time()
- fpgrowth_result = fpgrowth(df, min_support=0.05, use_colnames=True)
- fpgrowth_time = time.time() - start_time
4.5 生成强关联规则,因为association_rules函数只自带前件后件支持度,置信度,提升度,所以全置信度,最大置信度,kulc,余弦度量等等需要自己手动计算
- # 生成强关联规则
- rules = association_rules(apriori_result, metric="confidence", min_threshold=min_confidence)
- rules['All Confidence'] = rules['support']/np.maximum(rules['antecedent support'], rules['consequent support'])
- rules['Max Confidence'] = rules['support']/np.minimum(rules['antecedent support'], rules['consequent support'])
- rules['Kulc'] = (rules['support']/rules['antecedent support'] + rules['support']/rules['consequent support'])/2
- # rules['Cosine'] = rules['support']/(math.sqrt(rules['antecedent support']*rules['consequent support']))
- rules['Cosine'] = rules.apply(lambda row: int(row['support'] / math.sqrt(row['antecedent support'] * row['consequent support'])),
五、实验结论
5.1根据购买记录构造事务结果
图 1构造事务
图 2二元属性
5.2选择事务集中前100条事务,支持度阈值=0.05,使用Apriori算法和FP-growth算法挖掘频繁项集对比,FP-growth算法时间复杂度较低
图 3 FP-growth算法 |
图 2 Apriori算法
5.3选择事务集中前500条事务,支持度阈值=0.05,Apriori算法时间复杂度低
图 5 FP-growth算法 |
图 4 Apriori算法
5.4选择事务集中前1000条事务,支持度阈值=0.05,Apriori算法时间复杂度低
图 7 FP-growth算法 |
图6 Apriori算法
5.5生成强关联规则,使用提升度、全置信度、最大置信度、Kluc度量和余弦度量评估这些强关联规则
图 8强关联规则
图 10全置信度 |
图 9提升度
图 12 Kulc度量 |
图 11最大置信度 |
图12余弦度量 |