17 votos

Bosque al azar y nuevos niveles de factor de prueba

Estoy tratando de hacer predicciones utilizando una muestra aleatoria de bosque modelo en R.

Sin embargo obtengo errores, ya que algunos factores tienen valores diferentes en el conjunto de pruebas que en el conjunto de entrenamiento. Por ejemplo, un factor Cat_2 valores 34, 68, 76, etc., en el conjunto de pruebas que no aparecen en el conjunto de entrenamiento. Por desgracia, no tengo control sobre el conjunto de Prueba... debo utilizar como está.

Mi única solución era convertir a la problemática de los factores de vuelta a valores numéricos, utilizando as.numeric(). Esto funciona , pero no estoy muy satisfecho, ya que estos valores son códigos que no tienen sentido numérico...

¿Crees que habría otra solución, a la caída de los nuevos valores de la prueba de conjunto? Pero sin quitar todos los otros valores del factor de (digamos que los valores de 1, 2, 14, 32, etc.) que están tanto en el entrenamiento y de prueba, y contiene información potencialmente útil para las predicciones.

8voto

Nait Puntos 21

Rey y Bonoit, este fragmento puede ser útil para armonizar los niveles:

for(attr in colnames(training))
{
  if (is.factor(training[[attr]]))
  {
    new.levels <- setdiff(levels(training[[attr]]), levels(testing[[attr]]))
    if ( length(new.levels) == 0 )
    { print(paste(attr, '- no new levels')) }
    else
    {
      print(c(paste(attr, length(new.levels), 'of new levels, e.g.'), head(new.levels, 2)))
      levels(testing[[attr]]) <- union(levels(testing[[attr]]), levels(training[[attr]]))
    }
  }
}

También imprime los atributos cambian. No encuentro una buena manera de escribir más elegante (con ldply o algo así). Algunos consejos son apreciados.

4voto

lfarb Puntos 1

Aquí le damos algunos código que escribí que dirige la respuesta de @King arriba. Había solucionado el error:

# loops through factors and standardizes the levels
for (f in 1:length(names(trainingDataSet))) {
    if (levels(testDataSet[,f]) > levels(trainingDataSet[,f])) {    
            levels(testDataSet[,f]) = levels(trainingDataSet[,f])       
    } else {
            levels(trainingDataSetSMOTEpred[,f]) = levels(testDataSet[,f])      
    }
}

2voto

MattoxBeckman Puntos 827

Si el equipo de prueba tiene un montón de estos puntos con valores del factor de nuevo entonces no sé lo que es el mejor enfoque. Si se trata de un puñado de puntos que podría ser capaces de salirse con algo al chocolate como tratamiento de los niveles de factor errante como faltan datos de imputación con cualquier enfoque que se le parezca. La aplicación de R tiene un par de maneras de imputar los datos faltantes, sólo necesita establecer los niveles del factor a NA para indicar que falta.

2voto

x3ja Puntos 169

Tengo una mala solución cuando uso randomForest en R. Probablemente no es teóricamente sano, pero se pone la cosa funcionando.

levels(testSet$Cat_2) = levels(trainingSet$Cat_2)

o al revés. Básicamente, sólo da cuenta R que es un valor válido sólo que son 0 casos; así cucarachas sobre el error.

Yo no soy lo suficientemente inteligente como para el código que realiza la acción de todas las características categóricas. Enviame el código si sabes cómo...

1voto

Flo Puntos 130

Estoy seguro de que usted hubiera pensado esto ya si este fuera el caso, pero si el equipo de prueba tiene valores reales y estás utilizando la prueba de conjunto para Cruz con fines de validación, luego volver a dividir la dataframe en datamframes formación y prueba donde los dos se equilibran en Estos factores evitarían el problema.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X