Comment effectuer la classification de la couverture terrestre des forêts aléatoires?

32

Il s'agit d'un suivi d'un article précédent: Algorithmes d'apprentissage automatique pour la classification de la couverture terrestre .

Il semble que la méthode de classification Random Forest (RF) gagne du terrain dans le monde de la télédétection. Je suis particulièrement intéressé par la RF en raison de ses nombreux atouts:

  • Une approche non paramétrique adaptée aux données de télédétection
  • Précision de classification élevée rapportée
  • Une importance variable est signalée

Compte tenu de ces points forts, j'aimerais effectuer une classification des terres de la forêt aléatoire en utilisant des images à haute résolution à 4 bandes. Il y a beaucoup de matériel et de recherche vantant les avantages de Random Forest, mais très peu d'informations existent sur la façon d'effectuer réellement l'analyse de classification. Je connais la régression RF à l'aide de R et préférerais utiliser cet environnement pour exécuter l'algorithme de classification RF.

Comment puis-je collecter, traiter et saisir des données d'entraînement (c'est-à-dire basées sur des images aériennes CIR à haute résolution) dans l' algorithme Random Forest à l' aide de R? Tout conseil étape par étape sur la façon de produire une trame de couverture du sol classée serait grandement apprécié.

Aaron
la source
J'essaie de comprendre cette classification raster, car je travaille sur une classe RF (pour la distribution des espèces) avec des images de résolution 10 cm. Je pense donc que je ne peux pas saisir de formes ponctuelles, mais uniquement raster. Comment puis-je continuer avec les fichiers * png ou * tif?
steveomb

Réponses:

29

Je ne suis pas sûr de comprendre ce que vous entendez par «collecter» des données. Si vous faites référence à la numérisation en tête-à-tête et à l'affectation de classes, il est préférable de le faire dans un SIG. Il existe de nombreuses options gratuites qui conviendraient (c'est-à-dire, QGIS, GRASS). Idéalement, vous auriez des données de terrain pour former votre classification.

La procédure de classification à l'aide de forêts aléatoires est assez simple. Vous pouvez lire vos données d'entraînement (c.-à-d. Un fichier de formes de points) en utilisant "rgdal" ou "maptools", lire vos données spectrales en utilisant raster::stack, attribuer les valeurs de trame à vos points d'entraînement en utilisant raster:extractpuis les transmettre àrandomForest. Vous devrez contraindre votre colonne "classe" en un facteur pour que RF reconnaisse le modèle comme une instance de classification. Une fois que vous avez un modèle ajusté, vous pouvez utiliser la fonction de prédiction, en lui passant la pile raster. Vous devrez passer les arguments standard à prévoir en plus de ceux spécifiques à la fonction de prédiction raster. Le package raster a la capacité de gérer les rasters «hors mémoire» et, en tant que tel, il est sûr de la mémoire, même avec de très grands rasters. Un des arguments de la fonction de prédiction de raster est "nom de fichier" permettant à un raster d'écrire sur le disque. Pour un problème multiclasse, vous devrez définir type = "response" et index = 1 qui produiront un raster entier de vos classes.

Il y a quelques mises en garde à noter:

  1. Vous ne pouvez pas avoir plus de 32 niveaux dans votre variable de réponse ( y ) ou n'importe quel facteur sur le côté droit de l'équation ( x )
  2. Vos cours doivent être équilibrés. Une règle de 30% est une bonne règle à suivre, c'est-à-dire que si vous avez plus de 30% d'observations de plus sur une classe que sur toute autre, votre problème devient déséquilibré et les résultats peuvent être biaisés
  3. Il est faux de dire que la RF ne peut pas être trop adaptée. Si vous corrélez trop votre ensemble, vous pouvez sur-adapter le modèle. Un bon moyen d'éviter cela est d'exécuter un modèle préliminaire et de tracer la stabilisation de l'erreur. En règle générale, je choisis 2 fois le nombre de bootstrap requis pour stabiliser l'erreur du paramètre ntree. En effet, l'interaction variable se stabilise à un rythme plus lent que l'erreur. Si vous n'incluez pas de nombreuses variables dans le modèle, vous pouvez être beaucoup plus conservateur avec ce paramètre.
  4. N'utilisez pas la pureté du nœud comme mesure d'importance variable. Elle n'est pas permutée comme la diminution moyenne de la précision.

