Não sei ao certo o que você entende por "coletar" dados. Se você está se referindo à digitalização heads-up e à atribuição de classes, é melhor fazer isso em um GIS. Existem muitas opções gratuitas que seriam adequadas (i..e, QGIS, GRASS). Idealmente, você teria dados de campo para treinar sua classificação.
O procedimento para classificação usando florestas aleatórias é bastante simples. Você pode ler seus dados de treinamento (ou seja, um shapefile de ponto) usando "rgdal" ou "maptools", ler seus dados espectrais raster::stack
, atribuir os valores de varredura aos seus pontos de treinamento usando raster:extract
e depois passar isso pararandomForest
. Você precisará coagir sua coluna "classe" a um fator para que a RF reconheça o modelo como uma instância de classificação. Depois de ter um modelo de ajuste, você pode usar a função de previsão, passando a pilha raster. Você precisará passar os argumentos padrão para prever, além dos argumentos específicos para a função de previsão de varredura. O pacote raster tem a capacidade de lidar com rasters "sem memória" e, como tal, é seguro para a memória, mesmo com rasters muito grandes. Um dos argumentos da função de previsão de varredura é "nome do arquivo", permitindo que uma varredura seja gravada no disco. Para um problema de várias classes, você precisará definir type = "response" e index = 1, o que produzirá uma varredura inteira de suas classes.
Existem algumas ressalvas que devem ser observadas:
- Você não pode ter mais de 32 níveis em sua variável de resposta ( y ) ou qualquer fator no lado direito da equação ( x )
- Suas aulas devem ser equilibradas. Uma regra de 30% é boa a seguir, ou seja, se você tiver mais de 30% mais observações em uma classe do que qualquer outra, seu problema se desequilibra e os resultados podem ser tendenciosos
- É um equívoco que o RF não pode se adequar demais. Se você correlacionar demais o seu conjunto, poderá superestimar o modelo. Uma boa maneira de evitar isso é executar um modelo preliminar e plotar a estabilização de erro. Como regra geral, escolho 2X o número de autoinicializações necessárias para estabilizar o erro para o parâmetro ntree. Isso ocorre porque a interação variável se estabiliza a uma taxa mais lenta que o erro. Se você não estiver incluindo muitas variáveis no modelo, poderá ser muito mais conservador com esse parâmetro.
- Não use a pureza do nó como uma medida de importância variável. Não é permutado como a diminuição média na precisão.
Tenho funções para seleção de modelo, desequilíbrio de classe e validação no pacote rfUtilities disponível no CRAN.
Aqui está um código simples para você começar.
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)