Apriori 算法在机器学习中的应用

2025年3月17日 | 阅读 8 分钟

Apriori 算法使用频繁项集来生成关联规则,它被设计用于处理包含事务的数据库。通过这些关联规则,它可以确定两个对象之间连接的强弱。该算法使用广度优先搜索哈希树来有效地计算项集关联。这是一个从大型数据集中查找频繁项集的迭代过程。

该算法由R. AgrawalSrikant1994 年提出。它主要用于购物篮分析,并有助于查找可以一起购买的产品。它还可以用于医疗保健领域,用于查找患者的药物反应。

什么是频繁项集?

频繁项集是指支持度大于阈值或用户指定的最小支持度的项集。这意味着如果 A 和 B 是频繁项集,那么单独的 A 和 B 也应该是频繁项集。

假设有两个事务:A= {1,2,3,4,5},B= {2,3,7},在这两个事务中,2 和 3 是频繁项集。

注意:为了更好地理解 Apriori 算法以及支持度和置信度等相关术语,建议先了解关联规则学习。

Apriori 算法步骤

Apriori 算法的步骤如下:

步骤 1:确定事务数据库中项集的支持度,并选择最小支持度和置信度。

步骤 2:选取事务中支持度大于最小支持度或选定支持度的所有项集。

步骤 3:查找这些子集中置信度大于阈值或最小置信度的所有规则。

步骤 4:按提升度(lift)的降序对规则进行排序。

Apriori 算法工作原理

我们将通过一个例子和数学计算来理解 Apriori 算法。

示例:假设我们有以下数据集,其中包含各种事务,并且我们需要从此数据集中使用 Apriori 算法查找频繁项集并生成关联规则。

Apriori Algorithm in Machine Learning

解决方案

步骤 1:计算 C1 和 L1

  • 在第一步中,我们将创建一个表,其中包含数据集中每个项集的支持计数(出现频率)。此表称为候选集或 C1。
    Apriori Algorithm in Machine Learning
  • 现在,我们将剔除所有支持计数大于最小支持度(2)的项集。这将为我们提供频繁项集 L1 的表格。
    由于除了 E 之外,所有项集的支持计数都大于或等于最小支持度,因此将删除 E 项集。
    Apriori Algorithm in Machine Learning

步骤 2:候选集生成 C2 和 L2

  • 在此步骤中,我们将借助 L1 生成 C2。在 C2 中,我们将以子集的形式创建 L1 的项集对。
  • 创建子集后,我们将再次从数据集的主要事务表中查找支持计数,即这些对在给定数据集中共同出现的次数。因此,我们将获得 C2 的下表。
    Apriori Algorithm in Machine Learning
  • 再次,我们需要将 C2 支持计数与最小支持计数进行比较,比较后,支持计数较少的项集将从 C2 表中消除。这将为我们提供 L2 的下表。
    Apriori Algorithm in Machine Learning

步骤 3:候选集生成 C3 和 L3

  • 对于 C3,我们将重复相同的两个过程,但现在我们将使用三个项集的子集创建 C3 表,并从数据集中计算支持计数。这将产生下表。
    Apriori Algorithm in Machine Learning
  • 现在我们将创建 L3 表。正如我们从上面的 C3 表所见,只有一个项集组合的支持计数等于最小支持计数。因此,L3 将只有一个组合,即{A, B, C}。

步骤 4:查找子集的关联规则

要生成关联规则,首先,我们将创建一个新表,其中包含来自已出现组合 {A, B, C} 的可能规则。对于所有规则,我们将使用公式sup(A ^B)/A 计算置信度。在计算了所有规则的置信度值后,我们将排除置信度低于最小阈值(50%)的规则。

考虑下表

规则支持信心
A ^B → C2Sup{(A ^B) ^C}/sup(A ^B)= 2/4=0.5=50%
B^C → A2Sup{(B^C) ^A}/sup(B ^C)= 2/4=0.5=50%
A^C → B2Sup{(A ^C) ^B}/sup(A ^C)= 2/4=0.5=50%
C→ A ^B2Sup{(C^( A ^B)}/sup(C)= 2/5=0.4=40%
A→ B^C2Sup{(A^( B ^C)}/sup(A)= 2/6=0.33=33.33%
B→ B^C2Sup{(B^( B ^C)}/sup(B)= 2/7=0.28=28%

由于给定的阈值或最小置信度为 50%,因此前三条规则A ^B → C、B^C → A 和 A^C → B 可被视为给定问题的强关联规则。

Apriori 算法的优点

  • 这是一个易于理解的算法。
  • 该算法的连接(join)和剪枝(prune)步骤可以轻松地在大数据集上实现。

Apriori 算法的缺点

  • 与其它算法相比,Apriori 算法运行速度较慢。
  • 由于多次扫描数据库,整体性能可能会降低。
  • Apriori 算法的时间复杂度和空间复杂度为 O(2D),非常高。其中 D 表示数据库中的水平宽度。

Apriori 算法的 Python 实现

现在我们将看到 Apriori 算法的实际实现。为了实现这一点,我们有一个零售商的问题,他希望找到他的商店产品之间的关联,以便他可以向客户提供“购买此商品即可获得那个商品”的优惠。

零售商拥有一个包含客户交易列表的数据集信息。在数据集中,每一行显示客户购买的产品或客户进行的交易。为了解决这个问题,我们将执行以下步骤:

  • 数据预处理
  • 在数据集上训练 Apriori 模型
  • 可视化结果

1. 数据预处理步骤

第一步是数据预处理。在此步骤下,我们将首先进行库的导入。代码如下:

  • 导入库

在导入库之前,我们将使用下面的代码行来安装apyori 包以供进一步使用,因为 Spyder IDE 中不包含它。

以下是用于实现将用于模型各种任务的库的代码。

  • 导入数据集
    现在,我们将为我们的 apriori 模型导入数据集。导入数据集时会发生一些变化。数据集的所有行都显示了客户的不同交易。第一行是第一个客户的交易,这意味着没有特定的列名,并且它们有自己的单独值或产品详细信息(参见代码下方的数据集)。因此,我们需要在代码中在此处说明没有指定标题。代码如下:

在上面的代码中,第一行显示将数据集导入 pandas 格式。代码的第二行用于此目的,因为我们将用于训练模型的 apriori() 函数需要列表格式的数据集。因此,我们创建了一个空的交易列表。此列表将包含从 0 到 7500 的所有项集。这里我们取 7501,因为在 Python 中,最后一个索引不被考虑。

数据集看起来像下面的图片。

Apriori Algorithm in Machine Learning

2. 在数据集上训练 Apriori 模型

要训练模型,我们将使用从apyroi 包导入的apriori 函数。此函数将返回用于训练模型在数据集上的规则。请看下面的代码:

在上面的代码中,第一行是导入 apriori 函数。第二行,apriori 函数返回输出作为规则。它接受以下参数:

  • transactions:交易列表。
  • min_support:设置最小支持度浮点值。这里我们使用了 0.003,它是通过取每周每位客户 3 次交易除以总交易次数计算得出的。
  • min_confidence:设置最小置信度值。这里我们取了 0.2。可以根据业务问题进行更改。
  • min_lift:设置最小提升度值。
  • min_length:它接受关联产品数的最小值。
  • max_length:它接受关联产品的最大数量。

3. 可视化结果

现在我们将可视化我们的 apriori 模型输出。这里我们将遵循一些其他步骤,如下所示:

  • 显示 apriori 函数生成的规则结果。

通过执行上述代码行,我们将获得 9 条规则。请看下面的输出:

输出

[RelationRecord(items=frozenset({'chicken', 'light cream'}), support=0.004533333333333334, ordered_statistics=[OrderedStatistic(items_base=frozenset({'light cream'}), items_add=frozenset({'chicken'}), confidence=0.2905982905982906, lift=4.843304843304844)]),
 RelationRecord(items=frozenset({'escalope', 'mushroom cream sauce'}), support=0.005733333333333333, ordered_statistics=[OrderedStatistic(items_base=frozenset({'mushroom cream sauce'}), items_add=frozenset({'escalope'}), confidence=0.30069930069930073, lift=3.7903273197390845)]),
 RelationRecord(items=frozenset({'escalope', 'pasta'}), support=0.005866666666666667, ordered_statistics=[OrderedStatistic(items_base=frozenset({'pasta'}), items_add=frozenset({'escalope'}), confidence=0.37288135593220345, lift=4.700185158809287)]),
 RelationRecord(items=frozenset({'fromage blanc', 'honey'}), support=0.0033333333333333335, ordered_statistics=[OrderedStatistic(items_base=frozenset({'fromage blanc'}), items_add=frozenset({'honey'}), confidence=0.2450980392156863, lift=5.178127589063795)]),
 RelationRecord(items=frozenset({'ground beef', 'herb & pepper'}), support=0.016, ordered_statistics=[OrderedStatistic(items_base=frozenset({'herb & pepper'}), items_add=frozenset({'ground beef'}), confidence=0.3234501347708895, lift=3.2915549671393096)]),
 RelationRecord(items=frozenset({'tomato sauce', 'ground beef'}), support=0.005333333333333333, ordered_statistics=[OrderedStatistic(items_base=frozenset({'tomato sauce'}), items_add=frozenset({'ground beef'}), confidence=0.37735849056603776, lift=3.840147461662528)]),
 RelationRecord(items=frozenset({'olive oil', 'light cream'}), support=0.0032, ordered_statistics=[OrderedStatistic(items_base=frozenset({'light cream'}), items_add=frozenset({'olive oil'}), confidence=0.20512820512820515, lift=3.120611639881417)]),
 RelationRecord(items=frozenset({'olive oil', 'whole wheat pasta'}), support=0.008, ordered_statistics=[OrderedStatistic(items_base=frozenset({'whole wheat pasta'}), items_add=frozenset({'olive oil'}), confidence=0.2714932126696833, lift=4.130221288078346)]),
 RelationRecord(items=frozenset({'pasta', 'shrimp'}), support=0.005066666666666666, ordered_statistics=[OrderedStatistic(items_base=frozenset({'pasta'}), items_add=frozenset({'shrimp'}), confidence=0.3220338983050848, lift=4.514493901473151)])]

正如我们所见,上面的输出格式不易理解。因此,我们将以合适的格式打印所有规则。

  • 以更清晰的方式可视化规则、支持度、置信度和提升度。

输出

通过执行上述代码行,我们将获得下面的输出:

Rule: chicken -> light cream
Support: 0.004533333333333334
Confidence: 0.2905982905982906
Lift: 4.843304843304844
=====================================
Rule: escalope -> mushroom cream sauce
Support: 0.005733333333333333
Confidence: 0.30069930069930073
Lift: 3.7903273197390845
=====================================
Rule: escalope -> pasta
Support: 0.005866666666666667
Confidence: 0.37288135593220345
Lift: 4.700185158809287
=====================================
Rule: fromage blanc -> honey
Support: 0.0033333333333333335
Confidence: 0.2450980392156863
Lift: 5.178127589063795
=====================================
Rule: ground beef -> herb & pepper
Support: 0.016
Confidence: 0.3234501347708895
Lift: 3.2915549671393096
=====================================
Rule: tomato sauce -> ground beef
Support: 0.005333333333333333
Confidence: 0.37735849056603776
Lift: 3.840147461662528
=====================================
Rule: olive oil -> light cream
Support: 0.0032
Confidence: 0.20512820512820515
Lift: 3.120611639881417
=====================================
Rule: olive oil -> whole wheat pasta
Support: 0.008
Confidence: 0.2714932126696833
Lift: 4.130221288078346
=====================================
Rule: pasta -> shrimp
Support: 0.005066666666666666
Confidence: 0.3220338983050848
Lift: 4.514493901473151
=====================================

从上面的输出,我们可以分析每条规则。第一条规则,即Light cream → chicken,表明大多数客户经常购买 Light cream 和 chicken。此规则的支持度为0.0045,置信度为29%。因此,如果客户购买 Light cream,则有 29% 的几率他也会购买 chicken,并且它在交易中出现了 0.0045 次。我们也可以在其他规则中看到这些。


下一个主题关联规则学习