varias probabilidad ojiva leyendas histograma graficos grafico graficas distribuciones dispersion r predict r-caret

probabilidad - plot en r



Error cuando intento predecir las probabilidades de clase en R-intercalación (5)

Como @Sam Firke ya señaló en los comentarios (pero lo pasé por alto), los niveles VERDADERO / FALSO tampoco funcionan. Así que los convertí a sí / no.

He construido un modelo utilizando caret. Cuando se completó el entrenamiento recibí la siguiente advertencia:

Mensaje de advertencia: en train.default (x, y, pesos = w, ...): al menos uno de los niveles de clase no son nombres de variables R válidos; Esto puede causar errores si se generan probabilidades de clase porque los nombres de las variables se convertirán a: X0, X1

Los nombres de las variables son:

str(train) ''data.frame'': 7395 obs. of 30 variables: $ alchemy_category : Factor w/ 13 levels "arts_entertainment",..: 2 8 6 6 11 6 1 6 3 8 ... $ alchemy_category_score : num 3737 2052 4801 3816 3179 ... $ avglinksize : num 2.06 3.68 2.38 1.54 2.68 ... $ commonlinkratio_1 : num 0.676 0.508 0.562 0.4 0.5 ... $ commonlinkratio_2 : num 0.206 0.289 0.322 0.1 0.222 ... $ commonlinkratio_3 : num 0.0471 0.2139 0.1202 0.0167 0.1235 ... $ commonlinkratio_4 : num 0.0235 0.1444 0.0426 0 0.0432 ... $ compression_ratio : num 0.444 0.469 0.525 0.481 0.446 ... $ embed_ratio : num 0 0 0 0 0 0 0 0 0 0 ... $ frameTagRatio : num 0.0908 0.0987 0.0724 0.0959 0.0249 ... $ hasDomainLink : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... $ html_ratio : num 0.246 0.203 0.226 0.266 0.229 ... $ image_ratio : num 0.00388 0.08865 0.12054 0.03534 0.05047 ... $ is_news : Factor w/ 2 levels "0","1": 2 2 2 2 2 1 2 1 2 1 ... $ lengthyLinkDomain : Factor w/ 2 levels "0","1": 2 2 2 1 2 1 1 1 1 2 ... $ linkwordscore : num 24 40 55 24 14 12 21 5 17 14 ... $ news_front_page : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... $ non_markup_alphanum_characters: num 5424 4973 2240 2737 12032 ... $ numberOfLinks : num 170 187 258 120 162 55 93 132 194 326 ... $ numwords_in_url : num 8 9 11 5 10 3 3 4 7 4 ... $ parametrizedLinkRatio : num 0.1529 0.1818 0.1667 0.0417 0.0988 ... $ spelling_errors_ratio : num 0.0791 0.1254 0.0576 0.1009 0.0826 ... $ label : Factor w/ 2 levels "0","1": 1 2 2 2 1 1 2 1 2 2 ... $ isVideo : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 1 1 ... $ isFashion : Factor w/ 2 levels "0","1": 1 1 1 1 2 1 2 1 2 1 ... $ isFood : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ... $ hasComments : Factor w/ 2 levels "0","1": 1 2 2 2 2 1 2 2 1 2 ... $ hasGoogleAnalytics : Factor w/ 2 levels "0","1": 1 1 1 1 2 1 2 2 2 1 ... $ hasInlineCSS : Factor w/ 2 levels "0","1": 1 2 2 2 1 1 2 1 2 2 ... $ noOfMetaTags : num 10 12 6 10 13 2 6 6 9 5 ...

Mi código es el siguiente:

ctrl <- trainControl(method = "CV", number=10, classProbs = TRUE, allowParallel = TRUE, summaryFunction = twoClassSummary) set.seed(476) rfFit <- train(formula, data=train, method = "rf", tuneGrid = expand.grid(.mtry = seq(4,20,by=2)), ntrees=1000, importance = TRUE, metric = "ROC", trControl = ctrl) pred <- predict.train(rfFit, newdata = test, type = "prob")

