关联分析-从算法到实战
作者:互联网
基本概念
了解一些基本概念。
购物篮事务:如下数据的例子通常被称为购物篮事务。其中一行对应一个事务,包含一个唯一的标识和给定客户购买的商品集合;
二元表示:项用二元变量表示,如果项在事务中出现,则值为1,否则为0;
I:购物篮事务中所有项的集合;
T:所有事务的集合,每个事务ti包含的项集都是I的子集;
项集:包含0个或者多个项的集合。如果一个项集包含k个项,则称它为k-项集;
支持度计数:包含特定项集的事务个数;
关联规则:形如X->Y的蕴涵表达式,其中X和Y是不相交的项集。关联规则的强度可以用支持度(support)和置信度(confidence)度量。
支持度:支持度确定规则可以用于给定数据集的频繁程度
s(X→Y)=δ(X∪Y)/N
置信度:置信度确定Y在包含X的事务中出现的频繁程度
c(X→Y)=δ(X∪Y)/δ(X)
为什么使用支持度和置信度?
支持度是一种重要的度量,支持度很低的规则可能只是偶然出现。从商务角度来看,低支持度的规则多半是无意义的,对顾客很少购买的商品进行促销可能并无益处。因此,支持度通常用来删去那些无意义的规则。另一方面,置信度度量通过规则进行推理具有可靠性。对于给定的规则X->Y,置信度越高,Y包含在X的事务中出现的可能性就越大。当然,由关联规则作出的推论不必然蕴涵因果关系,只是表示规则前件和后件中的项明显的同时出现。因果关系需要关于数据中原因和结果属性的知识,并且通常涉及长期出现的联系。
关联规则发现:给定事务的集合T,关联规则发现是指找出支持度大于等于minsup并且置信度大于等于minconf的所有规则,其中minsup和minconf是对应的支持度和置信度阈值。
频繁项集:满足最小支持度阈值的所有项集
规则:从上一步发现的频繁项集中提取所有高置信度的规则
apriori算法:
先验原理:如果一个项集是频繁的,则它所有子集一定也是频繁的。相反,如果项集是非频繁的,则它的所有超集也一定是非频繁的。
apriori频繁项集产生的部分有两个特点:第一,是一个逐层算法,从频繁1-项集到最长的频繁项集,它每次遍历项集格中的一层;第二,使用产生-测试策略来发现频繁项集。每次迭代后,新的候选项集都是由前一次迭代发现的频繁项集产生,然后对每个候选的支持度进行计数,并与最小的支持度阈值进行比较。
apriori计算复杂度的影响因素:支持度阈值,项数,事务数,事务的平均宽度
apriori时间复杂度的影响因素:频繁1-项集的产生,候选的产生,支持度计数
关联模式的评估:
A:通过统计论据建立。涉及相互独立的项或者覆盖少量事务的模式被认为是不令人感兴趣的,可能反映数据中的伪联系。这些模式可以用客观兴趣度度量,如支持度,置信度和相关性。
B:通过主观论据建立。即模式被主观的认为是无趣的,除非能够揭示料想不到的信息或者提供导致有益行动的有用信息。
一些兴趣度的客观度量:
提升度(lift):规则置信度和规则后件中项集的支持度之间的比率。
由于置信度度量忽略了规则后件中出现的项集的支持度,高置信度的规则有可能出现误导。此时提升度派上用场。
兴趣因子(interest factor):由如果A,B是相互独立的,则P(A,B)=P(A)*P(B),则I(A,B)度量可以解释为,=1时,A和B独立;>1正相关;<1负相关。
相关分析:对于连续变量,相关性用皮尔森相关系数定义;对于二元变量如下,相关度从-1(完全负相关)到+1(完全正相关),为0时,两者完全独立。局限性在与把项在事务中同时出现和同事不出现视为同等重要。更适合分析对称的二元变量。
IS度量:处理非对称二元变量。等价于二元变量的余弦度量cosine(A,B)。局限性在于当两者独立时,即使不相关或负相关模式,度量值也可能很大。
更多的概念:
处理分类属性:二元化后考虑,1.将相关属性值分组,形成少数类别;2.避免产生包含来自同一属性的项的候选集。
处理连续属性:离散化。
概念分层:在一个特定的域中的各种实体或概念的多层组织。可用有向无换图表示。其优点,位于层次结构较下的项可能没有足够的支持度,从而不在任何频繁项集中出现。在概念分层的较低层发现的规则过于特殊,可能不如高层的规则令人感兴趣。
序列模式:给定序列数据集D和用户指定的最小支持度阈值minsup,序列模式发现的任务时找出支持度大于或者等于minsup的所有序列。其中时限约束可以是,最大跨度约束maxspan,最小间隔mingap,最大间隔maxgap,窗口大小约束ws。
PYTHON中算法的实现
apriori - 频繁项集的产生
apriori(df,min_support = 0.5,use_colnames = False,max_len = None,n_jobs = 1)
其中df允许的值为0/1或True / False。
假设交易数据如下:
dataset = [['Milk', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'],
['Dill', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'],
['Milk', 'Apple', 'Kidney Beans', 'Eggs'],
['Milk', 'Unicorn', 'Corn', 'Kidney Beans', 'Yogurt'],
['Corn', 'Onion', 'Onion', 'Kidney Beans', 'Ice cream', 'Eggs']]
通过TransactionEncoder将数据转为需要的格式:
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
df = pd.DataFrame(te_ary, columns=te.columns_)
df
设置返回minsup为0.6的数据集:
from mlxtend.frequent_patterns import apriori
apriori(df, min_support=0.6)
为了增加可读性可以设置use_colnames=True,将整数值环卫项目的名称:
apriori(df, min_support=0.6, use_colnames=True)
同时我们也可以对结果进行选择和过滤,如我们只对长度为2的项目集感兴趣,且这些项目集的minsup至少为0.8:
frequent_itemsets = apriori(df, min_support=0.6, use_colnames=True)
frequent_itemsets['length'] = frequent_itemsets['itemsets'].apply(lambda x: len(x))
frequent_itemsets
筛选如下:
frequent_itemsets[ (frequent_itemsets['length'] == 2) &
(frequent_itemsets['support'] >= 0.8) ]
同样也可以根据itemsets进行选择:
frequent_itemsets[ frequent_itemsets['itemsets'] == {'Onion', 'Eggs'} ]
值得注意的是itemsets是frozenset ,项目的顺序无关紧要,也可查出{‘Eggs’,‘Onion’}
association_rules - 关联规则的生成
association_rules(df,metric ='confidence',min_threshold = 0.8,support_only = False)
从频繁项集产生关联规则:
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
dataset = [['Milk', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'],
['Dill', 'Onion', 'Nutmeg', 'Kidney Beans', 'Eggs', 'Yogurt'],
['Milk', 'Apple', 'Kidney Beans', 'Eggs'],
['Milk', 'Unicorn', 'Corn', 'Kidney Beans', 'Yogurt'],
['Corn', 'Onion', 'Onion', 'Kidney Beans', 'Ice cream', 'Eggs']]
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
df = pd.DataFrame(te_ary, columns=te.columns_)
frequent_itemsets = apriori(df, min_support=0.6, use_colnames=True)
frequent_itemsets
from mlxtend.frequent_patterns import association_rules
association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7)
调整规则的生成标准,如选取lift>1.2的:
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1.2)
rules
如选取规则前件为2,conf>0.75,lift>1.2:
rules["antecedent_len"] = rules["antecedents"].apply(lambda x: len(x))
rules
rules[ (rules['antecedent_len'] >= 2) &
(rules['confidence'] > 0.75) &
(rules['lift'] > 1.2) ]
如选择特性的规则前件:
rules[rules['antecedents'] == {'Eggs', 'Kidney Beans'}]
同样由于是frozenset类型,查询与项目顺序无关。
对于规则各个度量指标的解读:
以规则A->B为例:
antecedent support:A的支持度计数
consequent support :B的支持度计数
leverage:
conviction:
support,llift和confidence在本文已开始即有描述。
参考链接:
http://rasbt.github.io/mlxtend/user_guide/frequent_patterns/apriori/
http://rasbt.github.io/mlxtend/user_guide/frequent_patterns/association_rules/
本文中提到的其它度量指标需另行实现。
标签:实战,置信度,rules,项集,算法,frequent,规则,关联,itemsets 来源: https://blog.csdn.net/weixin_43962871/article/details/89160752