学习使用apriori算法挖掘关联关系

2024-1-26 11:59| 发布者: Fuller| 查看: 5163| 评论: 0

摘要: 2个月前我们分享了一篇论文范例《多词共现分析方法在暴雨-地质灾害应急任务研究中的应用》,该范例作者利用关联规则挖掘——Apriori算法提取案例文本中的频繁项集作为共现词集。围绕着apriori算法和关联关系分析,我 ...

1  什么是关联关系

2个月前我们分享了一篇论文范例《多词共现分析方法在暴雨-地质灾害应急任务研究中的应用》,该范例作者利用关联规则挖掘——Apriori算法提取案例文本中的频繁项集作为共现词集。围绕着apriori算法和关联关系分析,我们做一些实验和探讨。

下面使用apriori算法的例子来自mlxtend官网例子。在生成频繁项集和关联关系的时候,自然会联想到相关性以及皮尔森相关系数的计算,那么相关性和关联关系有什么区别呢?

Association and Correlation这篇文章用图例说明了关联关系涵盖的范围更大,相关性是其中一种关联关系,比如,皮尔森相关系数考察线性相关的程度,而Spearman's rank correlation考察非直线的上升和下降趋势,参看下图,摘自:Association, correlation and causation

图1. Association vs. Correlation

但是提到用apriori算法挖掘关联关系的时候,这时所说的关联关系是一种特别的关联关系,称为关联规则,用A->B描述一种依赖关系,从下面的实验可以看到,apriori算法得到的关联关系是一种非对称的关系,而皮尔森等相关系数是对称的。A->B这种表达看起来是在描述一种因果关系(causality),但是,在Tan,Steinbach等人写的Introduction to Data Mining一书第一版第5章P.360页上这样说的:

Association analysis results should be interpreted with caution. The inference made by an association rule does not necessarily imply causality. Instead, it can sometimes suggest a strong co-occurrence relationship between items in the antecedent and consequent of the rule. Causality, on the other hand, requires knowledge about which attributes in the data capture cause and effect, and typically involves relationships occurring over time (e.g., greenhouse gas emissions lead to global warming). See Section 5.7.1 for additional discussion.

下面的例子都是针对购物篮分析,购物篮分析的一个应用场景是形成推荐关系。在推荐系统中,既可以使用基于规则的推荐,也可以使用基于近邻关系的推荐。前者可用Apriori算法为代表,该算法可计算得到关联规则;后者可以采用皮尔森相关系数算法或者余弦相似度算法得到相似程度(衡量近邻关系)。A Comparison of Three Recommender Strategies for Facilitating Person-Centered Care in Nursing Homes这篇文章对比了多种推荐算法,而且数据要比购物篮分析要复杂,比如,针对文本内容的推荐。

如果要了解关联分析的理论和原理,一本大数据挖掘方面的书是必读的:Introduction to Data Mining,第二版第6和7章专门讲关联关系挖掘,第六章可在线免费阅读

2  第三方库

本Notebook使用了第三方库mlxtend。

mlxtend(machine learning extensions,机器学习扩展)是一个用于日常数据科学任务的有用工具的Python库。mlxtend可以用作模型的可解释性,还包括统计评估、数据模式、图像提取等。mlxtend是一个Python第三方库,用于支持机器学习和数据分析任务。

mlxtend库提供了许多有用的工具,可以帮助您更轻松地进行数据预处理、特征选择、模型选择和评估、集成学习以及可视化等任务。以下是mlxtend库的一些主要功能:

  • 数据预处理:提供数据清洗和转换工具,包括缺失值填充、数据标准化和离散化、数据集分割等。
  • 数据可视化:提供了多种可视化工具,包括学习曲线、决策边界和特征重要性等。
  • 特征选择:提供了多种常见的特征选择算法,包括递归特征消除、基于树的特征选择和基于模型的特征选择等。
  • 模型选择和评估:提供了用于网格搜索、交叉验证和模型评估的工具,可以帮助您选择最佳的机器学习模型。
  • 集成学习:提供了多种集成学习算法,包括投票分类器、堆叠分类器和AdaBoost等。

如果未安装,请先使用下面的命令安装mlxtend库,再运行实验本notebook:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mlxtend #国内安装使用清华的源,速度快

【注意】注意看下面的截图,上述命令是在Anaconda Powershell Prompt中执行的,而不是普通的windows命令窗口。从windows开始菜单->Anaconda安装包下面找这个菜单。也可以用Anaconda Prompt,效果一样。如果安装过程中提示说权限不够,那么选择这个菜单的时候用鼠标右键,选择用管理员身份运行。

图2. pip安装

3  加载必要的程序包

import pandas as pd

from mlxtend.preprocessing import TransactionEncoder

from mlxtend.frequent_patterns import apriori

from mlxtend.frequent_patterns import association_rules

import warnings

warnings.filterwarnings("ignore", category=DeprecationWarning)

4  生成频繁项集

使用下面的测试数据,每一行可以看成是已付款的一个购物篮内容。

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']]

dataset

转成one-hot编码的矩阵,one-hot编码只表示有还没有,不表示有多少。

te = TransactionEncoder()

te_ary = te.fit(dataset).transform(dataset)

df = pd.DataFrame(te_ary, columns=te.columns_)

df

下面我们只选择支持度超过60%的频繁项。在上面的例子,一行数据表示一个交易(已付款的购物篮内容),那么,每个项的支持度 = 这个项出现的交易数量 / 总交易数量。

frequent_itemsets = apriori(df, use_colnames=True, min_support=0.6)

frequent_itemsets

4.1  过滤频繁项集

假设只想看含有两项的频繁项集,而且只要高于一定支持度的集合。

下面,我们给frequent_itemsets这个dataframe增加一列,记录项集的大小,方便后面根据项数过滤。

frequent_itemsets['length'] = frequent_itemsets['itemsets'].apply(lambda x: len(x))

frequent_itemsets

看看支持度超过0.5,只有两项的项集

frequent_itemsets[ (frequent_itemsets['length'] == 2) & (frequent_itemsets['support'] >= 0.5) ]

5  生成关联关系

让我们观察一下项(或项集)之间的关联关系,也就是A->B这种蕴含关系。衡量关联关系强弱也有多个指标,比如,confidence, lift等,表示蕴含关系成立的信念程度。也有support这个指标,但是不是对关联关系成立信念的度量,而只是统计了同时出现{A, B}的频度。详见:

下面,我们使用confidence做实验,而且要可信度0.7以上的关联关系。

rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7)

rules

5.1  过滤关联关系

根据设定条件进行过滤,得到更少的条目便于观察

rules[ (rules['confidence'] > 0.75) & (rules['lift'] > 1.2) ]

还可以限定项集的大小。先为rules表增加字段,记录项集大小

rules["antecedent_len"] = rules["antecedents"].apply(lambda x: len(x))

rules


rules["consequent_len"] = rules["consequents"].apply(lambda x: len(x))

rules

rules[ (rules['antecedent_len'] >= 2) & (rules['confidence'] > 0.75) & (rules['lift'] > 1.2) ]

6  源代码下载

本notebook的源代码可以点击下载:用Python实现apriori算法挖掘关联关系


鲜花

握手

雷人

路过

鸡蛋

最新评论

GMT+8, 2024-12-5 06:05