Como executar a classificação aleatória da cobertura da floresta?

32

Este é um acompanhamento de um post anterior: Algoritmos de aprendizado de máquina para classificação da cobertura do solo .

Parece que o método de classificação Random Forest (RF) está ganhando muito impulso no mundo do sensoriamento remoto. Estou particularmente interessado em RF devido a muitos de seus pontos fortes:

  • Uma abordagem não paramétrica adequada para dados de sensoriamento remoto
  • Alta precisão de classificação relatada
  • Importância variável é relatada

Dado esses pontos fortes, eu gostaria de realizar a classificação aleatória da terra da Floresta usando imagens de alta resolução em 4 bandas. Há muito material e pesquisa divulgando as vantagens do Random Forest, mas existem poucas informações sobre como realmente executar a análise de classificação. Eu estou familiarizado com a regressão de RF usando R e preferiria usar esse ambiente para executar o algoritmo de classificação de RF.

Como coletar, processar e inserir dados de treinamento (ou seja, com base em imagens aéreas CIR de alta resolução) no algoritmo Random Forest usando R? Qualquer conselho passo a passo sobre como produzir uma varredura classificada de cobertura da terra seria muito apreciado.

Aaron
fonte
Estou tentando entender essa classificação raster, pois estou trabalhando em uma classe de RF (para distribuição de espécies) com imagens com resolução de 10 cm. Então, acho que não posso inserir formas de pontos, mas apenas raster. Como posso prosseguir com arquivos * png ou * tif?
Steveomb 17/08/14

Respostas:

29

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:extracte 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:

  1. 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 )
  2. 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
  3. É 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.
  4. 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)
Jeffrey Evans
fonte
Tenho visto resultados razoavelmente bons usando RF e predizer () para identificar a cobertura do dossel. No entanto, não consigo produzir melhores resultados do que com o algoritmo ISODATA. Suspeito que minhas amostras de treinamento sejam tendenciosas ou haja muita sobreposição espectral. Existe uma implementação não supervisionada de RF que possa produzir melhores resultados? É possível atribuir o número de classes à saída, como você faria com o algoritmo ISODATA?
Aaron
3
@ Aaron, é possível executar um RF não marcado (não supervisionado), mas os resultados são difíceis de lidar. Eu sugeriria examinar o método de imputação de RF disponível no pacote YaImpute. Isso pode lidar com alguns dos problemas de preconceito / desequilíbrio que você está enfrentando.
Jeffrey Evans
5

Eu sei que esse segmento é um pouco antigo, mas para quem quiser experimentar a classificação de dados de sensoriamento remoto R, um novo pacote muito promissor foi lançado.

install.packages("RSToolbox")

Ele vem com funções para classificação não supervisionada e supervisionada (usando florestas aleatórias). Mais informações podem ser encontradas aqui - http://bleutner.github.io/RStoolbox/

JPD
fonte
Isso parece muito promissor, obrigado pelo seu trabalho neste pacote. Um esclarecimento: você está especificando florestas aleatórias através de sinal de intercalação? Nesse caso, você deve deixar isso MUITO claro na documentação. O pacote de intercalação usa uma estatística de divisão de nó diferente da definição original de Breiman (2001). A estatística segue Strobl et al., (2007) e, onde a estatística proposta pode ser válida, nunca comprei suas condições de simulação. Além disso, o viés observado é baseado na variação nos níveis fatoriais. Prefiro a estatística de entropia original e, como tal, não use circunflexo.
Jeffrey Evans
Oi Jeffrey, com medo de não ser o autor do pacote. Seus detalhes podem ser encontrados no link que eu forneci.
JPD
2

Aqui e aqui estão os tutoriais sobre classificação / regressão supervisionada com R, que inclui exemplos de RandomForest.

Robert Hijmans
fonte
0

Como o problema aqui estava em classificar uma imagem CIR de alta resolução, sugiro não usar a abordagem tradicional (baseada em pixels) usada para dados de satélite, mas produzir uma análise de segmentação da imagem aérea e depois usar o classier (RF).

vincent
fonte
3
Onde esta é uma abordagem bastante válida, não se deve assumir que uma classificação baseada em agregação atenda às necessidades do usuário. A segmentação não deve ser aplicada apenas para abordar a rastreabilidade computacional, mas para atender a objetivos analíticos específicos. Este não é um método de branqueamento de carrinho que substitui automaticamente os métodos baseados em pixel. É preciso equilibrar a perda de informações, devido à suavização estatística / espacial, com o resultado pretendido. Se você estiver interessado na segmentação de variação espacial, pode removê-la. Os resultados também podem ser altamente dependentes dos parâmetros de segmentação.
Jeffrey Evans
Eu concordo totalmente com você, na verdade cada método deve ser orientado para objetivos específicos. É por isso que sugeri que, com imagens CIR de alta resolução (que provavelmente têm bandas espectrais limitadas), um conjunto de variáveis ​​GEOBIA que inclui dados auxiliares ou valores de textura pode melhorar significativamente a precisão final da classificação, especialmente quando combinada com classificadores como RF.
vincent