J'ai des fonctions de sélection de modèle, de déséquilibre de classe et de validation dans le package rfUtilities disponible sur CRAN.

Voici un code simple pour vous aider à démarrer.

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
la source
J'ai vu des résultats assez bons en utilisant RF et Predict () pour identifier la couverture de la canopée. Cependant, je ne peux pas sembler produire de meilleurs résultats qu'avec l'algorithme ISODATA. Je soupçonne que mes échantillons d'entraînement sont biaisés ou qu'il y a trop de chevauchement spectral. Y a-t-il une implémentation non supervisée de RF qui peut produire de meilleurs résultats? Est-il possible d'affecter le nombre de classes à la sortie, comme vous le feriez pour l'algorithme ISODATA?
Aaron
3
@Aaron, il est possible d'exécuter une RF sans étiquette (non supervisée) mais les résultats sont difficiles à gérer. Je suggère de regarder la méthode d'imputation RF disponible dans le package YaImpute. Cela peut résoudre certains des problèmes de biais / déséquilibre que vous rencontrez.
Jeffrey Evans
5

Je sais que ce fil est un peu ancien, mais pour tous ceux qui souhaitent essayer la classification des données de télédétection dans R , un nouveau package très prometteur a été publié.

install.packages("RSToolbox")

Il est livré avec des fonctions pour la classification non supervisée et supervisée (en utilisant des forêts aléatoires). Plus d'informations peuvent être trouvées ici - http://bleutner.github.io/RStoolbox/

JPD
la source
Cela semble très prometteur, merci pour votre travail sur ce paquet. Une précision, spécifiez-vous des forêts aléatoires par le biais du curseur? Si tel est le cas, vous devez le préciser TRÈS clairement dans la documentation. Le package caret utilise une statistique de division de nœud différente de la définition d'origine de Breiman (2001). La statistique suit Strobl et al., (2007) et là où la statistique proposée peut être valide, je n'ai jamais acheté ses conditions de simulation. De plus, le biais observé est basé sur la variation des niveaux factoriels. Je préfère la statistique d'entropie d'origine et en tant que telle, je n'utilise pas de signe d'insertion.
Jeffrey Evans
Salut Jeffrey, j'ai peur de ne pas être l'auteur du paquet. Ses détails peuvent être trouvés sur le lien que j'ai fourni.
JPD
2

Ici et ici sont des tutoriels sur la classification / régression supervisée avec R, qui comprend des exemples RandomForest.

Robert Hijmans
la source
0

Étant donné que le problème ici était de classer une image CIR à haute résolution, je suggère de ne pas utiliser l'approche traditionnelle (basée sur les pixels) utilisée pour les données satellite, mais de produire une analyse de segmentation de l'image aérienne, puis d'utiliser le classeur (RF).

vincent
la source
3
Lorsqu'il s'agit d'une approche tout à fait valable, il ne faut pas faire l'hypothèse qu'une classification basée sur l'agrégation répond aux besoins de l'utilisateur. La segmentation ne doit pas être appliquée uniquement pour traiter la tractabilité informatique, mais plutôt pour atteindre des objectifs analytiques spécifiques. Ce n'est pas une méthode de blanchiment du chariot qui remplace automatiquement les méthodes basées sur les pixels. Il faut équilibrer la perte d'informations, due au lissage statistique / spatial, par rapport au résultat escompté. Si la segmentation par variation spatiale vous intéresse, vous pouvez la supprimer. Les résultats peuvent également dépendre fortement des paramètres de segmentation.
Jeffrey Evans
Je suis totalement d'accord avec vous, en effet chaque méthode doit être orientée vers des objectifs spécifiques. C'est pourquoi j'ai suggéré qu'avec des images CIR à haute résolution (qui ont probablement des bandes spectrales limitées), un ensemble de variables GEOBIA qui incluent des données auxiliaires, ou des valeurs de texture, pourrait améliorer considérablement la précision finale de la classification, en particulier lorsqu'il est couplé à des classificateurs comme RF.
vincent