R - 先验算法的 For 循环

R - For loop for apriori Algorithm

今天一道关于数据挖掘先验算法的for循环的问题。 我正在分析先验算法的结果,但正如您所知,算法的两个主要参数(置信度和支持度)是在不知道结果的情况下设置的。这意味着有时您必须尝试不同的参数组合才能获得满意的结果。我决定尝试在 R 中设置一个 for 循环,我打算达到这种类型的结果:

vector  s  c
x1      y1 z1
x2      y1 z2
x3      y1 z3
x4      y2 z1
x5      y2 z2
x6      y2 z3
...
xn      yn zn

用x的向量作为创建的规则数,向量s带有支持参数(0<=s<=1),c是置信度参数(0<=s<=1)。 这意味着对于我想要的每个值我想要的每个级别的支持我想要的信心,我将创建规则的数量,所有这些都存储在一个三列的漂亮数据框中。

显然我自己开始寻找解决方案。我认为这两个参数应该是一对序列,所以不知道用两个序列做一个 for 循环,并使用我的一个老问题:

我试着用一个 "moving" 参数做一个简单的 for 循环,第二个参数是固定的。 首先我创建了一些假数据,因为非常小所以很有用。

# here the data
id <- c("1","1","1","2","2","2","3","3","3")
obj <- c("a", "b", "j", "a", "g","c", "a","k","c")
df <- data.frame(id,obj)

然后,进行转换,使数据易于被 arules 包的先验函数消化:

# here the rewritten data
library(arules)
transactions <- as(split(df$obj, df$id), "transactions")
inspect(transactions)

最后,只有一个移动参数的函数,支持:

  test <- function(x, y1, y2, y3, z){

# the sequence for the support
  s <- seq(y1, y2, by = y3)

# empty vector
  my_vector <- vector("numeric")

# for loop with moving support (in the seq) and fixed confidence
  for(i in seq_along(s)){my_vector <- nrow( data.frame(

# this is a small trick to have the row of the rules, do not know if it is perfect
  labels(lhs(apriori(x,parameter=list(supp = s[i], conf = z))))))} 
my_vector

# put the result in a data frame
data <- data.frame (vector = as.numeric(my_vector),s = as.numeric(s))
return(data)
}

这是第一个有结果的申请:

# the function applied
test(transactions, 0.01, 0.1, 0.01, 0.1)

# the result: the apriori function generates also its output, avoided here
   vector    s
1      31 0.01
2      31 0.02
3      31 0.03
4      31 0.04
5      31 0.05
6      31 0.06
7      31 0.07
8      31 0.08
9      31 0.09
10     31 0.10

如果你提交这个

apriori(transactions,parameter=list(supp = 0.01, conf = 0.1))
apriori(transactions,parameter=list(supp = 0.1, conf = 0.1))

结果是连贯的。

现在是困难的部分(对我来说)。 我还希望置信度参数有所不同。我研究了一下这个:

Including multiple conditions in for-loop

但是我有一个很大的局限性,我无法想象我该如何应用它。我可以改变第一个参数,并为每个值尝试使 "moving" 第二个。在这种情况下,如果支持度在 0.1 和 0.01 之间变化 0.01,那么置信度,结果应该是一个包含 100 行的向量。

另外,我有一些技术问题,我没有能力做提到的事情。 我知道这个程序对机器来说可能有点苛刻,但我想有一个可以使用的程序。

我想得到帮助, 提前感谢您的宝贵时间。

dplyr.
首先,创建一个参数网格。
然后为每个参数组合构建模型,并将其存储在列表列中(对进一步计算有用)。
然后在每个模型上使用 length() 函数,这似乎完全符合您对 "small trick":

的要求
grid <- expand.grid(support = seq(0.01, 0.1, 0.01),
                    confidence = seq(0.01, 0.1, 0.01))
library(dplyr)
res <- 
  grid %>% 
  group_by(support, confidence) %>% 
  do(model = apriori(
    transactions,
    parameter = list(support = .$support, confidence = .$confidence)
  )) %>% 
  mutate(n_rules = length(model)) %>%
  ungroup()

# # A tibble: 100 × 4
#    support confidence       model n_rules
#      <dbl>      <dbl>      <list>   <int>
# 1     0.01       0.01 <S4: rules>      31
# 2     0.01       0.02 <S4: rules>      31
# 3     0.01       0.03 <S4: rules>      31
# 4     0.01       0.04 <S4: rules>      31
# 5     0.01       0.05 <S4: rules>      31
# 6     0.01       0.06 <S4: rules>      31
# 7     0.01       0.07 <S4: rules>      31
# 8     0.01       0.08 <S4: rules>      31
# 9     0.01       0.09 <S4: rules>      31
# 10    0.01       0.10 <S4: rules>      31
# # ... with 90 more rows

您可能想重复使用每个模型。由于它们都存储在您生成的数据框中,因此应该更方便。
要检查单个模型,您可以这样做:

summary(res$model[res$confidence == 0.03 & res$support == 0.04][[1]])

# set of 31 rules
# 
# rule length distribution (lhs + rhs):sizes
#  1  2  3 
#  6 16  9 
# 
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   1.000   2.000   2.000   2.097   3.000   3.000 
# 
# summary of quality measures:
#     support         confidence          lift      
#  Min.   :0.3333   Min.   :0.3333   Min.   :1.000  
#  1st Qu.:0.3333   1st Qu.:0.4167   1st Qu.:1.000  
#  Median :0.3333   Median :1.0000   Median :1.000  
#  Mean   :0.3871   Mean   :0.7419   Mean   :1.387  
#  3rd Qu.:0.3333   3rd Qu.:1.0000   3rd Qu.:1.500  
#  Max.   :1.0000   Max.   :1.0000   Max.   :3.000  
# 
# mining info:
#          data ntransactions support confidence
#  transactions             3    0.04       0.03