rpubs - Función GBM R: obtenga importancia variable por separado para cada clase
random forest rpubs (2)
Creo que la respuesta corta es que en la página 379, Hastie menciona que usa MART , que parece estar disponible solo para Splus.
Estoy de acuerdo con que el paquete gbm no parece permitir ver la influencia relativa separada. Si eso es algo que te interesa para un problema mutliclass, probablemente puedas obtener algo bastante similar creando un gbm one-vs-all para cada una de tus clases y luego obteniendo las medidas de importancia de cada uno de esos modelos.
Entonces di que tus clases son a, b, c, y d. Usted modela un frente al resto y obtiene la importancia de ese modelo. Luego modelas b frente al resto y obtienes la importancia de ese modelo. Etc.
Estoy usando la función gbm en R (paquete gbm) para adaptar modelos de aumento de gradiente estocásticos para la clasificación de multiclases. Simplemente estoy tratando de obtener la importancia de cada predictor por separado para cada clase, como en esta imagen del libro de Hastie (página 382).
Sin embargo, la función summary.gbm solo devuelve la importancia general de los predictores (su importancia promediada sobre todas las clases).
¿Alguien sabe cómo obtener los valores de importancia relativa?
Espero que esta función te ayude. Para el ejemplo, utilicé datos del paquete ElemStatLearn. La función averigua cuáles son las clases para una columna, divide los datos en estas clases, ejecuta la función gbm () en cada clase y traza los gráficos de barra para estos modelos.
# install.packages("ElemStatLearn"); install.packages("gbm")
library(ElemStatLearn)
library(gbm)
set.seed(137531)
# formula: the formula to pass to gbm()
# data: the data set to use
# column: the class column to use
classPlots <- function (formula, data, column) {
class_column <- as.character(data[,column])
class_values <- names(table(class_column))
class_indexes <- sapply(class_values, function(x) which(class_column == x))
split_data <- lapply(class_indexes, function(x) marketing[x,])
object <- lapply(split_data, function(x) gbm(formula, data = x))
rel.inf <- lapply(object, function(x) summary.gbm(x, plotit=FALSE))
nobjs <- length(class_values)
for( i in 1:nobjs ) {
tmp <- rel.inf[[i]]
tmp.names <- row.names(tmp)
tmp <- tmp$rel.inf
names(tmp) <- tmp.names
barplot(tmp, horiz=TRUE, col=''red'',
xlab="Relative importance", main=paste0("Class = ", class_values[i]))
}
rel.inf
}
par(mfrow=c(1,2))
classPlots(Income ~ Marital + Age, data = marketing, column = 2)
`