我使用 R 中的 apriori 算法生成关联规则。通常,我可以使用下面的代码可视化生成的规则:
# Load the arules package
library(arules)
library(arulesViz)
# Generate example transaction data
example_transactions <- list(
c("item1", "item2", "item3"),
c("item1", "item3"),
c("item2", "item4"),
c("item1", "item2", "item4"),
c("item2", "item3")
)
# Convert the transaction data to a transactions object
example_transactions <- as(example_transactions, "transactions")
# Mine association rules
example_rules <- apriori(example_transactions,
parameter = list(support = 0.02, confidence = 0.2),
control = list(verbose = FALSE))
# Plot the association rules using the "paracoord" method
plot(example_rules, method = "paracoord")
我将规则导出到 CSV 并使用提升增加标准 (LIC) 执行手动规则选择,因为我无法在 R 中执行此操作。应用 LIC 标准导致规则数量减少(LIC 涉及选择经历过的规则)当将新项目添加到父规则左侧的预先存在的项目时,其父规则的提升会增加(按特定阈值)。
现在,我想再次将手动选择的规则导入到 R 中,并使用plot()将它们可视化。但是,当我这样做时,代码无法正常工作。
write(example_rules,
file = "rules.csv",
sep = ",",
quote = TRUE,
row.names = FALSE)
# Read the CSV file into a data frame
rules_df <- read.csv("rules.csv")
# Create a rules object
rules <- as(rules_df, "rules")
收到的错误是“
Error in as(rules_df, "rules") :
no method or default for coercing “data.frame” to “rules”
我也尝试过将数据帧转换为事务,但这也不起作用。
rules_df <- read.csv("rules.csv")
rules_df <- as.data.frame(unlist(rules_df))
rules_trans <- as(rules_df, "transactions")
plot(rules_trans, method = "paracoord")
我注意到apriori函数创建的对象的结构和数据框是不同的。但我怎样才能解决这个问题并生成情节呢?
> str(example_rules)
Formal class 'rules' [package "arules"] with 4 slots
..@ lhs :Formal class 'itemMatrix' [package "arules"] with 3 slots
.. .. ..@ data :Formal class 'ngCMatrix' [package "Matrix"] with 5 slots
.. .. .. .. ..@ i : int [1:22] 3 0 3 1 2 0 2 1 0 1 ...
.. .. .. .. ..@ p : int [1:21] 0 0 0 0 0 1 2 3 4 5 ...
.. .. .. .. ..@ Dim : int [1:2] 4 20
.. .. .. .. ..@ Dimnames:List of 2
.. .. .. .. .. ..$ : NULL
.. .. .. .. .. ..$ : NULL
.. .. .. .. ..@ factors : list()
.. .. ..@ itemInfo :'data.frame': 4 obs. of 1 variable:
.. .. .. ..$ labels: chr [1:4] "item1" "item2" "item3" "item4"
.. .. ..@ itemsetInfo:'data.frame': 0 obs. of 0 variables
..@ rhs :Formal class 'itemMatrix' [package "arules"] with 3 slots
.. .. ..@ data :Formal class 'ngCMatrix' [package "Matrix"] with 5 slots
.. .. .. .. ..@ i : int [1:20] 3 2 0 1 0 3 1 3 0 2 ...
.. .. .. .. ..@ p : int [1:21] 0 1 2 3 4 5 6 7 8 9 ...
.. .. .. .. ..@ Dim : int [1:2] 4 20
.. .. .. .. ..@ Dimnames:List of 2
.. .. .. .. .. ..$ : NULL
.. .. .. .. .. ..$ : NULL
.. .. .. .. ..@ factors : list()
.. .. ..@ itemInfo :'data.frame': 4 obs. of 1 variable:
.. .. .. ..$ labels: chr [1:4] "item1" "item2" "item3" "item4"
.. .. ..@ itemsetInfo:'data.frame': 0 obs. of 0 variables
..@ quality:'data.frame': 20 obs. of 5 variables:
.. ..$ support : num [1:20] 0.4 0.6 0.6 0.8 0.2 0.2 0.4 0.4 0.4 0.4 ...
.. ..$ confidence: num [1:20] 0.4 0.6 0.6 0.8 0.5 ...
.. ..$ coverage : num [1:20] 1 1 1 1 0.4 0.6 0.4 0.8 0.6 0.6 ...
.. ..$ lift : num [1:20] 1 1 1 1 0.833 ...
.. ..$ count : int [1:20] 2 3 3 4 1 1 2 2 2 2 ...
..@ info :List of 5
.. ..$ data : symbol example_transactions
.. ..$ ntransactions: int 5
.. ..$ support : num 0.02
.. ..$ confidence : num 0.2
.. ..$ call : chr "apriori(data = example_transactions, parameter = list(support = 0.02, confidence = 0.2), control = list(verbose = FALSE))"
> str(rules_df)
'data.frame': 20 obs. of 6 variables:
$ rules : chr "{} => {item4}" "{} => {item3}" "{} => {item1}" "{} => {item2}" ...
$ support : num 0.4 0.6 0.6 0.8 0.2 0.2 0.4 0.4 0.4 0.4 ...
$ confidence: num 0.4 0.6 0.6 0.8 0.5 ...
$ coverage : num 1 1 1 1 0.4 0.6 0.4 0.8 0.6 0.6 ...
$ lift : num 1 1 1 1 0.833 ...
$ count : int 2 3 3 4 1 1 2 2 2 2 ...
有谁知道如何处理这个问题吗?我非常感谢您的支持。
一旦使用
write()
以人类可读的形式编写规则,就无法轻松读回它们,因为大量信息丢失了。一种选择是使用 PMML(参见 write.PMML
)。但是,结果是一个无法在 Excel 中使用的 XML 文件。
使用包中的LIC很容易过滤
arules
。
example_rules[!is.redundant(example_rules, measure = "lift")]
将删除所有带有 LIC 的规则 <= 1. It technically uses improvement, but that has the same effect.