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

R语言RLT包训练的单棵分类决策树如何提取决策规则?

单棵RLT决策树规则提取方法

RLT包没有内置的规则提取函数,但你可以通过解析训练生成的树对象的原始结构来手动提取规则,具体步骤和代码如下:

步骤1:确认树结构存储位置

你训练的单棵RLT模型的树结构存储在fit$FittedTrees[[1]]中,该数据框每一行对应一个树节点,核心字段含义如下:

  • splitVar: 分裂特征的索引(0代表叶子节点,1~4对应鸢尾花数据集的4个特征:Sepal.Length、Sepal.Width、Petal.Length、Petal.Width)
  • splitValue: 分裂阈值
  • leftNode: 左子节点索引(满足特征 < 分裂阈值的样本进入左子节点)
  • rightNode: 右子节点索引(满足特征 >= 分裂阈值的样本进入右子节点)
  • prediction: 叶子节点对应的预测类别(分类任务下)

步骤2:编写递归遍历函数提取规则

可直接运行的完整代码如下:

library(RLT)
data(iris)
# 特征名映射
feature_names <- colnames(iris)[1:4]
# 类别名映射
class_names <- levels(iris$Species)

# 训练单棵RLT分类树
fit <- RLT(iris[,1:4], iris$Species, model = "classification", ntrees = 1, verbose = FALSE)

# 递归提取规则的函数
extract_rlt_rules <- function(tree, node_id, current_rule = "", feature_names, class_names) {
  node <- tree[tree$nodeID == node_id, ]
  # 判断是否是叶子节点
  if (node$splitVar == 0) {
    pred_class <- class_names[node$prediction + 1] # RLT内类别索引从0开始,因此加1匹配R的索引逻辑
    return(paste0(pred_class, " when ", current_rule))
  }
  # 非叶子节点,分别递归遍历左右子树
  split_feat <- feature_names[node$splitVar + 1] # 特征索引从0开始,加1匹配特征名列表顺序
  split_val <- round(node$splitValue, 3)
  # 拼接左子树规则:特征 < 阈值
  left_rule <- ifelse(current_rule == "", 
                      paste0(split_feat, " < ", split_val), 
                      paste0(current_rule, " & ", split_feat, " < ", split_val))
  left_rules <- extract_rlt_rules(tree, node$leftNode, left_rule, feature_names, class_names)
  # 拼接右子树规则:特征 >= 阈值
  right_rule <- ifelse(current_rule == "", 
                       paste0(split_feat, " >= ", split_val), 
                       paste0(current_rule, " & ", split_feat, " >= ", split_val))
  right_rules <- extract_rlt_rules(tree, node$rightNode, right_rule, feature_names, class_names)
  # 合并所有分支规则返回
  return(c(left_rules, right_rules))
}

# 提取规则,从根节点(nodeID=0)开始遍历
tree_struct <- fit$FittedTrees[[1]]
rules <- extract_rlt_rules(tree_struct, 0, "", feature_names, class_names)

# 打印输出规则
cat("单棵RLT决策树规则:\n")
for (r in rules) {
  cat(paste0("- ", r, "\n"))
}

输出示例

运行上述代码后会得到类似如下格式的规则:

单棵RLT决策树规则:
- setosa when Petal.Length < 2.45
- versicolor when Petal.Length >= 2.45 & Petal.Width < 1.75
- virginica when Petal.Length >= 2.45 & Petal.Width >= 1.75

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:06:02