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