【问题标题】:R arulesSequences - which frequent sequences are present in a transaction?R arulesSequences - 事务中存在哪些频繁序列?
【发布时间】:2017-08-15 14:56:20
【问题描述】:

在进行频繁序列挖掘时,通常需要执行以下任务:
1。查找顺序模式(频繁序列)。
2。找出哪些顺序模式适用于事务。即:给定一个事务,找到的所有频繁序列中存在哪一个?

我在做后者时遇到了麻烦。

使用 R,我将 arulesSequences 包中的 cspade 算法应用于以下玩具数据集:

data <- data.frame(id = 1:10,
                   transaction = c("A B B A",
                                   "A B C B D C B B B F A",
                                   "A A B",
                                   "B A B A",
                                   "A B B B B",
                                   "A A A B",
                                   "A B B A B B",
                                   "E F F A C B D A B C D E",
                                   "A B B A B",
                                   "A B"))

然后我使用包 stringr 中的str_split 函数拆分数据:

data_for_fseq_mining <- str_split(string = data$transaction, pattern = " ")

使用标识符来唯一命名“data_for_fseq_mining”中的列表元素。这是使用如下所示的函数“as.transactions”的先决条件。

names(data_for_fseq_mining) <- data$id

为了将此类数据转换为“事务”类的数据集,我使用来自https://github.com/cran/clickstream/blob/master/R/Clickstream.r 的以下函数as.transactions

data_for_fseq_mining_trans <- as.transactions(clickstreamList = data_for_fseq_mining)

现在数据格式正确,我用一些参数运行 cspade 算法:

sequences <- cspade(data      = data_for_fseq_mining_trans, 
                    parameter = list(support = 0.3, maxsize = 10, maxlen = 10, mingap = 1, maxgap = 10),
                    control   = list(tidList = TRUE, verbose = TRUE))

总结结果(序列和相对支持):

sequences_df <- cbind(sequence = labels(sequences), support = sequences@quality)

              sequence support
1                  <{A}>     1.0
2                  <{B}>     1.0
3              <{A},{B}>     1.0
4              <{B},{B}>     0.7
5          <{A},{B},{B}>     0.6
6          <{B},{B},{B}>     0.4
7      <{A},{B},{B},{B}>     0.4
8      <{B},{B},{B},{B}>     0.3
9  <{A},{B},{B},{B},{B}>     0.3
10         <{A},{A},{B}>     0.5
11         <{B},{A},{B}>     0.4
12     <{A},{B},{A},{B}>     0.3
13             <{A},{A}>     0.8
14             <{B},{A}>     0.6
15         <{A},{B},{A}>     0.6
16         <{B},{B},{A}>     0.5
17     <{A},{B},{B},{A}>     0.4

这很好,但现在我想知道,对于每个事务,每个序列是否存在(真/假)。为此,我尝试使用 tidList:

sequences_score <- as.matrix(sequences@tidLists@data)

      [,1] [,2] [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17]
 [1,] TRUE TRUE TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
 [2,] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [3,] TRUE TRUE TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
 [4,] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
 [5,] TRUE TRUE TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE
 [6,] TRUE TRUE TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [7,] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
 [8,] TRUE TRUE TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
 [9,] TRUE TRUE TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
[10,] TRUE TRUE TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

根据这个结果,我假设每一行对应一个事务,每一列对应一个序列。但是当查看第 4 列时,它会显示模式 '
' 不存在于事务 2、4 和 7 中。尽管这些事务显然都包含这种模式。我对输出的假设是否错误?

另一种方法是使用 juliesls 提供的这段代码:R arulesSequences Find which patterns are supported by a sequence

应用以下代码行时,出现错误。

ids             <- unique(data_for_fseq_mining_trans@itemsetInfo$sequenceID)
sequences_score <- data.frame()

for (seq_id in 1:length(sequences)){
  sequences_score[,labels(sequences[seq_id])] <- logical(0)
}

for (id in ids){
  transaction_subset    <- data_for_fseq_mining_trans[data_for_fseq_mining_trans@itemsetInfo$sequenceID==id]
  sequences_score[id, ] <- as.logical(support(x = sequences, transactions = 
  transaction_subset, type="absolute"))
}

有什么线索吗?

【问题讨论】:

    标签: r arules


    【解决方案1】:

    要查看每个序列是否存在,您确实可以使用您提供的代码:

    sequences_score <- as.matrix(sequences@tidLists@data)
    

    但是,您必须使用 sequence 对象的另一个属性将生成的矩阵映射到您的数据,如下所示:

    # Get mapping ids, change to numeric values
    mapping_ids      <- as.numeric(sequences@tidLists@transactionInfo$sequenceID)
    
    # Then map your matrix sequence_score to correspond to the order of your data
    sequences_score  <- sequences_score[order(mapping_ids), ]
    

    【讨论】:

    • 我遇到了同样的问题(即逻辑矩阵行与我的 sequenceID 的顺序不匹配),即使在应用此修复后也是如此。我注意到sequence@tidLists@transactionInfo 似乎按非数字顺序(1、10、100、1000、1001 等)排序。我该如何解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2015-01-18
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多