关联规则学习概述
在大型数据库中发现变量之间有趣关系的方法,目的是利用一些有趣的度量识别数据库中的强规则。基于强规则的概念,Rakesh Agrawal等人引入了关联规则以发现由超市的POS系统记录的大批交易数据中产品之间的规律性。例如,从销售数据中发现的规则{薄饼,鸡蛋}->{火腿肠},表明如果顾客一起买薄饼和鸡蛋,他们也有可能买火腿肠(这些顾客是想早饭吃手抓饼吧,哈哈),此类信息可以为大卖场商品组合促销或电商网站产品推荐等相关商业决策提供依据。除了上述的购物篮分析外,关联规则还被应用在许多领域中,包括网络用法挖掘(web usage mining)、入侵检测、连续生产(continuous production)及生物信息学中,与序列挖掘(sequence mining)相比,关联规则学习通常不考虑在事务(transaction)中或事务间项目(item)的顺序。
基本概念
是项目(item)的集合。给定一个交易数据库,其中每个事务(transaction)是的非空子集,即,,每一个事务都与一个唯一的标识符TID(transaction ID)对应。
关联规则是形如的蕴含式,其中且,和分别称为关联规则的先导(antecedent或left-hand-side,LHS)和后继(consequent或right-hand-side,RHS)。
关联规则在中的支持度(support)是中包含的事务所占的比例,即概率。置信度(confidence)是包含的事务中同时包含的比例,即条件概率。如果同时满足最小支持度阈值(minimum support)和最小置信度阈值(minimum confidence),则认为关联规则是有用的,上述两个阈值由用户或专家根据经验或者需要设定。
举例说明概念
表1:关联规则的简单例子
TID | 网球拍 | 网球 | 运动鞋 | 羽毛球 |
1 | 1 | 1 | 1 | 0 |
2 | 1 | 1 | 0 | 0 |
3 | 1 | 0 | 0 | 0 |
4 | 1 | 0 | 1 | 0 |
5 | 0 | 1 | 1 | 1 |
6 | 1 | 1 | 0 | 0 |
上表是顾客购买记录的数据库,包含6个事务,项集,考虑关联规则,事务包含网球拍,事务同时包含网球拍和网球,
如果给定的最小支持度(minimum support)和最小置信度(minimum confidence),则关联规则是有趣的,认为购买网球拍和购买网球之间存在强关联。
求解算法
常用的自动从事务集中挖掘关联规则的算法有Apriori 算法和FP-Growth算法。两个求解算法的原理请自行查找相关资料了解。
Python实例
1. Apriori
pip install efficient-apriori
from efficient_apriori import apriori
transactions = [('eggs', 'bacon', 'soup'),
('eggs', 'bacon', 'apple'),
('soup', 'bacon', 'banana')]
itemsets, rules = apriori(transactions, min_support=0.5, min_confidence=0.5)
print(rules)
# output: [{eggs} -> {bacon}, {bacon} -> {eggs}, {soup} -> {bacon}, {bacon} -> {soup}]
print(itemsets)
# output: {1: {('soup',): 2, ('bacon',): 3, ('eggs',): 2}, 2: {('bacon', 'eggs'): 2, ('bacon', 'soup'): 2}}
2. FP-Growth(该包目前有bug,不建议使用)
pip install fpgrowth_py
from fpgrowth_py import fpgrowth
itemSetList = [['eggs', 'bacon', 'soup'],
['eggs', 'bacon', 'apple'],
['soup', 'bacon', 'banana']]
freqItemSet, rules = fpgrowth(itemSetList, minSupRatio=0.5, minConf=0.5)
print(rules)
# output: [[{'eggs'}, {'bacon'}, 1.0], [{'bacon'}, {'eggs'}, 0.6666666666666666], [{'soup'}, {'bacon'}, 1.0], [{'bacon'}, {'soup'}, 0.6666666666666666]]
print(freqItemSet)
# output: [{'eggs'}, {'eggs', 'bacon'}, {'soup'}, {'soup', 'bacon'}, {'bacon'}]
参考资料
- 关联规则学习
- FP Growth: Frequent Pattern Generation in Data Mining with Python Implementation
- Efficient-Apriori