关联规则学习概述
在大型数据库中发现变量之间有趣关系的方法,目的是利用一些有趣的度量识别数据库中的强规则。基于强规则的概念,Rakesh Agrawal等人引入了关联规则以发现由超市的POS系统记录的大批交易数据中产品之间的规律性。例如,从销售数据中发现的规则{薄饼,鸡蛋}->{火腿肠},表明如果顾客一起买薄饼和鸡蛋,他们也有可能买火腿肠(这些顾客是想早饭吃手抓饼吧,哈哈),此类信息可以为大卖场商品组合促销或电商网站产品推荐等相关商业决策提供依据。除了上述的购物篮分析外,关联规则还被应用在许多领域中,包括网络用法挖掘(web usage mining)、入侵检测、连续生产(continuous production)及生物信息学中,与序列挖掘(sequence mining)相比,关联规则学习通常不考虑在事务(transaction)中或事务间项目(item)的顺序。
基本概念
I = { I 1 , I 2 , . . . , I m } I =\{I_1, I_2, ..., I_m\} I={I1,I2,...,Im}是项目(item)的集合。给定一个交易数据库 D = { t 1 , t 2 , . . . , t n } D = \{t_1, t_2, ..., t_n\} D={t1,t2,...,tn},其中每个事务(transaction) t t t是 I I I的非空子集,即, t ⊆ I t \subseteq I t⊆I,每一个事务都与一个唯一的标识符TID(transaction ID)对应。
关联规则是形如 X ⇒ Y X \Rightarrow Y X⇒Y的蕴含式,其中 X , Y ⊆ I X, Y \subseteq I X,Y⊆I且 X ∩ Y = ∅ X \cap Y=\emptyset X∩Y=∅, X X X和 Y Y Y分别称为关联规则的先导(antecedent或left-hand-side,LHS)和后继(consequent或right-hand-side,RHS)。
关联规则 X ⇒ Y X \Rightarrow Y X⇒Y在 D D D中的支持度(support)是 D D D中包含 X ∪ Y X \cup Y X∪Y的事务所占的比例,即概率 P ( X ∪ Y ) P(X\cup Y) P(X∪Y)。置信度(confidence)是包含 X X X的事务中同时包含 Y Y Y的比例,即条件概率 P ( Y ∣ X ) P(Y|X) P(Y∣X)。如果同时满足最小支持度阈值(minimum support)和最小置信度阈值(minimum confidence),则认为关联规则是有用的,上述两个阈值由用户或专家根据经验或者需要设定。
举例说明概念
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 |
上表是顾客购买记录的数据库
D
D
D,包含6个事务,项集
I
=
{
网
球
拍
,
网
球
,
运
动
鞋
,
羽
毛
球
}
I = \{网球拍,网球,运动鞋,羽毛球\}
I={网球拍,网球,运动鞋,羽毛球},考虑关联规则
{
网
球
拍
⇒
网
球
}
\{网球拍 \Rightarrow 网球\}
{网球拍⇒网球},事务
1
,
2
,
3
,
4
,
6
1,2,3,4,6
1,2,3,4,6包含网球拍,事务
1
,
2
,
6
1,2,6
1,2,6同时包含网球拍和网球,
支
持
度
(
s
u
p
p
o
r
t
)
=
同
时
包
含
网
球
和
网
球
拍
的
事
务
数
事
务
总
数
=
3
6
=
0.5
支持度(support) = \frac{同时包含网球和网球拍的事务数}{事务总数}=\frac{3}{6}=0.5
支持度(support)=事务总数同时包含网球和网球拍的事务数=63=0.5
置
信
度
(
c
o
n
f
i
d
e
n
c
e
)
=
同
时
包
含
网
球
和
网
球
拍
的
事
务
数
包
含
网
球
拍
的
事
务
数
=
3
5
=
0.6
置信度(confidence) = \frac{同时包含网球和网球拍的事务数}{包含网球拍的事务数}=\frac{3}{5}=0.6
置信度(confidence)=包含网球拍的事务数同时包含网球和网球拍的事务数=53=0.6
如果给定的最小支持度(minimum support)
α
=
0.5
\alpha = 0.5
α=0.5和最小置信度(minimum confidence)
β
=
0.5
\beta = 0.5
β=0.5,则关联规则
{
网
球
拍
⇒
网
球
}
\{网球拍 \Rightarrow 网球\}
{网球拍⇒网球}是有趣的,认为购买网球拍和购买网球之间存在强关联。
求解算法
常用的自动从事务集中挖掘关联规则的算法有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'}]