Regras de teste geradas pelo pacote Rpart

Eu quero testar de forma programática uma regra gerada a partir de uma árvore. Nas árvores, o caminho entre a raiz e uma folha (nó terminal) pode ser interpretado como regra.

Em R, poderíamos usar orpart pacote e faça o seguinte: (Neste post, vou usar oiris conjunto de dados, apenas para fins de exemplo)

library(rpart)
model <- rpart(Species ~ ., data=iris)

Com estas duas linhas eu tenho uma árvore chamadamodel, cuja aula érpart.object (rpart documentação, página 21). Este objeto tem muita informação e suporta uma variedade de métodos. Em particular, o objeto tem umframe variável (que pode ser acessada da maneira padrão:model$frame) (idem) e o métodopath.rpath (rpart documentação, página 7), que lhe dá o caminho do nó raiz para o nó de interesse (node argumento na função)

orow.names doframe variável contém os números dos nós da árvore. ovar coluna dá a variável de divisão no nó,yval o valor ajustado eyval2 probabilidades de classe e outras informações.

> 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

Mas apenas o marcado como<leaf> novar coluna são nós terminais (folhas). Neste caso, os nós são 2, 6 e 7.

Como mencionado acima, você pode usar opath.rpart método para extrair uma regra (esta técnica é usada norattle pacote e no artigoPontuação de crédito de Sharma, do seguinte modo:

Adicionalmente, o modelo mantém os valores do valor previsto em

predicted.levels <- attr(model, "ylevels")

Este valor corresponde à colunayval nomodel$frame conjunto de dados.

Para a folha com número de nó 7 (linha número 5), o valor previsto é

> ylevels[model$frame[5, ]$yval]
[1] "virginica"

e a regra é

> rule <- path.rpart(model, nodes = 7)

 node number: 7 
   root
   Petal.Length>=2.45
   Petal.Width>=1.75

Então, a regra poderia ser lida como

If Petal.Length >= 2.45 AND Petal.Width >= 1.75 THEN Species = Virginica

Eu sei que eu posso testar (em um conjunto de dados de teste, vou usar o conjunto de dados da íris novamente) quantos positivos verdadeiros eu tenho para essa regra, subconjunto do novo conjunto de dados da seguinte forma

> hits <- subset(iris, Petal.Length >= 2.45 & Petal.Width >= 1.75)

e depois calcular a matriz de confusão

> table(hits$Species, hits$Species == "virginica")

             FALSE TRUE
  setosa         0    0
  versicolor     1    0
  virginica      0   45

(Nota: eu usei o mesmo conjunto de dados da íris como teste)

Como eu poderia avaliar a regra de maneira programática? Eu poderia extrair as condições da regra da seguinte forma

> unlist(rule, use.names = FALSE)[-1]
[1] "Petal.Length>=2.45" "Petal.Width>=1.75" 

Mas como eu posso continuar daqui? Eu não posso usar osubset função

desde já, obrigado

NOTA: Esta questão foi fortemente editada para melhor clareza

questionAnswers(3)

yourAnswerToTheQuestion