关联规则挖掘中的ECLAT算法入门教程

535 阅读5分钟

关联规则挖掘中的ECLAT算法入门

数据挖掘的目标是寻找规则,根据交易中其他项目的出现情况来预测一个项目。

一般来说,为了实现这一目标,我们有两种方法。

  1. 生成频繁项目集。这里,我们生成所有支持度大于所采用的最小支持度的项目集。
  2. 规则生成。我们从频繁项目集中生成一个频繁高集。

先决条件。

要跟上这篇文章,学习者需要能熟练使用Python中的以下库。Scikit-learn, Pandas, 和Numpy。

ECLAT算法简介

正如我们之前提到的,关联规则的主要思想是要从大数据集中发现有效的信息和知识。多年来已经开发了几种算法,使这项活动尽可能地成功。使用的主要算法包括。

  1. Apriori算法
  2. Eclat算法
  3. FP增长算法

在数据挖掘领域引入的第一个算法是Apriori算法。然而,这种算法在发现频繁项集方面有一些限制。它的局限性使得人们需要一种更有效的算法。

后来,Eclat算法被引入以处理Apriori算法的弱点。在这两种算法之间,我们有很大的区别。

  • 与适用于水平数据集的Apriori算法不同,Eclat算法只适用于垂直数据集格式的数据集。
  • 在Eclat算法中,只有支持度和置信度被计算为置信度。如同Apriori的情况一样,它不被计算。在这里,支持度不过是一个项目在数据库中出现的次数。

在生成数据库的每个阶段,Eclat算法使用当前生成的数据集来学习频繁项目集,而不像Apriori那样反复扫描原始数据库。由于Eclat对数据库进行了一次扫描,所以它比Apriori算法快得多。

然而,这并不意味着Apriori算法更差。相反,当处理一个较大的数据集时,Apriori往往会表现得最好。因此,Eclat算法在处理小型和中型数据集时效果更好。

这里的关键启示是,Eclat在垂直数据格式下工作良好。由于大多数数据集都是水平格式,为了应用Eclat算法,我们首先要把它们转换为垂直格式。

下面是水平和垂直数据格式的例子。

水平数据格式。

Horizontal data

纵向数据格式。

Verticle data

我们通过制作每个特定项目的交易清单来获得垂直数据格式。

让我们看一下Eclat算法的步骤。

Eclat算法

  1. 获取数据库中每个项目的tidlist。这里,我们扫描整个数据库。项目{a}的tidlist是项目{a}所包含的交易列表。
  2. 将项目{a}的tidlist与项目{b}的tidlist相交,生成一个新的交易列表,其元素是项目{a}和{b}都在其中的交易。
  3. 对数据库中的其他项目重复步骤1,以{a}为条件。
  4. 对于所有其他项目,重复上述步骤。

如果我们在上面给出的垂直数据集上执行这些步骤,我们应该得到一个类似于下面的输出。

data image

优点

  1. 与Apriori相比,Eclat算法对内存的要求很低,因为它使用的是深度优先搜索方法。
  2. Eclat算法不需要重复扫描数据来发现频繁项集,因此,通常比Apriori算法快。
  3. 只要数据集不是太大,Eclat算法就能胜过Apriori算法。
  4. Eclat算法只扫描当前生成的数据集,在Eclat算法中被扫描。这与Apriori不同,Apriori在每个阶段都会扫描原始数据集。

缺点

如果tidlist太大,Eclat算法可能会耗尽内存。

让我们继续在python中实现这个算法。

Eclat算法的Python实现

为了获得最佳规则,我们将在实现中采用Apriori算法。为了开始,我们需要为这个环节导入必要的库。

# The first thing is to install this package
!pip install apyori

数据预处理

导入库

本节课我们将使用的库有以下几个。

import numpy as np # to deal with numeric data
import pandas as pd # to deal with dataframe

数据集的导入

data = pd.read_csv('/content/drive/MyDrive/Market_Basket_Optimisation.csv', header = None) # read dataset
transact_list = [] # create an empty list to store transactions
for i in range(0, 7501):
  transact_list.append([str(data.values[i,j]) for j in range(0, 20)]) # add the transactions to the above created

Eclat算法

由于我们采用了Apriori算法,我们需要生成如下规则。

from apyori import apriori # import the apriori library
rules = apriori(transactions = transact_list, min_support = 0.003, min_confidence = 0.2, min_lift = 3, min_length = 2, max_length = 2) # generate rules

# list of results coming from the apriori model
rslt = list(rules)

从上面的规则列表中,我们将提取所有support ,并将它们组织在一个pandas数据框中。下面的代码将使我们能够做到这一点。

在一个pandas数据框架中组织上述输出

def inspect(rslt): # function to organize the output
    left_handSide         = [tuple(result[2][0][0])[0] for result in rslt] # get the left hand side of the rules
    right_handSide         = [tuple(result[2][0][1])[0] for result in rslt] # get the right hand side of the rules
    supports    = [result[1] for result in rslt] # get the supports
    return list(zip(left_handSide,right_handSide, supports)) # zip the above three lists together
rslt_DataFrame = pd.DataFrame(inspect(rslt), columns = ['Product 1', 'Product 2', 'Support']) # create a pandas dataframe

现在我们的输出被组织在一个pandas数据框架中,我们可以看一下前七个支持,如下所示。

rslt_DataFrame.nlargest(n = 7, columns = 'Support') # printing the first 7 supports

Arranged results

在上面的输出中,规则(草药和胡椒)的支持度最高。第二条支持度最高的规则是(全麦面加橄榄油),以此类推。这个表格意味着第一条规则是最重要的。因此,对于卖家来说,为了使他们的销售和利润最大化,他们应该采用第一条规则。

总结

这篇文章介绍了关联规则挖掘,并将其分解为各种方法。

我们提到了主要用于该领域的前三种算法,以从数据中发现知识。Apriori, Eclat, 和FP增长算法。首先,我们看到了Apriori算法的局限性,随后,我们能够讨论Eclat算法如何解决这个问题。

在谈论Eclat算法的优点和缺点之前,我们还讨论了这两种算法的区别。后来,我们通过调整Apriori算法来实现Eclat算法,以提高准确性。