我希望以编程的方式测试从树中生成的一条规则。在树中,从根到叶子节点(终端节点)的路径可以被解释为一条规则。
在R中,我们可以使用“rpart”包并执行以下操作: (在本文中,我将仅使用“鸢尾花”数据集作为示例目的)
用这两行代码,我得到了一个名为
但是,仅在“var”列中标记为
如上所述,您可以使用
此外,该模型将预测值的值保存在中。
因此,规则可被解读为:
(注:我使用相同的鸢尾花数据集进行测试)
如何以编程方式评估规则?可以从规则中提取条件,如下所示。
在R中,我们可以使用“rpart”包并执行以下操作: (在本文中,我将仅使用“鸢尾花”数据集作为示例目的)
library(rpart)
model <- rpart(Species ~ ., data=iris)
用这两行代码,我得到了一个名为
model
的树形结构,它的类是rpart.object
(rpart
文档第21页)。这个对象有很多信息,并支持各种方法。特别是,这个对象有一个frame
变量(可以通过标准方式访问:model$frame
)(同上),以及方法path.rpath
(rpart
文档第7页),它可以给出从根节点到感兴趣的节点(函数中的node
参数)的路径。
frame
变量的row.names
包含树的节点编号。var
列给出了节点中的分割变量,yval
是拟合值,yval2
是类概率和其他信息。> model$frame
var n wt dev yval complexity ncompete nsurrogate yval2.1 yval2.2 yval2.3 yval2.4 yval2.5 yval2.6 yval2.7
1 Petal.Length 150 150 100 1 0.50 3 3 1.00000000 50.00000000 50.00000000 50.00000000 0.33333333 0.33333333 0.33333333
2 <leaf> 50 50 0 1 0.01 0 0 1.00000000 50.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000
3 Petal.Width 100 100 50 2 0.44 3 3 2.00000000 0.00000000 50.00000000 50.00000000 0.00000000 0.50000000 0.50000000
6 <leaf> 54 54 5 2 0.00 0 0 2.00000000 0.00000000 49.00000000 5.00000000 0.00000000 0.90740741 0.09259259
7 <leaf> 46 46 1 3 0.01 0 0 3.00000000 0.00000000 1.00000000 45.00000000 0.00000000 0.02173913 0.97826087
但是,仅在“var”列中标记为
<leaf>
的节点是终端节点(叶子)。在这种情况下,节点是2、6和7。如上所述,您可以使用
path.rpart
方法提取规则(此技术用于rattle
包和文章Sharma Credit Score中),如下所示:此外,该模型将预测值的值保存在中。
predicted.levels <- attr(model, "ylevels")
这个值对应于 model$frame
数据集中的列 yval
。
对于节点编号为7的叶子(行号为5),预测值为
> ylevels[model$frame[5, ]$yval]
[1] "virginica"
规则是:
> rule <- path.rpart(model, nodes = 7)
node number: 7
root
Petal.Length>=2.45
Petal.Width>=1.75
因此,规则可被解读为:
If Petal.Length >= 2.45 AND Petal.Width >= 1.75 THEN Species = Virginica
我知道我可以在测试数据集中(我将再次使用鸢尾花数据集)测试此规则的真正阳性数量,将新数据集子集化如下:
> hits <- subset(iris, Petal.Length >= 2.45 & Petal.Width >= 1.75)
然后计算混淆矩阵
> table(hits$Species, hits$Species == "virginica")
FALSE TRUE
setosa 0 0
versicolor 1 0
virginica 0 45
(注:我使用相同的鸢尾花数据集进行测试)
如何以编程方式评估规则?可以从规则中提取条件,如下所示。
> unlist(rule, use.names = FALSE)[-1]
[1] "Petal.Length>=2.45" "Petal.Width>=1.75"
但是,我该如何从这里继续呢?我不能使用subset
函数。
提前感谢。
注意:为了更好的清晰度,此问题已进行了大量编辑。
rule <- path.rpart(model, nodes=node.number, print.it=FALSE)
,它返回一个列表,其中包含[1] checking < 2.5 [2] afford< 54
等内容。因此,我想要的是类似于true.positives <- length(test.data[rule])
的东西,显然,这段代码不起作用。但是,思路已经在那里了... 有什么想法吗? - nanounanuerpart
时,我得到的结构与您似乎得到的结构不同。例如,没有model$frame$yval2
值。因此,您必须除了链接代码中的内容之外,还做了其他事情。 - IRTFMrpart.object
内的一个变量是frame
,而在frame
内部则有yval2
变量。我认为我需要重新阐述问题并提供更清晰的示例... - nanounanue