Shaun Levick GEARS - Geospatial Ecology and Remote Sensing lab -

Introduction to Remote Sensing of the Environment

Lab 7 - Classification validation and accuracy assessment


  • Google Earth Engine Team
  • Google Earth Engine Developers group


Completion of this lab exercise requires use of the Google Chrome browser and a Google Earth Engine account. If you have not yet signed up - please do so now in a new tab:

Earth Engine account registration

Once registered you can access the Earth Engine environment here:

This lab follows on from others in this series (Introduction to Remote Sensing Labs 1-6).


The objective of this lab is to learn how to evaluate image classification results and conduct an accuracy assessment using independent validation data.

Recap - loading an image

  1. For a given region of interest (roi - defined by a point geometry), filter the Landsat-8 image collection for a date range and extract a cloud free image (image).
var image = ee.Image(ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
    .filterDate('2016-05-01', '2016-06-30')
  1. Load a true-colour composite to the map view
Map.addLayer(image, {bands: ['B4', 'B3', 'B2'],min:0, max: 3000}, 'True colour image');

Recap - supervised classification

  1. Use the rectangle geometry tool to collect training data for four different landcover types (eg. tWater, tCity, tForest, tOther). Remember to change the Import type to FeatureCollection, and add a common property such as 'landcover' with an integer label starting at 0. Ensure that your total sampled area is less than 5000 pixels.

  2. Merge your training data

//Merge into one FeatureCollection and print details to consloe
var classNames = tWater.merge(tCity).merge(tForest).merge(tOther);
  1. Sample the bands within your training data polygons
//Extract training data from select bands of the image, print to console
var bands = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7'];
var training ={
  collection: classNames,
  properties: ['landcover'],
  scale: 30
  1. Train the classifier
//Train classifier - e.g. cart, randomForest, svm
var classifier = ee.Classifier.cart().train({
  features: training,
  classProperty: 'landcover',
  inputProperties: bands
  1. Classify the input image
//Run the classification
var classified =;
  1. Add the classified map to the map view
//Centre the map on your training data coverage
Map.centerObject(classNames, 11);
//Add the classification to the map view, specify colours for classes
{min: 0, max: 3, palette: ['blue', 'red', 'green','yellow']},

Classification validation

  1. Collect validation data using the rectangle polygon geometry tool:
  2. do this in the same way you collected training data
  3. use the same property names and labels
  4. do not overlap the training data
  5. do not exceed 5000 pixels
  6. collect examples of the same four classes but call them differently (vWater, vCity, vForest, vOther)

  7. Merge your validation polygons into one Feature Collection

//Merge into one FeatureCollection
var valNames = vWater.merge(vCity).merge(vForest).merge(vOther);
  1. Sample your classification results to your new validation areas
var validation = classified.sampleRegions({
  collection: valNames,
  properties: ['landcover'],
  scale: 30,
  1. Run the validation assessment using the error matrix approach
//Compare the landcover of your validation data against the classification result
var testAccuracy = validation.errorMatrix('landcover', 'classification');
//Print the error matrix to the console
print('Validation error matrix: ', testAccuracy);
//Print the overall accuracy to the console
print('Validation overall accuracy: ', testAccuracy.accuracy());
  1. Export your error matrix for further analysis to calculate individual class accuracies and User's and Producer's accuracy.

Thank you

I hope you found that useful. A recorded video of this tutorial can be found on my YouTube Channel's Introduction to Remote Sensing of the Environment Playlist and on my lab website GEARS.

Kind regards, Shaun R Levick