【数据挖掘 | 关联性分析】万字长文详解关联性分析,详解Apriori算法为例,确定不来看看?-LMLPHP

【数据挖掘 | 关联性分析】万字长文详解关联性分析,详解Apriori算法为例,确定不来看看?-LMLPHP


摘要: 本系列旨在普及那些深度学习路上必经的核心概念,文章内容都是博主用心学习收集所写,欢迎大家三联支持!本系列会一直更新,核心概念系列会一直更新!欢迎大家订阅

@

关联性分析

数据挖掘中的关联分析是一种用于发现数据集中不同项之间的关联关系的方法。关联分析通常用于在大规模数据集中发现频繁项集和关联规则。总的来说,关联规则通过量化的数字决定某物品甲对物品乙的出现有多大的影响。该模式属于描述性模式,属于**无监督学习**的方法

下面是几种常见的关联分析方法及其详细解释:

  1. 频繁项集挖掘(Frequent Itemset Mining):频繁项集是指在数据集中同时出现的项的集合。频繁项集挖掘的目标是找到在数据集中出现频率高于预定义阈值的项集。常用的频繁项集挖掘算法包括Apriori算法和FP-Growth算法。

  2. 关联规则挖掘(Association Rule Mining):关联规则是指项集之间的条件关系,例如"A->B"表示项集A出现时,项集B也可能出现。关联规则挖掘的目标是从频繁项集中找到具有一定置信度的关联规则。关联规则通常使用支持度和置信度来衡量规则的重要性。常用的关联规则挖掘算法包括Apriori算法和FP-Growth算法。

  3. 序列模式挖掘(Sequential Pattern Mining):序列模式是指在时间序列数据中出现的一系列项的序列。序列模式挖掘的目标是发现在时间序列数据中频繁出现的序列模式。序列模式挖掘算法需要考虑项的出现顺序和时间跨度,常用的算法包括GSP(Generalized Sequential Pattern)算法和PrefixSpan算法。

  4. 关联网络分析(Association Network Analysis):关联网络分析是通过构建关联网络来分析数据集中的关联关系。关联网络由节点和边组成,其中节点代表项集,边代表项集之间的关联关系。关联网络分析可以帮助识别关键节点和关联子图,从而揭示数据集的结构和关联模式。

  5. 多层次关联分析(Multilevel Association Analysis):多层次关联分析是一种用于发现数据集中多个层次的关联关系的方法。它可以在不同的抽象层次上进行关联分析,从而揭示数据集中的多个关联模式。多层次关联分析可以通过层次划分、多层次关联规则和多层次关联网络来实现。

这些关联分析方法在数据挖掘中被广泛应用,可以帮助发现数据集中的隐含关系和模式,提供有价值的洞察和决策支持。根据具体的应用场景和数据特点,选择适合的关联分析方法进行数据挖掘分析。

下面是常用的关联规则算法的详细解释、优缺点以及以Markdown表格格式给出的总结:

以上方法中实现较好的为Apriori算法,以及灰色关联分析算法。

Apriori 算法

下面详细介绍Apriori算法的步骤和数学推导:

  1. 数据预处理:首先,需要对数据进行预处理,确保数据集的格式适用于Apriori算法。通常,数据集采用事务表示,每个事务由若干项组成,项可以是商品、产品或其他类型的数据。

  2. 构建候选项集:根据预处理的数据集,首先生成所有可能的单个项集作为候选项集。对于大规模数据集,可以使用特殊的数据结构(如FP树)来加速候选项集的生成。

  3. 计算候选项集的支持度:遍历数据集,统计每个候选项集在数据集中出现的次数,即候选项集的支持度。支持度表示项集在数据集中出现的频率。

  4. 剪枝操作:根据设定的最小支持度阈值,将支持度低于阈值的候选项集剪枝,去除非频繁项集。这样可以减少后续步骤中的搜索空间。

  5. 组合生成更大的候选项集:从频繁项集中生成新的候选项集。对于频繁项集Lk-1,将其两两组合生成候选项集Ck,其中k表示项集的大小。

  6. 重复步骤3-5,直到无法生成更多的候选项集。

  7. 生成关联规则:对于每个频繁项集,生成关联规则。关联规则的生成可以通过逐个项集的方式,或者通过递归方式生成更多的规则。

  8. 计算置信度:计算每个关联规则的置信度。置信度表示规则的可信程度,即前项和后项同时出现的概率。

  9. 根据设定的最小置信度阈值,筛选出满足置信度要求的关联规则。

  10. 返回满足条件的关联规则作为挖掘结果。

    我们举一个实际例子来更好理解

    此外得到的频繁项集中还有以下各项指标

    经典案例
    我们将使用一个经典的数据集,称为"Groceries",该数据集包含一段时间内超市顾客购买的物品清单。我们将使用Python中的mlxtend库来实现Apriori算法。

    数据集获取链接: https://www.kaggle.com/datasets/heeraldedhia/groceries-dataset (Dataset of 38765 rows for Market Basket Analysis)

    最流行的是mlxtend包。mlxtend是一个Python库(Machine Learning Extensions),旨在为机器学习领域提供额外的功能和扩展,以丰富机器学习工具箱,其中包括Apriori算法。

    下面是一个使用mlxtend库的模板代码:

    from mlxtend.preprocessing import TransactionEncoder
    from mlxtend.frequent_patterns import apriori, association_rules
    import pandas as pd
    
    # 加载数据集(简单)
    dataset = [["牛奶", "洋葱", "鸡蛋"],
               ["洋葱", "肉", "鸡蛋", "香蕉"],
               ["牛奶", "苹果", "鸡蛋"],
               ["牛奶", "洋葱", "肉", "鸡蛋"],
               ["洋葱","苹果", "鸡蛋"],
               ["鸡蛋", "苹果"],
               ["洋葱", "牛奶", "苹果", "鸡蛋"]]
    
    # 处理数据
    # 读取数据集
    data = pd.read_csv('grocery_store.csv', header=None)
    
    # 数据预处理
    transactions = []
    for i in range(len(data)):
        transactions.append([str(data.values[i, j]) for j in range(len(data.columns))])
    # 根据同一名用户同一时间作为一行数据
    
       
    # 转换数据集为布尔矩阵
    te = TransactionEncoder()
    te_ary = te.fit(dataset).transform(dataset)
    df = pd.DataFrame(te_ary, columns=te.columns_)
    
    # 使用Apriori算法找出频繁项集
    frequent_itemsets = apriori(df, min_support=0.2, use_colnames=True)
    
     # 计算关联规则的置信度和支持度
      rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7)
    print(rules)
    

