R语言rpart归纳树规则的覆盖率、准确率计算及报错解决咨询
报错根因
你使用的coverage()属于arules包的专属方法,仅支持arules类关联规则对象作为输入。而rpart.rules()返回的是文本化的规则数据框,不属于该函数支持的输入类型,因此触发方法匹配失败的报错。
另外你提供的剪枝代码存在笔误:你训练的树对象名为TrainTree,但剪枝代码中写的是prune(Tree, cp = 0.026),需要先修正为PruneTree <- prune(TrainTree, cp = 0.026)避免额外报错。
正确计算规则覆盖率、准确率的方案
方案1:手动计算(推荐,逻辑可控无需额外依赖)
首先明确两个核心指标的定义:
- 单条规则覆盖率:满足规则前置条件的样本数 / 总样本数
- 单条规则准确率:同时满足规则前置条件和预测结果的样本数 / 满足规则前置条件的样本数
- 整体规则覆盖率:所有规则覆盖的去重样本数 / 总样本数
你可以直接基于rpart的原生接口实现计算,代码如下:
# 1. 直接获取训练集上的单条规则覆盖率(rpart自带支持) train_rule_with_cov <- rpart.rules(PruneTree, cover = TRUE) # 返回结果中的cover列就是每条规则在训练集的覆盖率百分比 # 2. 自定义计算测试集上的所有指标 # 先获取测试集真实标签和树的节点路径 test_data <- Sets$testing total_test <- nrow(test_data) leaf_nodes <- rownames(PruneTree$frame)[PruneTree$frame$var == "<leaf>"] rule_metrics <- data.frame() for (node_id in leaf_nodes) { # 获取当前叶子节点的规则条件 rule_path <- path.rpart(PruneTree, node_id, print.it = FALSE)[[1]] rule_cond <- paste(rule_path[-1], collapse = " & ") # 预测类别 pred_class <- levels(PruneTree$y)[PruneTree$frame[node_id, "yval"]] # 筛选满足规则条件的测试样本 subsample <- tryCatch({ subset(test_data, eval(parse(text = rule_cond))) }, error = function(e) { data.frame() }) n_sub <- nrow(subsample) # 计算指标 cov <- ifelse(total_test == 0, 0, n_sub / total_test) acc <- ifelse(n_sub == 0, 0, sum(subsample$decision == pred_class) / n_sub) # 存入结果表 rule_metrics <- rbind(rule_metrics, data.frame( rule = rule_cond, predict_class = pred_class, test_coverage = cov, test_accuracy = acc )) } # 计算整体规则覆盖率 all_covered_idx <- unique(unlist(lapply(rule_metrics$rule, function(cond) { rownames(subset(test_data, eval(parse(text = cond)))) }))) total_coverage <- length(all_covered_idx) / total_test
方案2:转换为arules格式调用原生coverage函数
如果你需要沿用arules包的coverage()接口,可以通过格式转换实现:
# 安装依赖包 install.packages(c("RWeka", "arules")) library(RWeka) library(arules) # 将rpart树转换为arules类规则对象 arule_rules <- rpart.to.rules(PruneTree) # 将测试集转换为事务格式 test_trans <- as(test_data, "transactions") # 计算覆盖率 coverage(arule_rules, transactions = test_trans)
内容的提问来源于stack exchange,提问作者user17088179
相关产品推荐
相关产品推荐

