¿Cómo realizar la clasificación de la cubierta forestal aleatoria?

32

Este es un seguimiento de una publicación anterior: Algoritmos de aprendizaje automático para la clasificación de la cobertura del suelo .

Parece que el método de clasificación Random Forest (RF) está ganando mucho impulso en el mundo de la teledetección. Estoy particularmente interesado en RF debido a muchos de sus puntos fuertes:

  • Un enfoque no paramétrico adecuado para datos de teledetección
  • Alta precisión de clasificación reportada
  • Se informa la importancia variable

Dadas estas fortalezas, me gustaría realizar la clasificación de tierras de Random Forest utilizando imágenes de 4 bandas de alta resolución. Hay mucho material e investigación que promociona las ventajas de Random Forest, pero existe muy poca información sobre cómo realizar el análisis de clasificación. Estoy familiarizado con la regresión de RF usando R y preferiría usar este entorno para ejecutar el algoritmo de clasificación de RF.

¿Cómo recopilo, proceso e ingreso datos de entrenamiento (es decir, basados ​​en imágenes aéreas CIR de alta resolución) en el algoritmo Random Forest usando R? Cualquier consejo paso a paso sobre cómo producir un ráster de cobertura terrestre clasificado sería muy apreciado.

Aaron
fuente
Estoy tratando de entender esta clasificación de trama, ya que estoy trabajando en una clase RF (para distribución de especies) con imágenes de resolución de 10 cm. Así que creo que no puedo ingresar formas de puntos, sino solo ráster. ¿Cómo puedo continuar con * png o * tif -files?
steveomb

Respuestas:

29

No estoy seguro de entender lo que quiere decir con "recopilar" datos. Si se está refiriendo a la digitalización y la asignación de clases, esto se hace mejor en un SIG. Hay muchas opciones gratuitas que serían adecuadas (es decir, QGIS, GRASS). Lo ideal sería tener datos de campo para entrenar su clasificación.

El procedimiento para la clasificación con bosques aleatorios es bastante sencillo. Puede leer sus datos de entrenamiento (es decir, un archivo de forma de puntos) usando "rgdal" o "maptools", leer sus datos espectrales usando raster::stack, asignar los valores ráster a sus puntos de entrenamiento usando raster:extracty luego pasar esto arandomForest. Deberá forzar su columna de "clase" en un factor para que RF reconozca el modelo como una instancia de clasificación. Una vez que tenga un modelo ajustado, puede usar la función de predicción, pasándola a su ráster. Deberá pasar los argumentos estándar para predecir, además de los específicos de la función de predicción ráster. El paquete ráster tiene la capacidad de manejar rásteres "sin memoria" y, como tal, es seguro para la memoria, incluso con rásteres muy grandes. Uno de los argumentos en la función de predicción de ráster es "nombre de archivo" que permite que un ráster se escriba en el disco. Para un problema multiclase, deberá establecer type = "response" e index = 1, que generará un ráster entero de sus clases.

Hay algunas advertencias que deben tenerse en cuenta:

  1. No puede tener más de 32 niveles en su variable de respuesta ( y ) o cualquier factor en el lado derecho de la ecuación ( x )
  2. Tus clases deben ser equilibradas. Es conveniente seguir una regla del 30%, es decir, si tiene más del 30% más de observaciones en una clase que en cualquier otra, su problema se desequilibra y los resultados pueden estar sesgados.
  3. Es un nombre inapropiado que RF no puede sobreajustar. Si sobre correlaciona su conjunto, puede sobreajustar el modelo. Una buena manera de evitar esto es ejecutar un modelo preliminar y trazar la estabilización del error. Como regla general, elijo 2X el número de bootstraps necesarios para estabilizar el error para el parámetro ntree. Esto se debe a que la interacción variable se estabiliza a un ritmo más lento que el error. Si no incluye muchas variables en el modelo, puede ser mucho más conservador con este parámetro.
  4. No use la pureza de nodo como una medida de importancia variable. No está permutado como la disminución media en la precisión.

Tengo funciones para selección de modelo, desequilibrio de clase y validación en el paquete rfUtilities disponible en CRAN.

Aquí hay un código simple para comenzar.

require(sp)
require(rgdal)
require(raster)
require(randomForest)

# CREATE LIST OF RASTERS
rlist=list.files(getwd(), pattern="img$", full.names=TRUE) 

# CREATE RASTER STACK
xvars <- stack(rlist)      

# READ POINT SHAPEFILE TRAINING DATA
sdata <- readOGR(dsn=getwd() layer=inshape)

# ASSIGN RASTER VALUES TO TRAINING DATA
v <- as.data.frame(extract(xvars, sdata))
  sdata@data = data.frame(sdata@data, v[match(rownames(sdata@data), rownames(v)),])

# RUN RF MODEL
rf.mdl <- randomForest(x=sdata@data[,3:ncol(sdata@data)], y=as.factor(sdata@data[,"train"]),
                       ntree=501, importance=TRUE)

# CHECK ERROR CONVERGENCE
plot(rf.mdl)

# PLOT mean decrease in accuracy VARIABLE IMPORTANCE
varImpPlot(rf.mdl, type=1)

# PREDICT MODEL
predict(xvars, rf.mdl, filename="RfClassPred.img", type="response", 
        index=1, na.rm=TRUE, progress="window", overwrite=TRUE)
Jeffrey Evans
fuente
He estado viendo resultados bastante buenos usando RF y predic () para identificar la cubierta del dosel. Sin embargo, parece que no puedo producir mejores resultados que con el algoritmo ISODATA. Sospecho que mis muestras de entrenamiento están sesgadas o hay demasiada superposición espectral. ¿Existe una implementación no supervisada de RF que pueda producir mejores resultados? ¿Es posible asignar el número de clases a la salida, como lo haría con el algoritmo ISODATA?
Aaron
3
@ Aaron, es posible ejecutar una RF no etiquetada (sin supervisión) pero los resultados son difíciles de manejar. Sugeriría mirar el método de imputación de RF disponible en el paquete YaImpute. Esto puede tratar algunos de los problemas de sesgo / desequilibrio que está encontrando.
Jeffrey Evans el
5

Sé que este hilo es un poco viejo, pero para cualquiera que quiera probar la clasificación de datos de detección remota R, se ha lanzado un nuevo paquete muy prometedor.

install.packages("RSToolbox")

Viene con funciones para clasificación no supervisada y supervisada (utilizando bosques aleatorios). Puede encontrar más información aquí: http://bleutner.github.io/RStoolbox/

JPD
fuente
Esto parece muy prometedor, gracias por su trabajo en este paquete. Una aclaración, ¿está especificando bosques aleatorios a través de caret? Si es así, debe dejar esto MUY claro en la documentación. El paquete caret utiliza una estadística de división de nodos diferente a la definición original de Breiman (2001). La estadística sigue a Strobl et al., (2007) y donde la estadística propuesta puede ser válida, nunca he comprado sus condiciones de simulación. Además, el sesgo observado se basa en la variación en los niveles factoriales. Prefiero la estadística de entropía original y, como tal, no utilizo el símbolo de intercalación.
Jeffrey Evans
Hola Jeffrey, temo que no soy el autor del paquete. Sus detalles se pueden encontrar en el enlace que proporcioné.
JPD
2

Aquí y aquí hay tutoriales sobre clasificación / regresión supervisada con R, que incluye ejemplos de RandomForest.

Robert Hijmans
fuente
0

Dado que el problema aquí era clasificar una imagen CIR de alta resolución, sugiero no utilizar el enfoque tradicional (basado en píxeles) utilizado para los datos satelitales, sino producir un análisis de segmentación de la imagen aérea y luego utilizar el más elegante (RF).

vincent
fuente
3
Cuando se trata de un enfoque bastante válido, no se debe suponer que una clasificación basada en la agregación satisface las necesidades del usuario. La segmentación no debe aplicarse solo para abordar la trazabilidad computacional, sino para cumplir objetivos analíticos específicos. Este no es un método de blanqueo de carrito que reemplaza automáticamente a los métodos basados ​​en píxeles. Uno debe equilibrar la pérdida de información, debido al suavizado estadístico / espacial, con el resultado previsto. Si está interesado en la segmentación de variación espacial, puede eliminarla. Los resultados también pueden ser altamente dependientes de los parámetros de segmentación.
Jeffrey Evans
Estoy totalmente de acuerdo con usted, de hecho, cada método debe estar orientado a objetivos específicos. Es por eso que sugerí que con imágenes CIR de alta resolución (que probablemente tienen bandas espectrales limitadas) un conjunto de variables GEOBIA que incluye datos auxiliares, o valores de textura, podría mejorar significativamente la precisión final de la clasificación, especialmente cuando se combina con clasificadores como RF.
Vincent