【发布时间】: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"))
}
有什么线索吗?
【问题讨论】: