recorrido - Cómo contar las observaciones que caen en cada nodo de un árbol
recorrido por niveles arbol binario c++ (1)
Los números indican la cantidad de miembros de cada clase en ese nodo. Entonces, la etiqueta "0/1/48" nos dice que hay 0 casos de categoría 1 (Barabera, infiero), solo un ejemplo de categoría 2 (Barolo) y 48 de categoría 3 (Grignolino).
Puede obtener información detallada sobre el árbol y cada nodo usando el summary(fit_wine)
.
Ver ?summary.rpart
para más detalles.
También puede usar predict.rpart()
predict()
(que llamará a predict.rpart()
) para ver cómo el árbol categoriza un conjunto de datos. Por ejemplo, predict(fit_wine, train, type="class")
. O envuélvalo en una tabla para ver fácilmente la table(predict(fit_wine, train, type = "class"),train[,"class"])
Si desea saber específicamente de qué nodo de hoja depende una observación, esta información se almacena en fit_wine$where
. Para cada caso en el conjunto de datos, fit_wine$where
contiene el número de fila de fit_wine$frame
que representa el nodo hoja donde se ubica el caso. Para que podamos obtener la información de la hoja para cada caso con:
trainingnodes <- rownames(fit_wine$frame)[fit_wine$where]
Para obtener la información de la hoja para los datos de prueba, solía ejecutar predict()
con type="matrix"
e inferirlo. Esto devuelve, confusamente, una matriz producida al concatenar la clase predicha, la clase cuenta en ese nodo en el árbol ajustado, y las probabilidades de clase. Entonces para este ejemplo:
testresults <- predict(fit_wine, test, type = "matrix")
testresults <- data.frame(testresults)
names(testresults) <- c("ClassGuess","NofClass1onNode", "NofClass2onNode",
"NofClass3onNode", "PClass1", "PClass2", "PClass2")
A partir de esto, podemos inferir los diferentes nodos, por ejemplo, de unique(testresults[,2:4]
) pero es poco elegante.
Sin embargo, Yuji tiene un hack inteligente para esto en una pregunta anterior . Copia el objeto rpart y sustituye los nodos por las clases, por lo que la ejecución de predicciones devuelve el nodo y no la clase:
nodes_wine <- fit_wine
nodes_wine$frame$yval = as.numeric(rownames(nodes_wine$frame))
testnodes <- predict(nodes_wine, test, type="vector")
He incluido la solución aquí, pero la gente se irá debería votarlo .
Actualmente estoy lidiando con datos de vino en el paquete MMST. He dividido todo el conjunto de datos en entrenamiento y prueba, y he construido un árbol como los siguientes códigos:
library("rpart")
library("gbm")
library("randomForest")
library("MMST")
data(wine)
aux <- c(1:178)
train_indis <- sample(aux, 142, replace = FALSE)
test_indis <- setdiff(aux, train_indis)
train <- wine[train_indis,]
test <- wine[test_indis,] #### divide the dataset into trainning and testing
model.control <- rpart.control(minsplit = 5, xval = 10, cp = 0)
fit_wine <- rpart(class ~ MalicAcid + Ash + AlcAsh + Mg + Phenols + Proa + Color + Hue + OD + Proline, data = train, method = "class", control = model.control)
windows()
plot(fit_wine,branch = 0.5, uniform = T, compress = T, main = "Full Tree: without pruning")
text(fit_wine, use.n = T, all = T, cex = .6)
Y podría obtener una imagen como esta:
¿Qué significa el número debajo de cada nodo (por ejemplo, 0/1/48 bajo Grignolino)? Si quiero saber cuántas muestras de entrenamiento y prueba caen en cada nodo, ¿qué debo escribir en los códigos?