【数据挖掘 | 关联性分析】万字长文详解关联性分析,详解Apriori算法为例,确定不来看看?-LMLPHP

不使用库的模板代码:

#-*- coding: utf-8 -*-
from __future__ import print_function
import pandas as pd

#自定义连接函数,用于实现L_{k-1}到C_k的连接
def connect_string(x, ms):
  x = list(map(lambda i:sorted(i.split(ms)), x))
  l = len(x[0])
  r = []
  for i in range(len(x)):
    for j in range(i,len(x)):
      if x[i][:l-1] == x[j][:l-1] and x[i][l-1] != x[j][l-1]:
        r.append(x[i][:l-1]+sorted([x[j][l-1],x[i][l-1]]))
  return r

#寻找关联规则的函数
def find_rule(d, support, confidence, ms = u'--'):
  result = pd.DataFrame(index=['support', 'confidence']) #定义输出结果
  
  support_series = 1.0*d.sum()/len(d) #支持度序列
  column = list(support_series[support_series > support].index) #初步根据支持度筛选
  k = 0
  
  while len(column) > 1:
    k = k+1
    print(u'\n正在进行第%s次搜索...' %k)
    column = connect_string(column, ms)
    print(u'数目:%s...' %len(column))
    sf = lambda i: d[i].prod(axis=1, numeric_only = True) #新一批支持度的计算函数
    
    #创建连接数据,这一步耗时、耗内存最严重。当数据集较大时,可以考虑并行运算优化。
    d_2 = pd.DataFrame(list(map(sf,column)), index = [ms.join(i) for i in column]).T
    
    support_series_2 = 1.0*d_2[[ms.join(i) for i in column]].sum()/len(d) #计算连接后的支持度
    column = list(support_series_2[support_series_2 > support].index) #新一轮支持度筛选
    support_series = support_series.append(support_series_2)
    column2 = []
    
    for i in column: #遍历可能的推理,如{A,B,C}究竟是A+B-->C还是B+C-->A还是C+A-->B?
      i = i.split(ms)
      for j in range(len(i)):
        column2.append(i[:j]+i[j+1:]+i[j:j+1])
    
    cofidence_series = pd.Series(index=[ms.join(i) for i in column2]) #定义置信度序列
 
    for i in column2: #计算置信度序列
      cofidence_series[ms.join(i)] = support_series[ms.join(sorted(i))]/support_series[ms.join(i[:len(i)-1])]
    
    for i in cofidence_series[cofidence_series > confidence].index: #置信度筛选
      result[i] = 0.0
      result[i]['confidence'] = cofidence_series[i]
      result[i]['support'] = support_series[ms.join(sorted(i.split(ms)))]
  
  result = result.T.sort_values(['confidence','support'], ascending = False) #结果整理,输出
  print(u'\n结果为:')
  print(result)
  
  return result

——————————————————————————————————————————————————————————————————————————————————————————
#-*- coding: utf-8 -*-
#使用Apriori算法挖掘菜品订单关联规则
from __future__ import print_function
import pandas as pd
from apriori import * #导入自行编写的apriori函数

inputfile = '../data/menu_orders.xls'
outputfile = '../tmp/apriori_rules.xls' #结果文件
#data = pd.read_excel(inputfile, header = None)
# 加载数据集(简单)
data = [["牛奶", "洋葱", "鸡蛋"],
           ["洋葱", "肉", "鸡蛋", "香蕉"],
           ["牛奶", "苹果", "鸡蛋"],
           ["牛奶", "洋葱", "肉", "鸡蛋"],
           ["洋葱","苹果", "鸡蛋"],
           ["鸡蛋", "苹果"],
           ["洋葱", "牛奶", "苹果", "鸡蛋"]]

print(u'\n转换原始数据至0-1矩阵...')
ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #转换0-1矩阵的过渡函数
b = map(ct, data.as_matrix()) #用map方式执行
data = pd.DataFrame(list(b)).fillna(0) #实现矩阵转换,空值用0填充
print(u'\n转换完毕。')
del b #删除中间变量b,节省内存

support = 0.2 #最小支持度
confidence = 0.5 #最小置信度
ms = '---' #连接符,默认'--',用来区分不同元素,如A--B。需要保证原始表格中不含有该字符

find_rule(data, support, confidence, ms).to_excel(outputfile) #保存结果

相关学习资源:

  1. R. Agrawal, R. Srikant. Fast algorithms for mining association rules , 1994
  2. mlxtend官方文档:http://rasbt.github.io/mlxtend/
  3. Python数据分析与挖掘实战(朱明星 著)- 第12章 关联规则挖掘

【数据挖掘 | 关联性分析】万字长文详解关联性分析,详解Apriori算法为例,确定不来看看?-LMLPHP

						  🤞到这里,如果还有什么疑问🤞
					🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
					 	 🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳
10-26 07:53