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