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:extract
y 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:
- 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 )
- 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.
- 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.
- 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)