R中的关联规则 - 删除冗余规则(arules)

时间:2016-08-05 19:08:42

标签: r arules

假设我们有3条规则:

[1] {A,B,D} -> {C}

[2] {A,B} -> {C}

[3] Whatever it is

规则[2]是规则[1]的子集(因为规则[1]包含规则[2]中的所有项目),因此应删除规则[1] (因为规则[1]过于具体,其信息包含在规则[2]

我在互联网上搜索,每个人都在使用这些代码来删除多余的规则:

subset.matrix <- is.subset(rules.sorted, rules.sorted)
subset.matrix[lower.tri(subset.matrix, diag=T)] <- NA
redundant <- colSums(subset.matrix, na.rm=T) >= 1
which(redundant)
rules.pruned <- rules.sorted[!redundant]

我不明白代码是如何工作的。

在代码的第2行之后,subset.matrix将变为:

      [,1] [,2] [,3]
[1,]   NA    1    0
[2,]   NA   NA    0
[3,]   NA   NA   NA

下三角形中的单元格设置为NA,因为规则[2]是规则[1]的子集,所以相应的单元格设置为1.所以我有两个问题:

  1. 为什么我们必须将下三角设为NA?如果我们这样做,那么我们如何检查规则[2]是否是规则[3]的子集? (单元格已设置为NA)

  2. 在我们的案例中,规则[1]应该是要删除的规则,但这些代码会删除规则[2]而不是规则[1]。 (因为第2列中的第一个单元格是1,并且根据代码的第3行,第2列的列总和&gt; = 1,因此将被视为冗余)

  3. 任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:9)

要使代码生效,您需要一个兴趣度量(置信度或提升量),rules.sorted需要按置信度或提升量进行排序。无论如何,代码非常低效,因为is.subset()创建了一个大小为n ^ 2的矩阵,其中n是规则的数量。此外,规则is.subset合并规则的rhs和lhs,这是不正确的。所以不要过多担心实现细节。

更有效的方法现在在包arules中实现为函数is.redundant()(在版本1.4-2中可用)。 该解释来自手册页:

  

如果更一般的规则具有相同或更高的规则,则规则是多余的   信心存在。也就是说,如果是更具体的规则则是多余的   与一般规则相比,只有同等甚至更低的预测性。一条规则   如果它具有相同的RHS但删除了一个或多个项目,则更为通用   来自LHS。形式上,规则X - >如果

,则Y是多余的      

对于某些X'子集X,conf(X' - > Y)&gt; = conf(X - > Y)。

     

这相当于由...定义的负或零改进   Bayardo等。 (2000年)。在此实施中的其他措施   信心,例如提升也可以使用。

查看? is.redundant中的示例。

答案 1 :(得分:2)

使用arules包删除冗余规则...

运行apriori算法:

rules <- apriori(transDat, parameter = list(supp = 0.01, conf = 0.5, target = "rules", maxlen = 3))

删除多余:

rules <- rules[!is.redundant(rules)]

检查:

arules::inspect(rules)

创建数据框:

df = data.frame(
lhs = labels(lhs(rules)),
rhs = labels(rhs(rules)), 
rules@quality)

答案 2 :(得分:0)

只需查看rstudio中is.redundant()的帮助,即可清楚地表明

假设有一个

规则1 X-> Y,置信度为cf1

rule2 X'-> Y,置信度为cf2,其中X'是X的子集

如果rule2具有比rule1高的置信度,即cf2> cf1(其中X'是X的子集),则说规则1是多余的

即,如果存在一个规则,其中lhs的子集可以更有把握地给出rhs,则先前的规则被称为冗余规则。

  1. 我们将下三角形设为na,以便规则不会成为其子集

  2. 信息不足,仅基于子集就不能说规则是冗余的,必须考虑置信度