第四章:关联规则
本章内容包括
- 关联规则学习
- 不同类型的关联规则算法
- 不同关联规则算法的实现
- 使用 SPADE 进行序列学习
- 案例研究
“关联的力量比美的力量更强大;因此关联的力量就是美的力量– 约翰·罗斯金”
恭喜你完成了本书的第一部分!你探索了无监督学习的基础知识以及 k-means 聚类、层次聚类、DBSCAN、主成分分析等算法。预计你已经掌握了第一部分的数学概念,并创建了解决每章末尾练习的 Python 代码。
欢迎来到本书的第二部分,在这一部分中,我们将利用第一部分学到的概念,并探索稍微复杂一些的主题。我们将从本书的第四章开始学习关联规则。祝你好运!
下次你去附近的杂货店时,看看店内各种物品的摆放。你会发现架子上摆放着牛奶、鸡蛋、面包、糖、洗衣粉、肥皂、水果、蔬菜、饼干和其他各种物品。你有没有想过这种摆放的逻辑是什么,以及这些物品是如何摆放的?为什么某些产品放在一起,而另一些则相距很远?显然,这种摆放不可能是随意的,背后必须有科学的原理。或者你是否想知道,Netflix 是如何根据你的观影历史为你推荐电影的?我们将在本章中找到这些问题的答案。和往常一样,我们将先学习概念。我们将通过数学逻辑来讨论不同算法的优缺点,并使用 Python 进行实际实现。本章末尾提供了一个商业案例研究来补充知识。
欢迎来到第四章,祝一切顺利!
4.1 技术工具包
我们将继续使用迄今为止使用的相同版本的 Python 和 Jupyter 笔记本。本章使用的代码和数据集已经存储在此位置。
本章需要安装几个 Python 库 – apyori、pyECLAT、fpgrowth_py 和 pyspade。除此之外,我们还需要 numpy 和 pandas。使用库,我们可以很快地实现这些算法。否则,编写这些算法将是一项耗时且痛苦的任务。
让我们开始关联规则的学习。
4.2 关联规则学习
你可能听说过著名的“啤酒和尿布故事”。根据这个轶事,超市的顾客(主要是年轻男子)购买尿布的同时也购买啤酒在同一张发票上。换句话说,购买尿布给他们的宝宝的年轻男子在同一笔交易中购买啤酒的概率相当高。我们不评论这个故事的真实性,但是可以归因于此故事的逻辑是关联规则学习。
正式来说 - 关联规则可以用来发现数据集中存在的变量之间的有力关系。我们可以使用关联规则来测量数据集中变量之间的相关性和共同出现。在上述示例中(假设故事是真实的),人们可以分析每日的顾客交易。如果啤酒和尿布之间存在关系,这对超市来说是非常强大的洞察力,可以让他们定制啤酒和尿布的摆放位置,或者调整营销策略,甚至改变价格。
我们可以通过超市中的另一个例子来理解。考虑下面的例子。假设通过分析在超市生成的五张发票,我们得到了如下表 4.1 所示的数据。在这个例子中,发票编号 1001 购买了牛奶,因此它的值为 1,而奶酪没有购买,因此它是 0。
表 4.1 超市生成的发票示例。第一个发票编号是 1001,在该发票中购买了牛奶。因此,在牛奶前面有 1。而奶酪在 1001 中没有购买,因此,在奶酪前面有 0。
发票编号 | 牛奶 | 鸡蛋 | 面包 | 奶酪 |
1001 | 1 | 1 | 1 | 0 |
1002 | 0 | 0 | 0 | 1 |
1003 | 1 | 1 | 1 | 0 |
1004 | 0 | 1 | 0 | 1 |
1005 | 1 | 1 | 0 | 1 |
因此,在发票编号 1001 中,购买了牛奶、鸡蛋和面包,而在发票编号 1002 中只购买了奶酪。在这里,我们可以看到每当牛奶和鸡蛋一起购买时,面包总是在同一张发票中购买。这确实是一个重要的发现。
现在将这种理解扩展到一天内数千笔交易。这将导致非常强大的关系,人眼通常忽视,但关联规则算法可以为我们揭示它们。它可以导致更好的产品摆放、产品更好的价格和更优化的营销支出。这些模式将提升客户体验,并且被证明对于改善整体客户满意度非常有用。
我们可以将关联规则可视化,如图 4.1 所示。在这里,有一些表示为节点 1、2、3、4 等的传入变量。这些节点之间存在关联,如箭头所示。它们之间的这种关系导致了规则 A 和 B 的产生。如果我们回顾一下本节开头提到的啤酒/尿布故事,规则 A 可能是,当年轻男性顾客购买尿布时,他们也经常购买啤酒;而规则 B 可能是,当购买牛奶和鸡蛋时,经常也会购买面包。
图 4.1 关联规则可以被视为数据集中各种变量之间的关系。这些变量之间相互关联,并建立了重要的关系。
上面讨论的超市示例有时被称为市场篮子分析。但是关联规则不仅适用于杂货零售。它们在生物信息学、医疗行业、入侵检测等其他领域的效用已被证明。Netflix 或 Spotify 可以利用它们分析历史用户行为,然后推荐用户最有可能喜欢的内容。Web 开发人员可以分析客户在其网站上的历史点击和使用情况。通过识别模式,他们可以找出用户倾向于点击的内容和哪些功能将最大化他们的参与度。医生可以使用关联规则更好地诊断患者。医生可以比较症状与其他症状之间的关系的概率,并提供更准确的诊断。用例跨越多个业务领域和业务功能。
我们现在将了解关联规则的构建模块。
4.3 关联规则的构建模块
我们在上一节中介绍了关联规则的定义。
现在让我们了解关联规则背后的数学概念。假设我们在零售店有以下数据集-
- 让 X = {x[, x[2], x[3], x[4], x[5] …., x[n]} 代表零售店中可用的n种商品。例如,它们可以是牛奶、鸡蛋、面包、奶酪、苹果等等。
- 让 Y = {y[, y[2], y[3], y[4], y[5] …., y[m]} 代表在该零售店生成的m笔交易。每笔交易可能包含来自零售店的全部或部分商品。
显然,交易中的每个商品都只能从零售店购买。换句话说,在集合 Y 中的交易中的每个商品都是集合 X 中商品的子集。同时,每个商品都会附带一个唯一的标识符,每个交易都会附带一个唯一的发票号码。
现在,我们有兴趣分析模式并发现关系。这将用于生成任何规则或见解。因此,让我们首先定义规则的含义。
- 假设我们发现一条规则,即每当购买列表 P 中的商品时,列表 Q 中的商品也会被购买。这条规则可以写成如下形式:
- 规则是P -> Q。这意味着当购买了 P 中定义的物品时,也会购买 Q。
- P 中的物品将是 X 的子集或P Í X。
- 同样,Q 中的物品将是 X 的子集或Q Í X。
- P 和 Q 不能有任何共同的元素,即P Ç Q = 0
现在,让我们通过一个实际案例来理解这些数学概念。
假设 X = {牛奶,香蕉,鸡蛋,奶酪,苹果,面包,盐,糖,饼干,黄油,冷饮料,水}。这是零售店中所有可用的物品。
Y = {1001, 1002, 1003, 1004, 1005}。这是在该零售店生成的五张发票。每张发票中购买的相应物品如表 4.2 所示。
表 4.2 零售店生成的五张发票示例。请注意,对于每张发票,我们对每个物品都有 0 和 1 相关联。这些发票仅用于说明目的。实际发票中物品的数量可以更多。
使用这个数据集,让我们假设我们创建了两个规则:{牛奶,香蕉} -> {鸡蛋}和{牛奶,香蕉} -> {面包}。
第一个规则意味着每当购买牛奶和香蕉,鸡蛋也会在同一次交易中购买。第二个规则意味着每当购买牛奶和香蕉,面包也会在同一次交易中购买。通过分析上述数据集,我们可以清楚地看到规则 1 始终为真,而规则 2 不是。
左边的物品称为前项或 LHS,右边的物品称为后项或 RHS。
在现实世界中,对于任何这样的规则来说,同样的模式必须在数百甚至数千个交易中重复出现。只有在这种情况下,我们才会得出这个规则确实是真实存在的,并且可以推广到整个数据库。
与此同时,可能会有很多这样的规则。在一个每天生成数千份发票的零售店中,可能会有数百个这样的规则。我们如何发现哪些规则是重要的,哪些是不重要的呢?这可以通过我们将在下一节学习的支持度、置信度和提升度的概念来理解。
4.3.1 支持度、置信度、提升度和确信度
在上一节中,我们确定了关联规则中规则的含义。我们也理解,基于事务数据集,可能会有数百条规则。在本节中,我们将探讨如何测量这些规则的有效性,并筛选出最有趣的规则。这可以通过支持度、置信度、提升度和确信度的概念来实现。
回顾上一节我们讨论了规则的泛化。支持度、置信度、提升度和确信度可以帮助我们衡量泛化程度。简而言之,使用这四个参数,我们可以确定规则在我们实际的商业中有多么有用。毕竟,如果一个规则不实用或者不够强大,就没有必要实施。支持度、置信度、提升度和确信度是检查规则效力的参数。我们现在将详细介绍这些概念。
我们将使用表 4.3 中的以下数据集来理解支持度、置信度和提升度的概念。
表 4.3 我们将用来理解支持度、置信度和提升度概念的数据集。第一张发票 1001 包含牛奶、鸡蛋和面包,而奶酪没有购买。同样,为了这个例子,我们总共只考虑了 4 个项目。
发票号码 | 牛奶 | 鸡蛋 | 面包 | 奶酪 |
1001 | 1 | 1 | 1 | 0 |
1002 | 0 | 1 | 1 | 1 |
1003 | 1 | 1 | 1 | 0 |
1004 | 0 | 1 | 0 | 1 |
1005 | 0 | 1 | 1 | 0 |
在这里,对于一个发票,1 表示该发票中是否有购买该商品,而 0 则表示该发票中没有购买该商品。例如,发票编号 1001 包含牛奶、鸡蛋和面包,而 1002 包含鸡蛋、面包和奶酪。
现在让我们研究支持度。
支持
支持度测量数据集中项目的频率百分比。换句话说,它测量了项目在数据集中出现的交易百分比。
支持度可以表示如下
参考表 4.3,如果我们对规则 {牛奶, 鸡蛋} -> {面包} 感兴趣。在这种情况下,有两笔交易中同时包含这三种项目(牛奶、鸡蛋和面包)。总交易数为五笔。因此,该规则的支持度为 2 / 5,即 0.4 或 40%。
如果我们对规则 {面包, 鸡蛋} -> {奶酪} 感兴趣。在这种情况下,只有一笔交易中同时包含这三种商品。总交易数为五笔。因此,该规则的支持度为 1 / 5,即 0.2 或 20%。
支持度越高,规则越好。通常,我们设定一个最低阈值来获取支持度。最低阈值通常是与业务利益相关者协商确定的。
现在我们将研究规则的置信度。
置信度
置信度测量规则的真实频率。换句话说,它测量了包含前提的交易中也包含结果的百分比。
因此,如果我们想要测量规则 A->B 的置信度
这里,分子在交易中同时存在 A 和 B 时为支持度,而分母则指的是仅 A 的支持度。
表 4.3 我们将用于理解支持度、确信度和提升度概念的数据集。第一张发票 1001 有牛奶、鸡蛋和面包,而奶酪没有购买。同样,为了本例,我们只考虑了总共 4 个物品。
发票号码 | 牛奶 | 鸡蛋 | 面包 | 奶酪 |
1001 | 1 | 1 | 1 | 0 |
1002 | 0 | 1 | 1 | 1 |
1003 | 1 | 1 | 1 | 0 |
1004 | 0 | 1 | 0 | 1 |
1005 | 0 | 1 | 1 | 0 |
参考表 4.3,如果我们对规则 {牛奶,鸡蛋} -> {面包}感兴趣。在这种情况下,有两个交易中同时存在牛奶和鸡蛋。因此,支持度为 2/5 = 0.4。这是分母。有两个交易中同时存在三个物品(牛奶,鸡蛋,面包)。因此,支持度为 2/5 = 0.4,这是分子。放入上面的方程,规则 {牛奶,鸡蛋} -> {面包}的确信度为 0.4/0.4 = 1。
如果我们对规则 {鸡蛋,面包} -> {奶酪}感兴趣。在这种情况下,有三个交易中存在 (鸡蛋,面包)。总交易数为五。所以,这意味着支持度为 3/5,即 0.6。只有一个交易中同时存在三个物品(鸡蛋,面包,奶酪)。所以,支持度为 1/5 = 0.2。因此,规则 {鸡蛋,面包} -> {奶酪}的确信度为 0.2/0.6 = 0.33。
对于规则的信心越高,它就越好。像支持一样,我们对确信度设置了最低阈值。
有时,它也被称为 A 在 B 上的条件概率。它可以理解为在 A 已经发生的情况下 B 发生的概率,并且可以写成 P(A|B)。因此,在上面引用的例子中,提前购买了鸡蛋、面包的情况下购买奶酪的概率为 33%,而购买了牛奶、鸡蛋的情况下购买面包的概率为 100%。
到目前为止,我们已经涵盖了信心和支持。现在我们将研究提升度和确信度,这是评估规则的真正标准。
提升度和确信度
提升度是一种非常重要的规则测量标准。规则 A-> B 的提升度可以定义为
在这里,分子在交易中同时存在 A 和 B 时得到支持,而分母则是指 A 的支持乘以 B 的支持。
表 4.3 我们将用于理解支持度、确信度和提升度概念的数据集。第一张发票 1001 有牛奶、鸡蛋和面包,而奶酪没有购买。同样,为了本例,我们只考虑了总共 4 个物品。
发票号码 | 牛奶 | 鸡蛋 | 面包 | 奶酪 |
1001 | 1 | 1 | 1 | 0 |
1002 | 0 | 1 | 1 | 1 |
1003 | 1 | 1 | 1 | 0 |
1004 | 0 | 1 | 0 | 1 |
1005 | 0 | 1 | 1 | 0 |
参考表 4.3,如果我们对规则{牛奶,鸡蛋} -> {面包}感兴趣。在这种情况下,有两个交易中都存在所有三个(牛奶,鸡蛋,面包)。因此,支持度再次为 2/5 = 0.4,这是分子。有两个交易中只有(牛奶,鸡蛋)存在,所以支持度为 2/5 = 0.4。有四个交易中存在面包,因此支持度为 4/5 = 0.8。将其代入上述方程中,规则{牛奶,鸡蛋} -> {面包}的提升度为 0.4/(0.4x0.8) = 1.25。
如果我们对规则{鸡蛋,面包} -> {奶酪}感兴趣。在这种情况下,只有一个交易中存在(鸡蛋,面包,奶酪)。总交易数为五。因此,支持度为 1 / 5,即 0.2。有两个交易中存在(奶酪)。因此,支持度为 2/5 = 0.4。有四个交易中存在(鸡蛋,面包),因此支持度为 4/5 = 0.8。将其代入上述方程中,规则{鸡蛋,面包} -> {奶酪}的提升度为 0.2/(0.4x0.8) = 0.625。
如果提升度的值等于 1,则意味着前项和后项彼此独立,不能从中得出任何规则。
如果提升度的值大于 1,则意味着前项和后项是相互依赖的。此规则可用于预测未来交易中的前项。这是我们想要从数据集中得出的见解。
提升度的值小于 1,意味着前项和后项是彼此替代的。其中一个的存在可能对另一个产生负面影响。这也是业务团队进行战略规划的重要洞察。
在评估任何规则时,使用提升度时,必须将领域知识应用于其中。例如,如果我们评估规则{鸡蛋,面包} -> {奶酪},它表明鸡蛋、面包可以替代奶酪。我们知道这在现实生活中是不正确的。因此,在这种情况下,我们不能对此规则做出任何决定。我们必须借助领域知识来对该规则进行任何结论。
同时,规则{牛奶,鸡蛋} -> {面包}可能是一个可以多次成立的规则。对于许多客户,当他们一起购买牛奶和鸡蛋时,面包很可能也会在同一交易中购买。因此,对于这样的客户来说,这个规则更有意义。目标是有一个强有力的业务逻辑来支持或否定使用算法识别的规则。
信心是一个重要的参数,其公式如下
例如,如果我们对规则 {鸡蛋,面包} -> {奶酪} 感兴趣。在这种情况下,只有一个交易中存在 (奶酪)。总交易数为五。所以,支持度是 1/5,即 0.2,并将用于分子。我们已经计算出置信度为 0.625。放回公式中,我们可以计算说服力为 (1-0.2)/(1-0.625) = 2.13
我们可以将说服力解释为 - 规则 {鸡蛋,面包} -> {奶酪} 如果 {鸡蛋,面包,奶酪} 之间的关联纯粹是随机选择的,那么它的错误率将是 2.13 倍。
在大多数业务场景中,提升度是使用的测量标准。还有其他测量参数,如杠杆、集体强度等。但是大多数情况下,置信度、支持度和提升度被用来衡量任何规则的有效性。
小测验 - 回答这些问题来检查你的理解… 答案在书的末尾
- 支持度测量规则在数据集中出现的频率。是或否。
- 如果提升度大于 1,则表示两个项目彼此独立。是或否。
- 降低置信度值,规则就越好。是或否。
在分析数据集时,我们评估任何规则时,大多数情况下都会为置信度、支持度和提升度设置阈值。这使我们能够减少规则数量并过滤掉不相关的规则。换句话说,我们只关注那些非常频繁的规则。当我们为数据集创建 Python 解决方案时,我们将更详细地研究它。
现在我们将研究关联规则中使用的各种算法。第一个这样的算法是 Apriori 算法,这是下一个主题。
4.4 Apriori 算法
Apriori 算法是用于关联规则的最流行算法之一。它由 Agrawal 和 Shrikant 在 1994 年提出。本章末尾给出了论文链接。
Apriori 用于理解和分析交易数据库中的频繁项。它利用“自下而上”的方法,首先根据子集的频率生成候选项。让我们通过一个示例来理解整个过程。
我们将使用我们之前讨论过的相同数据集。
表 4.3 我们将用来理解支持度、置信度和提升度概念的数据集。第一个发票 1001 有牛奶、鸡蛋和面包,而奶酪没有购买。
发票编号 | 牛奶 | 鸡蛋 | 面包 | 奶酪 |
1001 | 1 | 1 | 1 | 0 |
1002 | 0 | 1 | 1 | 1 |
1003 | 1 | 1 | 1 | 0 |
1004 | 0 | 1 | 0 | 1 |
1005 | 0 | 1 | 1 | 0 |
Apriori 算法中使用的过程看起来像图 4.2 中下面的过程。
图 4.2 Apriori 算法过程可以如下所示。
假设我们想要分析面包与数据集中所有其他项目的关系。在这种情况下,级别 1 是面包,我们找到其出现的频率。
然后我们转移到下一层,即第 2 层。现在我们找到面包与其他每个物品 - 牛奶、鸡蛋和奶酪(在第 2 层)的关系。在这里,我们再次找到所有可能组合的出现频率,即 {面包,牛奶},{面包,鸡蛋} 和 {面包,奶酪}。可以在图 4.3 中显示。
图 4.3 我们在 1 级有面包,而其他物品(牛奶、鸡蛋和奶酪)都放在 2 级。面包放在 1 级,因为我们希望分析面包与所有其他物品的关系。
分析完第 2 层后,我们转移到第三层、第四层等。这个过程会一直持续,直到我们达到最后一层,其中所有的物品都被用完。
通过这个过程,我们可以计算所有可能组合的支持度。例如,我们可以得到
{面包} -> {牛奶},
{面包} -> {鸡蛋} 和
{面包} -> {奶酪}。
对于下一层,我们还会得到支持
{面包,牛奶} -> {鸡蛋},
{面包,鸡蛋} -> {牛奶},
{面包,牛奶} -> {奶酪},
{面包,奶酪} -> {牛奶},
{面包,奶酪} -> {鸡蛋} 和
{面包,鸡蛋} -> {奶酪}。
现在,使用同样的过程,计算下一层的所有可能组合。例如,{面包,鸡蛋,牛奶} -> {奶酪},{面包,鸡蛋,奶酪} -> {牛奶} 等。
当所有的项集都用完时,这个过程将停止。完整的架构可以看起来像图 4.4。
图 4.4 Apriori 算法的完整架构。在这里,我们将计算所有可能组合的支持度。探索所有项目之间的关系,由于整个数据库的扫描,Apriori 的速度受到影响。
现在,我们可以轻松理解可能的组合数量相当高,这是 Apriori 的挑战之一。Apriori 算法还有一些其他缺点,我们将在后面学习。但现在是用 Python 实现 Apriori 的时候了。
4.4.1 Python 实现
现在我们将继续使用 Python 实现 Apriori 算法。数据集和 Python Jupyter 笔记本已经上传到 GitHub 代码库。
你可能需要安装 apyori。
安装这些库很简单,只需按照以下步骤进行。
import sys !{sys.executable} -m pip install apyori
步骤 1: 导入用例所需的库。我们导入了 numpy、pandas。为了实现 Apriori,我们还有一个叫做 apyori 的库也被导入了。
import numpy as np import pandas as pd from apyori import apriori
步骤 2: 现在,我们导入数据集 store_data.csv 文件。
store_dataset = pd.read_csv('store_data.csv')
你还建议查看打开 .csv 文件的数据集。它会像下面的截图一样。截图显示了前 25 行。每一行代表一个发票。
步骤 3: 让我们通过 .info
,.head
命令对数据进行一些基本检查。
store_dataset.info()
store_dataset.head()
第 4 步: 在这里我们可以看到,代码已将第一个交易作为标题考虑。因此,我们将重新导入数据,但这次他会指定标题等于 None。
store_dataset = pd.read_csv('store_data.csv', header=None)
第 5 步: 让我们再次看一下头部。这次看起来是正确的。
store_dataset.head()
第 6 步: 我们用于代码的库接受数据集作为列表的列表。整个数据集必须是一个大列表,而每个交易是大列表中的内部列表。因此,为了实现它,我们首先将我们的 store_dataset 数据框转换为列表。
all_records = [] for i in range(0, 7501): all_records.append([str(store_dataset.values[i,j]) for j in range(0, 20)])
第 7 步: 接下来,我们实施 Apriori 算法。
对于算法,我们正在处理我们在第 6 步创建的 all_records
列表。指定的最小支持度为 0.5 或 50%,最小置信度为 25%,最小提升为 4,规则的最小长度为 2。
此步骤的输出是 apriori_rules
类对象。然后将此对象转换为我们可以理解的列表。最后,我们打印此列表。
apriori_rules = apriori(all_records, min_support=0.5, min_confidence=0.25, min_lift=4, min_length=2) apriori_rules = list(apriori_rules) print(len(apriori_rules))
代码的输出将为 0。这意味着不存在满足我们设置的规则条件的规则。
我们再次尝试执行相同的代码,尽管将最小支持度减少到 25%。
apriori_rules = apriori(all_records, min_support=0.25, min_confidence=0.25, min_lift=4, min_length=2) apriori_rules = list(apriori_rules) print(len(apriori_rules))
再次,没有生成任何规则,输出为零。即使将最小支持度降低到 10%,也不会产生任何规则。
apriori_rules = apriori(all_records, min_support=0.1, min_confidence=0.25, min_lift=4, min_length=2) apriori_rules = list(apriori_rules) print(len(apriori_rules))
现在,我们将最小提升减少到 2。这次我们得到的输出是 200。这意味着有 200 个满足条件的规则。
apriori_rules = apriori(all_records, min_support=0.25, min_confidence=0.25, min_lift=2, min_length=2) apriori_rules = list(apriori_rules) print(len(apriori_rules))
第 8 步: 让我们看一下第一条规则。
print(apriori_rules[0])
规则解释了杏仁和汉堡之间的关系。支持率为 0.005,置信度为 0.25。提升为 2.92 表明此规则本身相当强大。
第 9 步: 我们现在将详细查看所有规则。为此,循环遍历规则并从每次迭代中提取信息。每个规则都有构成规则的项目以及支持、置信度和提升的相应值。我们在第 8 步中展示了一个示例。现在在第 9 步中,我们只是使用 for 循环从所有规则中提取该信息。
for rule in apriori_rules: item_pair = rule[0] items = [x for x in item_pair] print("The apriori rule is: " + items[0] + " -> " + items[1]) print("The support for the rule is: " + str(rule[1])) print("The confidence for the rule is: " + str(rule[2][0][2])) print("The lift for the rule is: " + str(rule[2][0][3])) print("************************")
此步骤的输出如下所示。在这里,我们可以观察到每个规则及其支持、置信度和提升的相应值。
我们可以轻松解释这些规则。例如,规则杏仁->汉堡包的提升为 2.92,置信度为 25.49%,支持率为 0.51%。这完成了我们使用 Python 的实现。此示例可以扩展到任何其他真实业务数据集。
并非所有生成的规则都适合使用。在本章的最后一节中,我们将探讨如何从生成的所有规则中获取最佳规则。
Apriori 算法是一种稳健且非常有见地的算法。但像任何其他解决方案一样,它也有一些缺点,我们现在正在讨论。
4.4.2 Apriori 算法的挑战
我们在前面的部分已经讨论过 Apriori 算法生成的子集数量相当大。
图 4.5 数据集的完全扫描被多次进行,因此速度显著下降。
生成候选项集非常繁琐,因此分析数据集变得相当繁重。Apriori 多次扫描整个数据集,因此需要将数据库加载到内存中。我们可以肯定地得出结论,它需要大量时间才能进行计算。当处理非常大的数据集时,这个问题就会被放大。事实上,在现实世界的问题中,会产生数百万次交易,会产生相当多的候选项集,因此在整个数据集上使用 Apriori 是非常耗时的。
因此,一般情况下,会设定一个最小支持值来减少可能的规则数量。在上面给出的例子中,我们可以根据表 4.4 中所示计算级别 1 组合的支持,如果我们将最小支持值设为 0.5,只有一个规则会被列入候选名单。
表 4.4 对每种商品的组合都进行了支持计算。例如,对于牛奶和面包-交易次数为 2,而总交易次数为 5。所以,支持率为 2/5,即 0.4。
组合 | 交易次数 | 总交易次数 | 支持率 |
牛奶,鸡蛋 | 2 | 5 | 0.4 |
牛奶,面包 | 2 | 5 | 0.4 |
牛奶,奶酪 | 0 | 5 | 0 |
鸡蛋,面包 | 4 | 5 | 0.8 |
鸡蛋,奶酪 | 2 | 5 | 0.4 |
面包,奶酪 | 1 | 5 | 0.2 |
设定一个最小支持值是一个明智的策略,可以使规则更易管理。这样可以减少时间,生成更有意义的规则。毕竟,从分析生成的规则应该足够通用,以至于可以应用于整个数据库。
快速测验 - 回答这些问题来检查你的理解。书末有答案。
- Apriori 算法只扫描数据库一次。是真还是假?
- 如果香蕉在 12 次交易中出现了 5 次,那么香蕉的支持率就是 5/12。正确还是错误?
但 Apriori 算法是一种开创性的解决方案。它仍然非常受欢迎,通常是讨论关联规则时的第一个算法。
数据准备是关键步骤之一,也是一个挑战,我们将在本章最后的案例研究中探讨这一挑战。
我们接下来会学习下一个算法,也就是 ECLAT 算法。
无监督学习与生成式人工智能(MEAP)(二)(2)https://developer.aliyun.com/article/1522538