Non sono sicuro di aver capito cosa intendi per "raccogliere" dati. Se ti riferisci alla digitalizzazione diretta e all'assegnazione delle lezioni, è meglio farlo in un GIS. Ci sono molte opzioni gratuite che sarebbero adatte (es. QGIS, GRASS). Idealmente, avresti dati sul campo per allenare la tua classificazione.
La procedura per la classificazione usando le foreste casuali è abbastanza semplice. Puoi leggere i tuoi dati di allenamento (ad es. Uno shapefile di punti) usando "rgdal" o "maptools", leggere i tuoi dati spettrali usando raster::stack
, assegnare i valori raster ai tuoi punti di allenamento usando raster:extract
e poi passarli arandomForest
. Dovrai forzare la colonna "class" in un fattore affinché RF riconosca il modello come istanza di classificazione. Una volta che hai un modello adatto, puoi utilizzare la funzione di previsione, passando lo stack raster. Sarà necessario passare gli argomenti standard per prevedere oltre a quelli specifici della funzione di previsione raster. Il pacchetto raster ha la capacità di gestire i raster "senza memoria" e come tale è sicuro per la memoria, anche con raster molto grandi. Uno degli argomenti della funzione di previsione raster è "nome file" che consente a un raster di essere scritto su disco. Per un problema multiclasse dovrai impostare type = "response" e index = 1 che genererà un raster intero delle tue classi.
Ci sono alcuni avvertimenti che dovrebbero essere notati:
- Non è possibile avere più di 32 livelli nella variabile di risposta ( y ) o qualsiasi fattore sul lato destro dell'equazione ( x )
- Le tue classi devono essere bilanciate. Una regola del 30% è buona da seguire, cioè se hai più del 30% di osservazioni in più su una classe rispetto a qualsiasi altra, il tuo problema diventa sbilanciato e i risultati possono essere distorti
- È un termine improprio che RF non può esagerare. Se si mette in correlazione eccessiva il proprio ensemble, è possibile equipaggiare eccessivamente il modello. Un buon modo per evitare ciò è eseguire un modello preliminare e tracciare la stabilizzazione dell'errore. Come regola generale, scelgo 2 volte il numero di bootstrap necessari per stabilizzare l'errore per il parametro ntree. Questo perché l'interazione variabile si stabilizza a una velocità inferiore rispetto all'errore. Se non includi molte variabili nel modello, puoi essere molto più prudente con questo parametro.
- Non utilizzare la purezza del nodo come misura di importanza variabile. Non è ammesso come la diminuzione media della precisione.
Ho funzioni per la selezione del modello, lo squilibrio di classe e la validazione nel pacchetto rfUtilities disponibile su CRAN.
Ecco un semplice codice per iniziare.
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)