关联分析
关联分析通过深入分析数据集,寻找事物间的关联性,挖掘频繁出现的组合,并描述组合内对象出现的模式和规律。
关联分析技术也可应用于智能推荐系统。
关联分析基本概念
给定以下用户的购买商品信息:
user | purchased |
---|---|
1 | (A, B, C, E) |
2 | (A, E, D) |
3 | (A, C, E) |
4 | (B, C) |
5 | (B, C, D) |
6 | (A, C, E) |
7 | (A, B, C, D, E) |
在分析前,以下是一些基本的概念:
- 事物库 :以上的购买记录就是一个事物库,是记录用户行为的数据
- 事物 :事物库中的每一条记录都是一笔事物,代表一个单独的行为
- 项和项集 :购买记录事物库中的每一个商品都为一个项,多个项构成的集合称为项集
由以上基本概念,可以引出以下核心概念:
- 关联规则 :是形如 \\( A \rightarrow B \\) 的表达式,其中 \\( A \\) 称为前件, \\( B \\) 称为后件,并且两者都是项集。它表示前件可以推出后件
- 支持度(support) :定义为包含该项集的事务在所有事务中所占的比例
- 频繁项集 :支持度大于等于设定的阈值(最小支持度)的项集称为频繁项集
- 置信度 :项集 \\( Y \\) 在包含项集 \\( X \\) 的事务中出现的频繁程度,计算公式为:
- 强关联规则 :在实际应用中,通常先寻找满足最小支持度的频繁项集,然后在其中寻找满足最小置信度的关联规则(强关联规则)
Apriori算法
算法原理
Apriori算法是一个经典的强关联算法,其步骤为:
- 设定最小支持度和最小置信度
- 根据最小支持度找出所有的频繁项集
- 根据最小置信度发现强关联规则
接下来以上文列出的简单数据演示Apriori算法的计算过程。
首先,设定最小支持度为 50% ,最小置信度为 85% 。
然后根据最小支持度,找出所有的频繁项集。例如,项集 \\( {B,C} \\) 的支持度为 60% ,大于该最小支持度,属于频繁项集,可能发现其中蕴含的关联。
除了根据排列组合依次计算每个组合的置信度,Apriori算法采用了一种更好的思路:先找出所有长度为 1 的项集中的频繁项集,再对得到的频繁项集排列组合,找出这部分长度为 2 的项集中的频繁项集,以此类推。既然长度为 \\( n-1 \\) 的项集都不是频繁项集,那么它参与构成的长度为 \\( n \\) 的项集肯定更不是。
以上示例的数据中,长度为 1 的频繁项集只有 {A}、{B} 和 {C} ,且它们构成的长度为 2 的频繁项集有 {A,C} 和 {B,C} ,进一步构成的长度为 3 的频繁项集只有 {A,C,E} 。关联只可能从找到的长度大于等于 2 的项集中找到。
最后一步从各个频繁项集中推导出可能的关联规则,再利用最小置信度来检验这些关联规则是否为强关联规则。
例如,频繁项集 {A,C,E} 可能推导出 6 条关联规则:
关联规则 | 置信度 | 最小置信度检验 | 是否删除 |
---|---|---|---|
{A,C}→{E} | 1 | 通过 | 保留 |
{A,E}→{C} | 0.75 | 未通过 | 删除 |
{C,E}→{A} | 0.1 | 通过 | 保留 |
{A}→{C,E} | 0.75 | 未通过 | 删除 |
{C}→{A,E} | 0.75 | 未通过 | 删除 |
… | … | … | … |
暂时不想算了,编数据有点麻烦
其中,置信度计算中,分子是项集 {A,C,E} 出现的次数,分母是前件在所有事务中出现的次数。
对其它频繁项集使用此操作,得到所有的强关联规则。
代码实现:使用apyori库
apyori
库是一个专门用来实现 Apriori 算法的库,它使用较为简单。
可以通过 pip 安装该库:
如果通过代码使用该库,其示例为:
apriori()
函数可以通过 min_support
和 min_confidence
参数设置最小支持度和最小支持度。返回的结果可以通过打印相关变量查看。
安装完成 apyori 库后,它同时会在本地提供名为 apyori-run.exe
的命令行工具。可以使用该工具便捷地完成计算,而不需要任何代码。
可以通过 -h
命令行参数查看它支持的所有参数。
以下给出了一个调用示例:
{"items": [""], "support": 0.9998968008255934, "ordered_statistics": [{"items_base": [], "items_add": [""], "confidence": 0.9998968008255934, "lift": 1.0}]}
{"items": ["", "Sex Education"], "support": 0.25552115583075335, "ordered_statistics": [{"items_base": ["Sex Education"], "items_add": [""], "confidence": 0.9995962858296327, "lift": 0.9996994539879389}]}
得到的是一个 json 格式的文件,可以将其读入并解析。
(这个数据集有点糟糕)
代码实现:使用mlxtend库
mlxtend
是一个机器学习的扩展库(machine learning extensions),提供了一些常用的算法。
该库可以通过 pip 安装,如果安装失败,可以在 https://pypi.org/project/mlxtend/ 上下载源文件到本地安装:
(sci) PS D:\MachineLearning\demo> cd .\mlxtend-0.19.0\
(sci) PS D:\MachineLearning\demo\mlxtend-0.19.0> python .\setup.py install
使用 mlxtend 库中的函数,同样可以挖掘出强关联规则。首先,需要对数据预处理,将原始数据转换为布尔值:
得到的结果是一个只包含布尔值的二维数组。接下来将其转换为 DateFrame
:
此时得到的数据类型已经可以使用 mlxtend 里的函数来计算了:
可以利用最小置信度在得到的频繁项集中挖掘强关联规则:
置信度除了用之前的公式计算外,还可以使用以下公式:
\\[ \text{conf}(\{A\}\rightarrow \{B\})=\frac{\text{support}({A,B})}{\text{support}(A)} \\]除此之外,输出结果中还包含了 lift 、leverage 、conviction 几项,它们都是用来衡量关联度强弱的。
lift 代表提升度,计算公式为:
\\[ \text{lift}(\{A\}\rightarrow \{B\})=\frac{\text{support}(\{A,B\})}{\text{support}(A)\times \text{support}(B)} \\]该值越大,代表两者的关联度越强。
leverage 代表杠杆率,计算公式为:
\\[ \text{leverage}(\{A\}\rightarrow \{B\})=\text{support}(\{A,B\})- \text{support}(A)\times \text{support}(B) \\]该值越大,同样代表两者的关联度越强。
conviction 代表确信度,计算公式为:
\\[ \text{conv}(\{A\}\rightarrow \{B\})=\frac{1-\text{support}(B)}{1-\text{conf}(\{A\}\rightarrow \{B\})} \\]该值越大,同样代表两者的关联度越强。