数据挖掘1-Apriori算法

323 阅读5分钟

算法简介:

Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合的模式有助于我们做一些决策。

  • 关联规则挖掘:发现数据库中某些属性的有趣联系

基本定义

  • 事务:一次交易记录
  • 项:事务中的一个元素
  • 项集:多件商品的组合
  • k-项集:项集中包含k个项 (k件商品构成的项集)
  • 频繁项集:对于一个项集,它出现在若干事务中
  • 支持度【support】:包含项集的事务数/所有事务数
  • 最小支持度:人为设定的一个阈值,用来评判一个项集是否是频繁项集。若一个项集大于最小支持度即为频繁项集。
  • 置信度【confidence】:在出现A项/项集的所有事务中,包含B项/项集的情况占全部事务的比例。
    令X,Y为项集 Y的置信度=XUY的事务数/X的事务数
  • 最小置信度: 人为规定的阈值
  • 关联规则:支持度和置信度均超过最小要求
    • supprot(x-y)>最小支持度
    • confidence(x-y)>最小置信度
    • p(xUy)/p(x)>minconf\

例:给定四条销售记录,找出AC是否关联

302420407db4e77adcd979a4c4a6fa3.png

计算原理

  • 在所有事务中提取出一维标签,提取出 1项集,作为候选项集1,并给出每一个项集的支持数。 按照最小支持数,提取出频繁项集1
  • 在频繁项集1的基础上两两组合,组合出候选项集2,均为2项集,重新扫描数据库,找出满足最小支持度的频繁项集。
  • 原则:非频繁项集的超集一定是非频繁的。 频繁项集的子项集必为频繁项集
  • 在k项集的候选项集中,比如3项集,若任何一个子项集不是频繁项集,则这个3项集一定不会是频繁项集。可以通过剪枝直接去掉,提高效率。

提高效率的策略

  • 事务压缩
  • 数据化分
    • 将D中的事务划分为n个非重叠部分。 扫描一次数据库,找出每一部分内的 频繁项集,称作局部频繁项集。所有部分的局部频繁项集的集合形 成D的全局候选项集,扫描一次数据库, 评估支持度,确定全局频繁项集。
      该方法不会遗漏,该项集一定会在某一个部分表现出频繁项集的特征来,若在每一部分都不是频繁项集,整体也一点不会表现出频繁项集的特征。
  • 数据选样
    • 由于此策略是搜索S中,而不是D中的频繁项集,有可能丢失一些全局频繁项集。 为减少这种可能性,使用比最小支持度低的支持阈值来找出S的频繁项集。
  • 动态项集计数

实现代码部分:

基础知识:

  • anaconda安装mlxtend

    • anaconda.org/conda-forge… 打开官网链接,在电脑开始栏中打开Anaconda3中的Anaconda 中的prompt
      输入命令 conda install -c conda-forge mlxtend
    • mlxtend:是一个用于日常数据科学任务的有用工具的Python库。mlxtend可以用作模型的可解释性,还包括统计评估、数据模式、图像提取等。
  • 关于Pandas 数据结构 DataFrame:
    DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。

a9041c9723e737a7ac57f127520db7f.png

[关于需要DataFrame的原因]:输入的事务(商品购买记录)需要转换成二维的true和False矩阵,必须要进行格式的转化。

  • TransactionEncoder:将项列表转换为交易数据,用于频繁项集挖掘
    详细用法见 rasbt.github.io/mlxtend/use… 将 Python 列表形式的数据库事务数据编码到 NumPy 数组中。\
    • 使用 TransactionEncoder 对象,我们可以将此数据集转换为适合典型机器学习 API 的数组格式。 通过 fit 方法,TransactionEncoder 学习数据集中的唯一标签,并通过 transform 方法,将输入数据集(Python 列表列表)转换为 one-hot 编码的 NumPy 布尔数组
from mlxtend.preprocessing import TransactionEncoder 
dataset = [['Apple', 'Beer', 'Rice', 'Chicken'], 
['Apple', 'Beer', 'Rice'], 
['Apple', 'Beer'], 
['Apple', 'Bananas'], 
['Milk', 'Beer', 'Rice', 'Chicken'], 
['Milk', 'Beer', 'Rice'], 
['Milk', 'Beer'], 
['Apple', 'Bananas']]

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

ans:

array([[ True, False, True, True, False, True],
[ True, False, True, False, False, True], 
[ True, False, True, False, False, False], 
[ True, True, False, False, False, False], 
[False, False, True, True, True, True], 
[False, False, True, False, True, True], 
[False, False, True, False, True, False], 
[ True, True, False, False, False, False]], dtype=bool)

接下来把ary列表转换成DataFrame的格式

import pandas as pd 
pd.DataFrame(te_ary, columns=te.columns_)

完整代码

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

# 我们可以通过 TransactionEncoder 将其转换为正确的格式
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
print(te_ary)

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

# let us return the items and itemsets with at least 60% support
# 设置60%的最小支持度
apriori(df, min_support=0.6)
# 默认情况下,apriori 返回项目的列索引,这在关联规则挖掘等下游操作中可能很有用。
# 为了更好的可读性,我们可以设置 use_colnames=True 将这些整数值转换为相应的项目名称
print(apriori(df, min_support=0.6, use_colnames=True))

运行结果

c0f4e4daaedbc52c39935b3d5b7dedd.png