33

This is a follow-up to a previous post: Machine Learning Algorithms for Land Cover Classification.

It seems that the Random Forest (RF) classification method is gaining much momentum in the remote sensing world. I am particularly interested in RF due to many of its strengths:

  • A nonparametric approach suited to remote sensing data
  • High reported classification accuracy
  • Variable importance is reported

Given these strengths, I would like to perform Random Forest land classification using high resolution 4 band imagery. There is a lot of material and research touting the advantages of Random Forest, yet very little information exists on how to actually perform the classification analysis. I am familiar with RF regression using R and would prefer to use this environment to run the RF classification algorithm.

How do I collect, process and input training data (i.e. based on high resolution CIR aerial imagery) into the Random Forest algorithm using R? Any step-wise advice on how to produce a classified land cover raster would be greatly appreciated.

1
  • I'm trying to understand this raster-classification, since I'm working on a RF-class (for species-distribution) with 10cm-resolution images. So I think I cannot input point shapes, but only raster. How am I able to proceed with *png or *tif -files?
    – steveomb
    Commented Aug 17, 2014 at 17:38

4 Answers 4

30

I am not sure that I understand what you mean by "collect" data. If you are referring to heads-up digitizing and assignment of classes, this is best done in a GIS. There are many free options that would be suitable (i..e, QGIS, GRASS). Ideally you would have field data to train your classification.

The procedure for classification using Random Forests is fairly straight forward. You can read in your training data (i.e., a point shapefile) using "rgdal" or "maptools", read in your spectral data using raster::stack, assign the raster values to your training points using raster:extract and then pass this to randomForest. You will need to coerce your "class" column into a factor to have RF recognize the model as a classification instance. Once you have a fit model you can use the predict function, passing it you raster stack. You will need to pass the standard arguments to predict in addition to ones specific to the raster predict function. The raster package has the ability to handle rasters "out of memory" and as such is memory safe, even with very large rasters. One of the arguments in the raster predict function is "filename" allowing for a raster to written to disk. For a multiclass problem you will need to set type="response" and index=1 which will output an integer raster of your classes.

There are a few caveats that should be noted:

  1. You cannot have more than 32 levels in your response variable (y) or any factor on the right side of the equation (x)
  2. Your classes must be balanced. A 30% rule is a good one to follow, that is if you have more than 30% more observations on one class than any other your problem becomes imbalanced and the results can be biased
  3. It is a misnomer that RF cannot overfit. If you over correlate your ensemble you can overfit the model. A good way to avoid this is to run a preliminary model and plot the error stabilization. As a rule of thumb, I choose 2X the number of bootstraps required to stabilize the error for the ntree parameter. This is because variable interaction stabilizes at a slower rate than error. If you are not including many variables in the model you can be much more conservative with this parameter.
  4. Do not use node purity as a measure of variable importance. It is not permuted like the mean decrease in accuracy.

I have functions for model selection, class imbalance and validation in the rfUtilities package available on CRAN.

Here is some simple code to get you started.

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)
2
  • I have been seeing fairly good results using RF and predict() to identify canopy cover. However, I cannot seem to produce better results than with the ISODATA algorithm. I suspect my training samples are biased, or there is too much spectral overlap. Is there an unsupervised implementation of RF that may produce better results? Is it possible to assign the number of classes to the output, as you would the ISODATA algorithm?
    – Aaron
    Commented Nov 10, 2012 at 22:09
  • 4
    @Aaron, it is possible to run an unlabeled (unsupervised) RF but the results are difficult to deal with. I would suggest looking at the RF imputation method available in the YaImpute package. This may deal with some of the bias/imbalance issues that you are encountering. Commented Nov 12, 2012 at 18:55
7

I know that this thread is a little old, but for anyone wanting to try classification of remote sensing data in R, a very promising new package has been released.

install.packages("RSToolbox")

It comes with functions for both unsupervised and supervised classification (using random forests). More information can be found here - http://bleutner.github.io/RStoolbox/

2
  • This looks very promising, thanks for your work on this package. One clarification, are you specifying random forests through caret? If so, you should make this VERY clear in the documentation. The caret package uses a different node splitting statistic than the original Breiman (2001) definition. The statistic follows Strobl et al., (2007) and where the proposed statistic may be valid I have never bought her simulation conditions. Additionally, the observed bias is based on variation in factorial levels. I prefer the original entropy statistic and as such do not use caret. Commented Dec 4, 2015 at 17:05
  • Hi Jeffrey, afraid that I'm not the author of the package. His details can be found at the link I provided.
    – JPD
    Commented Dec 8, 2015 at 10:57
2

Here and here are tutorials on supervised classification / regression with R, which includes a RandomForest examples.

0

Since the problem here was with classifying an high resolution CIR image, I suggest not to use the traditional approach (pixel based) used for satellite data, but to produce a segmentation analysis of the aerial image and then using the classier (RF).

2
  • 3
    Where this is a quite valid approach one must not make the assumption that an aggregation based classification meets the needs of the user. Segmentation should not be applied just to address computational tractability but, rather to meet specific analytical goals. This is not a cart blanch method that automatically supersedes pixel-based methods. One must balance the loss of information, due to statistical/spatial smoothing, against the intended outcome. If you are interested in the spatial variation segmentation may remove it. Results can also be highly dependent on segmentation parameters. Commented Oct 23, 2019 at 15:25
  • I totally agree with you, indeed each method should be oriented to specific goals. This is why I suggested that with high resolution CIR images (that probably have limited spectral bands) a GEOBIA set of variables that include ancillary data, or texture values, could significantly improve the classification final accuracy especially when coupled with classifiers like RF.
    – vincent
    Commented Oct 25, 2019 at 15:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.