实验原理
关联规则:
是形如X→Y的蕴涵式,其中,X和Y分别称为关联规则的先导(antecedent或left-hand-side, LHS)和后继(consequent或right-hand-side, RHS) 。其中,关联规则XY,存在支持度和信任度。
支持度:几个关联的数据在数据集中出现的次数占总数据集的比重
S
u
p
p
o
r
t
(
X
,
Y
)
=
P
(
X
Y
)
=
n
u
m
b
e
r
(
X
Y
)
n
u
m
(
A
l
l
S
a
m
p
l
e
)
Support(X,Y) = P(XY)=\frac{number(XY)}{num(AllSample)}
Support(X,Y)=P(XY)=num(AllSample)number(XY)
置信度:一个数据出现后,另一个数据出现的概率,或者说数据的条件概率。
C
o
n
f
i
d
e
n
c
e
(
X
←
Y
)
=
P
(
X
∣
Y
)
=
P
(
X
∣
Y
)
P
(
Y
)
Confidence(X \gets Y) = P(X|Y)=\frac{P(X|Y)}{P(Y)}
Confidence(X←Y)=P(X∣Y)=P(Y)P(X∣Y)
提升度:表示含有Y的条件下,同时含有X的概率,与X总体发生的概率之比。
L
i
f
t
(
X
←
Y
)
=
P
(
X
∣
Y
)
P
(
X
)
=
C
o
n
f
i
d
e
n
c
e
(
X
←
Y
)
P
(
X
)
Lift(X \gets Y)=\frac{P(X|Y)}{P(X)}=\frac{Confidence(X \gets Y) }{P(X)}
Lift(X←Y)=P(X)P(X∣Y)=P(X)Confidence(X←Y)
示例
使用Apriori算法发现频繁项集:
- 扫描数据集,得到所有出现过的数据,作为候选1项集
- 挖掘频繁k项集扫描计算候选k项集的支持度剪枝去掉候选k项集中支持度低于最小支持度α的数据集,得到频繁k项集。如果频繁k项集为空,则返回频繁k-1项集的集合作为算法结果,算法结束。基于频繁k项集,链接生成候选k+1项集
- 利用步骤2,迭代得到k=k+1项集结果
由频繁项集产生关联规则: - 对于每个频繁项集I,产生I的所有非空子集
- 对于I的每个非空子集s,如果
S u p p o r t ( I ) S u p p o r t ( s ) ⩾ m i n c o n f \frac{Support(I)}{Support(s)}\geqslant minconf Support(s)Support(I)⩾minconf
则输出规则“s(l-s)”。其中,minconf是最小置信度阈值:
C o n f i d e n c e ( A → B ) = P ( A ∣ B ) = S u p p o r t ( A ∪ B ) S u p p o r t ( A ) Confidence(A \to B) = P(A|B)=\frac{Support(A\cup B)}{Support(A)} Confidence(A→B)=P(A∣B)=Support(A)Support(A∪B)
算法
Apriori算法
是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里,所有支持度大于最小支持度的项集称为频繁项集,简称频集。
原理:
- 如果一个项集是频繁项集,则它的所有子集都是频繁项集;
- 如果一个集合不是频繁项集,则它的所有父集(超集)都不是频繁项集。
目标:
- 发现频繁项集:发现满足最小支持度的所有项集;
- 发现关联规则:从频繁项集中提取所有高置信度的规则。
- 缺点:
(1)对数据库的扫描次数过多。
(2)Apriori算法会产生大量的中间项集。
(3)采用唯一支持度。
(4)算法的适应面窄。
实验步骤
- 先搜索出候选1项集及对应的支持度,剪枝去掉低于支持度的1项集,得到频繁1项集;
- 对剩下的频繁1项集进行连接,得到候选的频繁2项集,筛选去掉低于支持度的候选频繁2项集,得到真正的频繁二项集;
- 以此类推,迭代下去,直到无法找到频繁k+1项集为止,对应的频繁k项集的集合即为算法的输出结果。
代码
代码如下(示例):
#导入相关库
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
#打开数据文件
df=pd.read_excel(r'C:\Users\dell\.PyCharmCE2018.3\config\scratches\Online Retail.xlsx')
print(df.head())
#选择数据
df['Description'] = df['Description'].str.strip()
df.dropna(axis=0, subset=['InvoiceNo'], inplace=True)
df['InvoiceNo'] = df['InvoiceNo'].astype('str')
df = df[~df['InvoiceNo'].str.contains('C')]
#描述Description字段去除首尾空格,删除发票ID"InvoiceNo"为空的数据记录,
# 将发票ID"InvoiceNo"字段转为字符型,删除发票ID"InvoiceNo"不包含“C”的记录
basket = (df[df['Country'] =="France"]
.groupby(['InvoiceNo', 'Description'])['Quantity']
.sum().unstack().reset_index().fillna(0)
.set_index('InvoiceNo'))
#basket选择法国地区数据不要忘记fillna(0),将空值转为0,算法包需要。列名为商品名称,每一行为一个订单。
#将购物数量转为0/1变量
#0:此订单未购买包含列名
#1:此订单购买了列名商品
def encode_units(x):
if x <= 0:
return 0
if x >= 1:
return 1
#使用dataframe的applymap函数,将encode_units在basket中的每个单元格执行并返回
#删除购物篮中的邮费项(POSTAGE)
basket_sets = basket.applymap(encode_units)
basket_sets.drop('POSTAGE', inplace=True, axis=1)
#frequent_itemsets 为频繁项集:
#Support列为支持度,即 项集发生频率/总订单量
#产生相应的信心和提升的规则,rules为最终关联规则结果表:
#antecedants前项集,consequents后项集,support支持度,confidence置信度,lift提升度。
frequent_itemsets = apriori(basket_sets, min_support=0.07, use_colnames=True)
print(frequent_itemsets)
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
import xlwt
pd.set_option('display.max_columns',None)
print(rules.head())
rules.to_csv(r'E:\文件\课程\数据挖掘\Apriori.csv')
#选取置信度(confidence)大于0.8且提升度(lift)大于5的规则,按lift降序排序
rules [(rules['lift'] >= 6) & (rules['confidence'] >= 0.8)]
basket['ALARM CLOCK BAKELIKE GREEN'].sum()
#结果:340.0
basket['ALARM CLOCK BAKELIKE RED'].sum()
#结果:316.0
#basket2为德国地区数据
basket2 = (df[df['Country'] =="Germany"]
.groupby(['InvoiceNo', 'Description'])['Quantity']
.sum().unstack().reset_index().fillna(0)
.set_index('InvoiceNo'))
basket_sets2 = basket2.applymap(encode_units)
basket_sets2.drop('POSTAGE', inplace=True, axis=1)
frequent_itemsets2=apriori(basket_sets2,min_support=0.05, use_colnames=True)
rules2= association_rules(frequent_itemsets2, metric="lift", min_threshold=1)
rules2[ (rules2['lift'] >= 4) & (rules2['confidence'] >= 0.5)]
Rules2.to_csv(r'E:\文件\课程\数据挖掘\Apriori2.csv')
结果分析
对于法国的数据,查看规则时,可以发现似乎绿色和红色闹钟是一起购买的,红纸杯,餐巾纸和纸板是以总体概率提高的方式一起购买的。
例如:我们可以看到,我们销售340个绿色闹钟,但只有316个红色闹钟,所以也许我们可以通过科学的方法来推动更多的红色闹钟销售。
(antecedants前项集,consequents后项集,support支持度,confidence置信度,lift提升度。)
对于德国的数据:德国人喜欢锡太太雄和林地动物的奶油布丁一起买,或者圆盒子的水果和圆盒子的林地动物小吃一起买。