序列模式挖掘前的订单数据预处理及相关技术问题咨询
序列模式挖掘相关问题解答
问题背景代码
df <- data.frame(member_no = c('1','1','1','2','3','4','5','4','3','2','3','1','2','2','4'), year_month = c('2020_Apr','2021_Mar','2021_Mar','2022_Jan','2023_May','2022_Dec','2019_Nov','2022_Feb','2021_Aug','2021_Aug','2020_Jan','2021_Mar','2021_Dec','2021_Jul','2023_Apr'), product = c('A','B','B','B','C','C','A','B','B','B','A','B','B','B','C')) dataset <- df |> select(member_no, year_month, product) |> group_by(member_no, year_month) |> summarize(itemset = paste(as.character(product), collapse = ',')) write.table(dataset, 'data.txt', sep = ',', quote = F, row.names = F, col.names = F) transaction <- read_baskets('data.txt', sep = ',', info = c('sequenceID', 'eventID')) inspect(transaction) freq.s <- cspade(transaction, parameter = list(support = 0.001), control = list(verbose = T)) inspect(head(freq.s, 1000, by = 'support')) df1 <- freq.s # output all results df1 <- as(df1, "data.frame") %>% as_tibble() df1$pattern <- (str_count(df1$sequence, ",") + 1) df11 <- df1[order(-df1$support),] # descending
Q1:member_no为1的用户在同一个月有3个项集,应统计为序列<{A}, {B}>还是<{A}, {B,B,B}>?
- 答案是
<{A}, {B}>。 - 原因:序列模式挖掘中,同一时间戳(此处为
year_month)下的重复项通常会被去重处理——我们关注的是用户在该时段内是否发生过该行为,而非行为的重复次数。你的代码已经通过group_by合并了同月份的product,但严格来说应该先对同组内的product去重再合并,比如修改summarize语句:summarize(itemset = paste(unique(as.character(product)), collapse = ',')) - 即便你没手动去重,
cspade这类算法默认也会把同一个项集中的重复项视为单个存在,因为项集本质是集合(元素唯一、无序),而非多重集合。
Q2:为何执行sum(df1$support)得到的结果会大于1?
- 这是因为序列模式的支持度是单个模式的统计指标,指包含该模式的序列占总序列数的比例,不同模式的支持度之间存在重叠计数。
- 举个例子:如果某用户的序列是
<{A}, {B}>,那么它会同时被计入模式<{A}>、<{B}>、<{A}, {B}>的支持度统计中。当你把所有模式的支持度相加时,同一个用户的序列会被多次计数,最终总和自然会超过1。 - 支持度的总和没有上限,它反映的是所有频繁模式在数据集中的覆盖重叠程度,而非整体占比,因此大于1是完全正常的现象。
内容的提问来源于stack exchange,提问作者Kevin Hong
相关产品推荐
相关产品推荐

