从零开始的关联挖掘规则

从零开始的关联挖掘规则

您是否对 Apriori 算法和关联规则的工作原理感到好奇?以及 Permutation & Combination 如何在挖掘规则中发挥作用。那么你来对地方了,让我带你去看看吧。在本文中,我们将讨论:

Photo by 安妮斯普拉特 on 不飞溅

注:作者希望读者理解基本概率、排列、组合、Numpy、Pandas 模块。

许多企业在日常运营中积累了大量的数据。例如,每天在杂货店收集大量客户的购买细节。此类数据,通常称为 市场篮子交易 如图 1 所示。每一行 i:e 每个客户交易一次标记为 交易 .图 1 说明了一个示例,事务 1 包含 {Bread},事务 2 包含 {Scandinavian},事务 3 包含 {Hot Chocolate, Jam, Cookies} 等。

Figure 1: Market Basket Transaction

购物篮数据应转换为二进制格式,如图 2 所示。其中每一行对应一个交易,每一列对应一个项目。 Item 可以被视为二进制变量,如果 item 存在于事务中,则值为 1,否则为 0。

Figure 2: Binary Representation of Market Basket data

项目集和支持计数

令 I = {Bread, Scandinavian, Cake, Muffin, Coffee, Pastry} 为市场篮数据中所有项目的集合,T = Total No of transaction 为所有交易的集合。一个项目集可能包含一个或多个项目,例如 {Cake}、{Bread}、{Bread, Cake}、{Bread, Coffee}。项集的一个重要属性是它的支持计数,它指的是包含项集的事务数。在数学上,项集 {Bread, Coffee} 的支持度 {Bread, Coffee} 可以表述如下:

频繁项集生成:

目标是找到满足 最低限度 阈值支持,这些项集称为 频繁项集 否则 **** 叫 不常见的项集。 如果我使用这个术语,请不要混淆。图 3 显示了可以由项集 I = {a, b, c, d, e} 生成的所有可能项集。一般来说,包含 k 个项目的数据集可能会生成多达 2^K 个项目集。因为 K 在许多实际应用中可能非常大,所以它的计算成本很高。为了克服这个问题,我们可以按如下方式修剪不需要的项集,如图 3 所示。当项集 {a}、{b} 不频繁时,则其所有超集(即图中的非阴影项集) ) 也必须不频繁。假设{c, d, e}是一个频繁项集,那么它的所有子集项集(即图中的阴影项集)也一定是频繁的。

Figure 3: Frequent itemsets

先验算法:

让我向您展示 Apriori 算法如何工作并基于频繁项集的子集也必须是频繁项集的概念生成频繁项集。下面是使用我们数据集中的示例生成频繁项集的代码。

 def APRIORI_MY(数据,min_support=0.04,max_length = 4):  
 # min_suppport 是最小阈值支持。  
 # 其中 max_length 是要包含在项目集中的最大项目数。  
 # 收集所需库  
 将 numpy 导入为 np  
 将熊猫导入为 pd  
 从 itertools 导入组合 # 步骤1:  
 # 创建一个字典来存储项集的支持。  
 支持 = {}  
 L = 设置(data.columns)  
      
 # 第2步:  
 # 在第 i 次迭代中生成具有 len i 项的组合  
 对于范围内的 i (1, max_length+1):  
 c = 列表(组合(L,i))  
          
 # 为下一次(i+1)次迭代重置“L”  
 L =设置()  
     
 # 第 3 步:  
 #遍历“c”中的每个项目  
 对于列表(c)中的 j:  
 sup = data.loc[:,j].product(axis=1).sum()/len(data.index)  
 如果 sup > min_support:  
 支持[j] = 支持  
                  
 # 在列表“L”中添加频繁项集,已经重置列表“L”  
 L = 集合(集合(L)|集合(j))  
          
 # STEP 4: data frame with cols "items", 'support'  
 结果 = pd.DataFrame(list(support.items()), columns = ["Items", "Support"])  
 返回(结果)

步骤1:

  • 为存储的项集和支持创建字典“支持”。
  • 将所有项目存储在数据集中可用的集合“L”中

第2步: 迭代如下:

迭代 1: 最初,该算法列出所有项并计算对长度为 1 的频繁项集的支持并将其存储在字典中,字典有助于使用键作为项来检索值作为支持,这里很少显示在图 4-表 L1 中。在这里,我们假设 4% 作为最小阈值支持。

Figure 4: Iteration 1

正如您在此处看到的,项目 ' 斯堪的纳维亚语' 和 ' 松饼' 不常见。所以,我们要 丢弃 { “斯堪的纳维亚”、“松饼” } 在即将到来的迭代中。我们将最终的表 F1 作为频繁项集。

迭代 2: 接下来,我们将创建 2 个项目集的组合并计算它们的支持度。在本次迭代中使用了图 4-表 F1 中显示的所有项集组合。

Figure 5: Iteration 2

不频繁的项集再次被消除。在这种情况下 {('Bread', 'Cake'), ('Bread', 'Pastry'), ('Cake', 'Pastry')} 如图 5-表 L2 所示。 现在,让我们了解什么是剪枝以及它如何使 Apriori 成为查找频繁项集的最佳算法之一。

修剪: 在这里,我们将图 6-表 L3 中的项目集划分为子集,并丢弃支持度小于最小阈值支持度的子集。

迭代 3: 这里所有的项集都是不频繁的,因为它的子集 {('面包', '蛋糕'), ('面包', '糕点'), ('蛋糕', '糕点')} 已经丢弃在图 5 表中。 L2,所以它的超集也将不常见。 **** 这是 Apriori 算法的主要亮点。

Figure 6: Iteration 3

由于迭代 3 中的所有项集都不频繁,我们将在此停止。

第 3 步:

  • 计算每个 jth 项集的支持度。
  • 如果 sup 满足最低支持阈值,则添加到“支持”字典。
  • 为每个第 j 个项目集更新“L”,将列表 L 和项目集 (j) 中的项目集并集
  • L = 列表(集合(L)|集合(j))

让ms给大家展示一下appriori算法得到的实际频繁项集。

Figure 7: Frequent Itemset

我们几乎完成了,因为我们已经获得了频繁项集,这通常需要更多的计算时间。接下来我们将看到关联规则。

关联规则:

本节描述如何从上面获得的频繁项集中有效地提取关联规则。将频繁项集 {Bread, Coffee} 划分为两个非空子集可以获得关联,1) Bread => Coffee,简单理解“ 如果面包那么咖啡 ”, 2) 咖啡 => 面包, “ 如果咖啡那么面包” .子集满足最小阈值置信度,正提升可以称为强规则。好奇什么是信心和提升?让我告诉你,有几种方法可用于分析规则,在本文中,我们将讨论置信度和提升度。

信心:

目标是从上一步找到的频繁项集中提取所有高置信度规则。它说 结果 (咖啡)作为一种效果带来 先行者 (面包)。这条规则称为强规则。

但是置信度度量有一个缺点,它可能会歪曲关联的重要性。因为它只说明了前因(面包)有多受欢迎,而不是后因(咖啡)。如果咖啡非常受欢迎,那么包含 Bread 的交易很可能也包含咖啡,从而夸大了置信度。为了克服这个缺点,我们使用了第三种方法,称为 电梯 .

电梯:

Lift 计算规则的置信度与规则后件中项集的支持度之间的比率。它表示在已经购买了前件(面包)时购买后件(咖啡)的可能性,同时控制后件(咖啡)的受欢迎程度。当 (Bread => Coffee) 的提升为 1 时,表示物品之间没有关联。大于 1 的提升值意味着如果已经带来了面包,则可能会带来咖啡,而小于 1 的值意味着如果已经带来了面包,则不太可能带来咖啡。

关联算法:

现在我们将关联规则应用于前面算法得到的频繁项集。我们将假设最小阈值置信度为 50%。

 def ASSOCIATION_RULE_MY(df, min_threshold=0.5):  
 将熊猫导入为 pd  
 从 itertools 导入排列  
      
 # 步骤1:  
 #创建所需的变量  
 support = pd.Series(df.Support.values, index=df.Items).to_dict()  
 数据 = []  
 L= df.Items.values  
      
 # 第2步:  
 #使用排列生成规则  
 p = 列表(排列(L,2))  
      
 # 遍历每条规则  
 对于 p 中的 i:  
          
 # 如果规则的 LHS(Antecedent) 是 RHS 的子集,则有效规则。  
 如果设置(i[0]).issubset(i[1]):  
 配置 = 支持[i[1]]/支持[i[0]]  
 如果 conf > min_threshold:  
 j = i[1][不是 i[1].index(i[0][0])]  
 提升 = 支持[i[1]]/(支持[i[0]]* 支持[(j,)])  
 杠杆 = support[i[1]] - (support[i[0]]* support[(j,)])  
 对流 = (1 - 支持[(j,)])/(1- conf)  
 data.append([i[0], (j,), support[i[0]], support[(j,)], support[i[1]], conf, lift, 杠杆, convection]) # 第 3 步:  
 结果 = pd.DataFrame(数据,列 = [“前件”,“后件”,“前件支持”,“后件支持”,  
 “支持”、“信心”、“提升”、“杠杆”、“对流”])  
 返回(结果)

步骤1:

  • 列出所有频繁项集及其对字典“support”的支持。
  • 创建列表“数据”以存储结果。
  • 列出所有频繁项集到列表“L”。

第2步:

  • 最初,算法将使用频繁项集大小为 2 的排列生成规则,并计算 Confidence 和 Lift,如图 8 所示。

Figure 8: Strong Rule

为什么 Permutation over Combination 来计算规则? 让我用一个简单的例子来回答这个问题。

由于包含 Cake & Coffee 的交易数量与包含 Coffee 和 Cake 的交易数量相同,因此订单无关紧要。但这通常不是案例,让我解释一下。

信心(蛋糕= >咖啡)=支持(蛋糕和咖啡)/支持(蛋糕)= 0.52

信心(咖啡 = > 蛋糕)= 支持(蛋糕和咖啡)/ 支持(咖啡)= 0.11

在这里,顺序很重要;因此,我们将选择那些满足最小阈值置信度的规则。 Permutation帮助固定Antecedent在左侧的位置,混淆让我用一个简单的例子来解释,让我们有Cake,Coffee和(Coffee,Cake)的Permutation来计算规则如下。

{Cake, (Cake, Coffee)}, LHS(Cake) 对于前件是固定的,它必须是 RHS (Cake, Coffee) 的子集,这给出了信心 (Cake => Coffee)。

{Coffee, (Cake, Coffee)} = LHS(Coffee) 对于前件是固定的,它必须是右侧 (Cake, Coffee) 的子集,这给出了信心 (Coffee => Cake)。

到这里为止一切都很好,但是我们将有更多的规则,例如 {(Cake, Coffee), Cake} 和 {(Cake, Coffee), Coffee},这里的前件是 (Cake, Coffee),这似乎不正确,因此子集条件用于消除这样的规则。

计算每个 ith 项集的 Confidence 和其他规则,如果 Confidence 满足最小 Confidence 阈值,则添加到“Data”。

下面的图 9 显示了从实验数据集中获得的强规则。不要忘记规则只适用于频繁项集。

Figure 9: My Rule

最后,我们将使用 Python 中可用的名为 mlextend.frequent_patterns 的标准包交叉验证我们的结果,该包具有 Apriori 和关联规则模块。

先验结果:

关联规则结果:

从上面的比较我们可以得出结论,我们的结果与标准包相匹配,并且已经达到了提出的目标。随意下载我的 GitHub 上提供的暂存代码 链接 https://github.com/Roh1702/Association-Mining-Rule-from-Scratch

为什么 电梯 更好地衡量 信心 ?我们将在我即将发布的另一篇文章中详细了解这一点。

参考:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/37302/20131713

posted @ 2022-09-17 13:22  哈哈哈来了啊啊啊  阅读(65)  评论(0编辑  收藏  举报