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
相关产品推荐
相关产品推荐

