You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 07:18:04