我想从树上产生的编程方式一个规则来测试。 在树上的根和叶(终端节点)之间的路径可以被解释为一个规则。
在R,我们可以使用rpart
包并执行以下操作:(在这篇文章中,我将使用iris
数据集,例如仅供参考)
library(rpart)
model <- rpart(Species ~ ., data=iris)
有了这个两行我得到了一棵树命名的model
,它的类是rpart.object
( rpart
文档,21页)。 该对象有大量的信息,并且支持多种方法。 特别地,所述对象具有frame
变量(其可以以标准方式进行访问: model$frame
)( 同上 ),并且该方法path.rpath
( rpart
文档,第7页),它给你的路径从所述根节点到感兴趣的(节点node
参数的函数)
所述row.names
所述的frame
变量包含树的节点号。 该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
但是,只有被标记为<leaf>
在var
列是终端节点( 叶子 )。 在这种情况下,节点2,6和7。
正如上面提到的可以使用path.rpart
方法提取的规则(这种技术在使用rattle
包,并在文章夏尔马信用评分 ,如下所示:
的方法,另外,该模型保持了预测值的中值
predicted.levels <- attr(model, "ylevels")
该值对应与列yval
在model$frame
数据组。
用于与节点号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
函数
提前致谢
注意: 这个问题已经被大量编辑更清晰