一、关联规则算法概述
关联规则算法是数据挖掘领域中一种重要的模式挖掘算法,用于发掘数据集中的频繁项集
以及这些项集之间的关联规则
。关联规则算法一般应用在购物篮分析
、推荐系统
等领域,例如:购物网站根据用户的历史记录,可以利用关联规则算法向用户推荐相关商品。
二、关联规则算法apriori原理
2.1 概述
在关联规则算法中,apriori算法是最为常见和经典的频繁项集挖掘算法之一,它最初是由R. Agrawal 和 R.Srikant 在1994年提出来的。apriori 的名字来源于该算法的关键特性,优化搜索空间的性质:只有当一个项集是频繁的,它的所有子集才能视为频繁项集。
2.2 算法流程
apriori算法的流程大致如下:
统计每个项(item)的出现数量,并过滤掉出现次数不足最小支持度(min_support)设定的项。
利用经过滤的项,生成所有可能的组合集(candidate itemset),通过组合筛选掉不满足最小支持度要求的项,得到保留的频繁项集(frequent itemset)。
通过频繁项集生成关联规则,计算每条规则的支持度和置信度,再通过阈值过滤保留满足要求的规则。
2.3 代码实现
下面给出使用python实现关联规则的简短代码,其中min_support代表最小支持度阈值,min_confidence代表最小置信度阈值。
def apriori(data, min_support, min_confidence):
# 找到所有的候选频繁项集
itemset = create_itemset(data)
freq_itemset = {1: itemset}
k = 2
while True:
# 从候选频繁项集中产生新的频繁项集
new_itemset = generate_candidate_set(freq_itemset[k-1], k)
# 如果产生的新频繁项集为空,则跳出循环
if not new_itemset:
break
# 计算新频繁项集的支持度
freq_itemset[k] = get_frequent_itemset(data, new_itemset, min_support)
k += 1
# 产生关联规则
rules = generate_rules(freq_itemset, min_support, min_confidence)
return freq_itemset, rules
三、代码解析
3.1 create_itemset函数-产生最小支持度的频繁项集
create_itemset函数负责根据数据集中的项,产生所有可能的单一的项的集合(候选项)。由于此时并没有指定最小支持度,因此该函数得到的集合是包含所有单一项的集合。
def create_itemset(data):
itemset = set()
for row in data:
for item in row:
itemset.add(frozenset([item]))
return itemset
3.2 generate_candidate_set函数-产生新的频繁项集
generate_candidate_set函数被调用时,传入的是一个k项集的列表(例如包含了三个项的集合 {A,B,C}),通过消除候选项,产生新的候选项。根据反证法,如果是不满足最小支持度要求的,它的任一子集都是不满足条件的。因此剩下的就是产生新的候选项,然后通过计算频繁项,消除不满足条件的包。
def generate_candidate_set(itemset, k):
return set([i.union(j) for i in itemset for j in itemset if len(i.union(j)) == k])
3.3 get_frequent_itemset函数-计算新频繁项集的支持度
在该函数中,计算每个项集在数据集中出现的次数。如果项集的出现频率(即支持度)超过了最小支持度,它就被添加到最终的频繁项集中。
def get_frequent_itemset(data, itemset, min_support):
freq_itemset = set()
length = len(data)
for item in itemset:
count = sum([1 for row in data if item.issubset(row)])
support = count/length
if support >= min_support:
freq_itemset.add(item)
return freq_itemset
3.4 generate_rules函数-生成关联规则
在此函数中,我们首先需要遍历每个频繁项集,找出每个项集中的每个单一项,这样我们就可以用它作为规则中的前项,来生成关联规则。
def generate_rules(freq_itemset, min_support, min_confidence):
rules = []
for k, itemset in freq_itemset.items():
if k == 1:
continue
for item in itemset:
# 生成所有的规则
subsets = get_all_subset(item)
for subset in subsets:
X = subset
Y = item.difference(subset)
# 如果X不满足条件,则Y不满足;因此不需要进行操作
if len(Y) == 0:
continue
support_XY, support_X = get_support(freq_itemset, X.union(Y)), get_support(freq_itemset, X)
confidence = support_XY/support_X
if confidence >= min_confidence:
rules.append((X, Y, support_XY, support_X, confidence))
return rules
3.5 结果展示
我们使用一个购物篮数据集(2000个篮子)来演示我们如何使用apriori算法生成频繁项集和关联规则。该数据集按照字符编码存放在‘./data/groceries.csv’。
import csv
from collections import defaultdict
data = []
with open('./data/groceries.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
for row in csv_reader:
data.append(row)
min_support, min_confidence = 0.01, 0.5
freq_itemset, rules = apriori(data, min_support, min_confidence)
# 打印出所有频繁项集
for k, itemset in freq_itemset.items():
print('频繁项集 [Length {}]:\n'.format(k))
for item in itemset:
print('\t{}'.format(set(item)))
# 打印出所有关联规则
for rule in rules:
X, Y, support_XY, support_X, confidence = rule
print('\n规则:{} => {}'.format(set(X), set(Y)))
print('\t支持度 Support: {}'.format(round(support_XY, 3)))
print('\t置信度 Confidence: {}'.format(round(confidence, 3)))
3.6 代码运行结果
{频繁项集 [Length 1]:
{'citrus fruit'}
{'semi-finished bread'}
{'margarine'}
{'ready soups'}
{'tropical fruit'}
{'yogurt'}
{'coffee'}
{'whole milk'}
{'cream'}
{'beef'}
{'pork'}
{'poultry'}
{'processed cheese'}
{'spices'}
{'other vegetables'}
{'whole milk;citrus fruit'}
{'whole milk;semi-finished bread'}
{'whole milk;margarine'}
{'whole milk;yogurt'}
{'whole milk;coffee'}
{'whole milk;cream'}
{'whole milk;beef'}
{'whole milk;pork'}
{'whole milk;poultry'}
{'whole milk;processed cheese'}
...省略中间输出结果...
规则:{'whole milk', 'tropical fruit'} => {'yogurt'}
支持度 Support: 0.011
置信度 Confidence: 0.512
规则:{'yogurt', 'tropical fruit'} => {'whole milk'}
支持度 Support: 0.011
置信度 Confidence: 0.573
规则:{'root vegetables', 'whipped/sour cream'} => {'other vegetables'}
支持度 Support: 0.01
置信度 Confidence: 0.643
}
四、总结
关联规则算法apriori是一种常见和经典的频繁项集挖掘算法,具有快速且准确的特点。在实际应用中,我们需要根据数据集的特点以及对数据的认识,不断地调整最小支持度和最小置信度这样的参数,来达到更好的结果。我们也可以结合其他的算法,比如FP-Growth,来提高算法的准确度和效率。