tipos recorrido por niveles insertar hojas grado estructura datos contar clasificacion busqueda binario arboles arbol r tree classification decision-tree

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?