Recibo el error: Error en [.data.frame (out,, obsLevels, drop = FALSE): columnas no definidas seleccionadas

Los nombres de las variables en el conjunto de datos de prueba son:

str(test) ''data.frame'': 3171 obs. of 29 variables: $ alchemy_category : Factor w/ 13 levels "arts_entertainment",..: 8 4 12 4 10 12 12 8 1 2 ... $ alchemy_category_score : num 5307 4825 1 6708 5416 ... $ avglinksize : num 2.56 3.77 2.27 2.52 1.85 ... $ commonlinkratio_1 : num 0.39 0.462 0.496 0.706 0.471 ... $ commonlinkratio_2 : num 0.257 0.205 0.385 0.346 0.161 ... $ commonlinkratio_3 : num 0.0441 0.0513 0.1709 0.123 0.0323 ... $ commonlinkratio_4 : num 0.0221 0 0.1709 0.0906 0 ... $ compression_ratio : num 0.49 0.782 1.25 0.449 0.454 ... $ embed_ratio : num 0 0 0 0 0 0 0 0 0 0 ... $ frameTagRatio : num 0.0671 0.0429 0.0588 0.0581 0.093 ... $ hasDomainLink : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... $ html_ratio : num 0.23 0.366 0.162 0.147 0.244 ... $ image_ratio : num 0.19944 0.08 10 0.00596 0.03571 ... $ is_news : Factor w/ 2 levels "0","1": 2 1 1 2 2 1 1 2 1 1 ... $ lengthyLinkDomain : Factor w/ 2 levels "0","1": 2 2 2 2 1 2 2 1 1 1 ... $ linkwordscore : num 15 62 42 41 34 35 15 22 41 7 ... $ news_front_page : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ... $ non_markup_alphanum_characters: num 5643 382 2420 5559 2209 ... $ numberOfLinks : num 136 39 117 309 155 266 55 145 110 1 ... $ numwords_in_url : num 3 2 1 10 10 7 1 9 5 0 ... $ parametrizedLinkRatio : num 0.2426 0.1282 0.5812 0.0388 0.0968 ... $ spelling_errors_ratio : num 0.0806 0.1765 0.125 0.0631 0.0653 ... $ isVideo : Factor w/ 2 levels "0","1": 1 2 1 2 2 2 1 1 2 2 ... $ isFashion : Factor w/ 2 levels "0","1": 1 1 1 1 1 2 1 1 1 1 ... $ isFood : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ... $ hasComments : Factor w/ 2 levels "0","1": 2 1 1 2 2 2 1 2 2 1 ... $ hasGoogleAnalytics : Factor w/ 2 levels "0","1": 1 2 2 2 2 1 1 2 1 1 ... $ hasInlineCSS : Factor w/ 2 levels "0","1": 2 2 2 1 1 2 2 2 1 1 ... $ noOfMetaTags : num 3 6 5 9 16 22 6 9 7 0 ...

Si omito la parte type = "prob", no obtengo ningún error.

¿Algunas ideas?

¿Podría ser la longitud de la variable "alchemy_category" que se anexa con los niveles de factores respectivos, por ejemplo, "alchemy_categoryarts_entertainment" dentro del modelo?


Como se indicó anteriormente, los valores de clase deben ser factores y deben ser nombres válidos. Otra forma de asegurar esto es,

levels(all.dat$target) <- make.names(levels(factor(all.dat$target)))


De acuerdo con el ejemplo anterior, generalmente la refactorización de la variable de resultado solucionará el problema. Es mejor cambiar el conjunto de datos original antes de dividirlo en conjuntos de datos de entrenamiento y prueba

niveles <- único (datos $ resultado) datos $ resultado <- factor (datos $ resultado, etiquetas = marca.nombres (niveles))

Como otros lo señalaron anteriormente, este problema solo ocurre cuando classProbs = TRUE, lo que hace que la función del tren genere estadísticas adicionales relacionadas con la clase de resultado


He leído las respuestas de arriba mientras me enfrentaba a un problema similar. Una solución formal es hacer esto en el tren y probar los conjuntos de datos. Asegúrese de incluir la variable de respuesta en feature.names también.

feature.names=names(train) for (f in feature.names) { if (class(train[[f]])=="factor") { levels <- unique(c(train[[f]])) train[[f]] <- factor(train[[f]], labels=make.names(levels)) } }

Esto crea etiquetas sintácticamente correctas para todos los factores.


La respuesta está en negrita en la parte superior de tu publicación =]

¿Qué estás modelando? ¿Es alchemy_category ? El código solo dice formula y no podemos verlo.

Cuando solicita probabilidades de clase, las predicciones de modelo son un marco de datos con columnas separadas para cada clase / nivel. Si alchemy_category no tiene niveles que sean nombres de columna válidos, data.frame convierte en nombres válidos. Eso crea un problema porque el código está buscando un nombre específico pero el marco de datos como un nombre diferente (pero válido).

Por ejemplo, si tuviera

> test <- factor(c("level1", "level 2")) > levels(test) [1] "level 2" "level1" > make.names(levels(test)) [1] "level.2" "level1"

el código buscaría "nivel 2" pero solo hay "nivel.2".