Link Search Menu Expand Document

Tutorial 14

Classification Accuracy Assessment

//training and reference data
var Veg_train = 
/* color: #d63000 */
/* shown: false */
ee.FeatureCollection(
[ee.Feature(
ee.Geometry.Point([-76.04514190514682, 43.05125390556197]),
{
"class": 1,
"system:index": "0"
}),
ee.Feature(
ee.Geometry.Point([-76.04497024376987, 43.055267867190885]),
{
"class": 1,
"system:index": "1"
}),
ee.Feature(
ee.Geometry.Point([-76.03844711144565, 43.05551873106963]),
{
"class": 1,
"system:index": "2"
}),
ee.Feature(
ee.Geometry.Point([-76.0386187728226, 43.05175566513292]),
{
"class": 1,
"system:index": "3"
}),
ee.Feature(
ee.Geometry.Point([-76.03655883629916, 43.04849415454599]),
{
"class": 1,
"system:index": "4"
}),
ee.Feature(
ee.Geometry.Point([-76.03261062462924, 43.047866921088364]),
{
"class": 1,
"system:index": "5"
}),
ee.Feature(
ee.Geometry.Point([-76.03072234948276, 43.04560882753369]),
{
"class": 1,
"system:index": "6"
}),
ee.Feature(
ee.Geometry.Point([-76.03587219079135, 43.05689846405862]),
{
"class": 1,
"system:index": "7"
}),
ee.Feature(
ee.Geometry.Point([-76.03724548180698, 43.03971230247596]),
{
"class": 1,
"system:index": "8"
}),
ee.Feature(
ee.Geometry.Point([-76.03947707970737, 43.03971230247596]),
{
"class": 1,
"system:index": "9"
}),
ee.Feature(
ee.Geometry.Point([-76.0411936934769, 43.03921044438776]),
{
"class": 1,
"system:index": "10"
}),
ee.Feature(
ee.Geometry.Point([-76.08359405358432, 43.03657562208008]),
{
"class": 1,
"system:index": "11"
}),
ee.Feature(
ee.Geometry.Point([-76.08496734459995, 43.03594826675961]),
{
"class": 1,
"system:index": "12"
}),
ee.Feature(
ee.Geometry.Point([-76.0851390059769, 43.035697322835595]),
{
"class": 1,
"system:index": "13"
}),
ee.Feature(
ee.Geometry.Point([-76.08651229699252, 43.03444258782248]),
{
"class": 1,
"system:index": "14"
})]),
Nonveg_train = 
/* color: #98ff00 */
/* shown: false */
ee.FeatureCollection(
[ee.Feature(
ee.Geometry.Point([-76.05990478356479, 43.05426440141344]),
{
"class": 0,
"system:index": "0"
}),
ee.Feature(
ee.Geometry.Point([-76.06179305871127, 43.054766136354665]),
{
"class": 0,
"system:index": "1"
}),
ee.Feature(
ee.Geometry.Point([-76.0660845931351, 43.04736512970422]),
{
"class": 0,
"system:index": "2"
}),
ee.Feature(
ee.Geometry.Point([-76.06814452965854, 43.04736512970422]),
{
"class": 0,
"system:index": "3"
}),
ee.Feature(
ee.Geometry.Point([-76.06797286828159, 43.0454833754545]),
{
"class": 0,
"system:index": "4"
}),
ee.Feature(
ee.Geometry.Point([-76.06711456139682, 43.04435429519665]),
{
"class": 0,
"system:index": "5"
}),
ee.Feature(
ee.Geometry.Point([-76.06539794762729, 43.04661243493134]),
{
"class": 0,
"system:index": "6"
}),
ee.Feature(
ee.Geometry.Point([-76.06144973595737, 43.04698878347229]),
{
"class": 0,
"system:index": "7"
}),
ee.Feature(
ee.Geometry.Point([-76.06265136559604, 43.04861960046784]),
{
"class": 0,
"system:index": "8"
}),
ee.Feature(
ee.Geometry.Point([-76.05904647668002, 43.0491213815897]),
{
"class": 0,
"system:index": "9"
}),
ee.Feature(
ee.Geometry.Point([-76.05904647668002, 43.0471142324728]),
{
"class": 0,
"system:index": "10"
}),
ee.Feature(
ee.Geometry.Point([-76.06093475182651, 43.04096692973783]),
{
"class": 0,
"system:index": "11"
}),
ee.Feature(
ee.Geometry.Point([-76.06368133385776, 43.04084146816613]),
{
"class": 0,
"system:index": "12"
}),
ee.Feature(
ee.Geometry.Point([-76.06505462487338, 43.04096692973783]),
{
"class": 0,
"system:index": "13"
}),
ee.Feature(
ee.Geometry.Point([-76.06505462487338, 43.03783031347974]),
{
"class": 0,
"system:index": "14"
}),
ee.Feature(
ee.Geometry.Point([-76.0660845931351, 43.04071600633788]),
{
"class": 0,
"system:index": "15"
})]),
Veg_ref = 
/* color: #d63000 */
/* shown: false */
ee.FeatureCollection(
[ee.Feature(
ee.Geometry.Point([-76.09406539757846, 43.07783602424947]),
{
"class": 1,
"system:index": "0"
}),
ee.Feature(
ee.Geometry.Point([-76.0657412703812, 43.07457590088022]),
{
"class": 1,
"system:index": "1"
}),
ee.Feature(
ee.Geometry.Point([-76.05012008507846, 43.072569584905914]),
{
"class": 1,
"system:index": "2"
}),
ee.Feature(
ee.Geometry.Point([-76.04024955590366, 43.07946602089242]),
{
"class": 1,
"system:index": "3"
}),
ee.Feature(
ee.Geometry.Point([-76.03415557702182, 43.08028100295342]),
{
"class": 1,
"system:index": "4"
}),
ee.Feature(
ee.Geometry.Point([-76.02685996850131, 43.07927794656967]),
{
"class": 1,
"system:index": "5"
}),
ee.Feature(
ee.Geometry.Point([-76.0258300002396, 43.075140165413586]),
{
"class": 1,
"system:index": "6"
}),
ee.Feature(
ee.Geometry.Point([-76.03801795800327, 43.053631742956306]),
{
"class": 1,
"system:index": "7"
}),
ee.Feature(
ee.Geometry.Point([-76.03776046593784, 43.05005672580145]),
{
"class": 1,
"system:index": "8"
}),
ee.Feature(
ee.Geometry.Point([-76.02891990502475, 43.04422335570265]),
{
"class": 1,
"system:index": "9"
}),
ee.Feature(
ee.Geometry.Point([-76.02694579918979, 43.041714208706864]),
{
"class": 1,
"system:index": "10"
}),
ee.Feature(
ee.Geometry.Point([-76.04000347288769, 43.02237422020493]),
{
"class": 1,
"system:index": "11"
}),
ee.Feature(
ee.Geometry.Point([-76.05107563170117, 43.03780871272813]),
{
"class": 1,
"system:index": "12"
}),
ee.Feature(
ee.Geometry.Point([-76.09759586485546, 43.02064857842661]),
{
"class": 1,
"system:index": "13"
}),
ee.Feature(
ee.Geometry.Point([-76.09467762144726, 43.07134652229262]),
{
"class": 1,
"system:index": "14"
}),
ee.Feature(
ee.Geometry.Point([-76.09476345213574, 43.070061165954534]),
{
"class": 1,
"system:index": "15"
}),
ee.Feature(
ee.Geometry.Point([-76.09401243361157, 43.068579837717465]),
{
"class": 1,
"system:index": "16"
}),
ee.Feature(
ee.Geometry.Point([-76.0787519342753, 43.07383043858551]),
{
"class": 1,
"system:index": "17"
}),
ee.Feature(
ee.Geometry.Point([-76.06778706382242, 43.07880267336359]),
{
"class": 1,
"system:index": "18"
}),
ee.Feature(
ee.Geometry.Point([-76.08239256074542, 43.0501271677672]),
{
"class": 1,
"system:index": "19"
}),
ee.Feature(
ee.Geometry.Point([-76.09725058950181, 43.045938314737064]),
{
"class": 1,
"system:index": "20"
}),
ee.Feature(
ee.Geometry.Point([-76.08845294393296, 43.04444856273223]),
{
"class": 1,
"system:index": "21"
}),
ee.Feature(
ee.Geometry.Point([-76.08362496770616, 43.04255103674085]),
{
"class": 1,
"system:index": "22"
}),
ee.Feature(
ee.Geometry.Point([-76.08624280370469, 43.03966543018874]),
{
"class": 1,
"system:index": "23"
}),
ee.Feature(
ee.Geometry.Point([-76.07321799672837, 43.04891771021154]),
{
"class": 1,
"system:index": "24"
}),
ee.Feature(
ee.Geometry.Point([-76.06090129293199, 43.05111682723199]),
{
"class": 1,
"system:index": "25"
}),
ee.Feature(
ee.Geometry.Point([-76.06004298604722, 43.04903134036844]),
{
"class": 1,
"system:index": "26"
}),
ee.Feature(
ee.Geometry.Point([-76.04252627538351, 43.05486425324112]),
{
"class": 1,
"system:index": "27"
}),
ee.Feature(
ee.Geometry.Point([-76.04641011403707, 43.05821949477304]),
{
"class": 1,
"system:index": "28"
}),
ee.Feature(
ee.Geometry.Point([-76.03003791021017, 43.05836059903895]),
{
"class": 1,
"system:index": "29"
}),
ee.Feature(
ee.Geometry.Point([-76.02460911916403, 43.05593042465551]),
{
"class": 1,
"system:index": "30"
}),
ee.Feature(
ee.Geometry.Point([-76.05509721048637, 43.05965284845331]),
{
"class": 1,
"system:index": "31"
}),
ee.Feature(
ee.Geometry.Point([-76.03535615213676, 43.06590017461507]),
{
"class": 1,
"system:index": "32"
}),
ee.Feature(
ee.Geometry.Point([-76.03501282938285, 43.066589928188925]),
{
"class": 1,
"system:index": "33"
}),
ee.Feature(
ee.Geometry.Point([-76.03959165372979, 43.076122876383316]),
{
"class": 1,
"system:index": "34"
}),
ee.Feature(
ee.Geometry.Point([-76.02681360998284, 43.05348296438648]),
{
"class": 1,
"system:index": "35"
}),
ee.Feature(
ee.Geometry.Point([-76.03054724493157, 43.05195419595017]),
{
"class": 1,
"system:index": "36"
}),
ee.Feature(
ee.Geometry.Point([-76.02434597768914, 43.052016915404884]),
{
"class": 1,
"system:index": "37"
}),
ee.Feature(
ee.Geometry.Point([-76.08907589365865, 43.023650032399374]),
{
"class": 1,
"system:index": "38"
}),
ee.Feature(
ee.Geometry.Point([-76.09581360270406, 43.0213047652475]),
{
"class": 1,
"system:index": "39"
}),
ee.Feature(
ee.Geometry.Point([-76.09559902598286, 43.02091257136163]),
{
"class": 1,
"system:index": "40"
}),
ee.Feature(
ee.Geometry.Point([-76.09415063311482, 43.022151895491]),
{
"class": 1,
"system:index": "41"
}),
ee.Feature(
ee.Geometry.Point([-76.09244474818135, 43.03495939398064]),
{
"class": 1,
"system:index": "42"
}),
ee.Feature(
ee.Geometry.Point([-76.08536371638203, 43.03495939398064]),
{
"class": 1,
"system:index": "43"
}),
ee.Feature(
ee.Geometry.Point([-76.08132967402364, 43.031791100581664]),
{
"class": 1,
"system:index": "44"
}),
ee.Feature(
ee.Geometry.Point([-76.08031321084692, 43.03031669046074]),
{
"class": 1,
"system:index": "45"
}),
ee.Feature(
ee.Geometry.Point([-76.06658746058979, 43.02712462806046]),
{
"class": 1,
"system:index": "46"
}),
ee.Feature(
ee.Geometry.Point([-76.06498886401691, 43.02497557855119]),
{
"class": 1,
"system:index": "47"
}),
ee.Feature(
ee.Geometry.Point([-76.07301403338947, 43.026732471353135]),
{
"class": 1,
"system:index": "48"
}),
ee.Feature(
ee.Geometry.Point([-76.09548808382776, 43.039515017431434]),
{
"class": 1,
"system:index": "49"
}),
ee.Feature(
ee.Geometry.Point([-76.03965150681678, 43.02948753096473]),
{
"class": 1,
"system:index": "50"
}),
ee.Feature(
ee.Geometry.Point([-76.03870736924354, 43.030710996690146]),
{
"class": 1,
"system:index": "51"
}),
ee.Feature(
ee.Geometry.Point([-76.02849351731483, 43.023056092166414]),
{
"class": 1,
"system:index": "52"
}),
ee.Feature(
ee.Geometry.Point([-76.0266696151847, 43.024758136046856]),
{
"class": 1,
"system:index": "53"
}),
ee.Feature(
ee.Geometry.Point([-76.02905141678993, 43.030405132545155]),
{
"class": 1,
"system:index": "54"
}),
ee.Feature(
ee.Geometry.Point([-76.04223217357203, 43.05993723050989]),
{
"class": 1,
"system:index": "55"
}),
ee.Feature(
ee.Geometry.Point([-76.0506006656985, 43.05938850398384]),
{
"class": 1,
"system:index": "56"
}),
ee.Feature(
ee.Geometry.Point([-76.07999168820805, 43.05681360028655]),
{
"class": 1,
"system:index": "57"
}),
ee.Feature(
ee.Geometry.Point([-76.07741676755376, 43.065404887199506]),
{
"class": 1,
"system:index": "58"
}),
ee.Feature(
ee.Geometry.Point([-76.06967369630084, 43.06667677672224]),
{
"class": 1,
"system:index": "59"
}),
ee.Feature(
ee.Geometry.Point([-76.06925527169452, 43.06793085246842]),
{
"class": 1,
"system:index": "60"
}),
ee.Feature(
ee.Geometry.Point([-76.04170649747584, 43.04101430352014]),
{
"class": 1,
"system:index": "61"
}),
ee.Feature(
ee.Geometry.Point([-76.03741496305202, 43.036975883529706]),
{
"class": 1,
"system:index": "62"
}),
ee.Feature(
ee.Geometry.Point([-76.04492514829371, 43.03604269625203]),
{
"class": 1,
"system:index": "63"
})]),
Nonveg_ref = 
/* color: #98ff00 */
/* shown: false */
ee.FeatureCollection(
[ee.Feature(
ee.Geometry.Point([-76.07216645534076, 43.02715600048884]),
{
"class": 0,
"system:index": "0"
}),
ee.Feature(
ee.Geometry.Point([-76.06603018689982, 43.03221489976662]),
{
"class": 0,
"system:index": "1"
}),
ee.Feature(
ee.Geometry.Point([-76.06517912195947, 43.03656653290082]),
{
"class": 0,
"system:index": "2"
}),
ee.Feature(
ee.Geometry.Point([-76.0594391946676, 43.041169557060904]),
{
"class": 0,
"system:index": "3"
}),
ee.Feature(
ee.Geometry.Point([-76.05645286408607, 43.03582419203311]),
{
"class": 0,
"system:index": "4"
}),
ee.Feature(
ee.Geometry.Point([-76.04896413651649, 43.02972281472902]),
{
"class": 0,
"system:index": "5"
}),
ee.Feature(
ee.Geometry.Point([-76.03898631898109, 43.025597375336105]),
{
"class": 0,
"system:index": "6"
}),
ee.Feature(
ee.Geometry.Point([-76.03836404648963, 43.029660072480056]),
{
"class": 0,
"system:index": "7"
}),
ee.Feature(
ee.Geometry.Point([-76.0240946945304, 43.02591894996725]),
{
"class": 0,
"system:index": "8"
}),
ee.Feature(
ee.Geometry.Point([-76.02186309663001, 43.03272652486166]),
{
"class": 0,
"system:index": "9"
}),
ee.Feature(
ee.Geometry.Point([-76.0459014355044, 43.06437389603531]),
{
"class": 0,
"system:index": "10"
}),
ee.Feature(
ee.Geometry.Point([-76.04613746989772, 43.057271941382346]),
{
"class": 0,
"system:index": "11"
}),
ee.Feature(
ee.Geometry.Point([-76.0439917026858, 43.06157554191788]),
{
"class": 0,
"system:index": "12"
}),
ee.Feature(
ee.Geometry.Point([-76.0313853203158, 43.07093424228687]),
{
"class": 0,
"system:index": "13"
}),
ee.Feature(
ee.Geometry.Point([-76.030698674808, 43.07250172407926]),
{
"class": 0,
"system:index": "14"
}),
ee.Feature(
ee.Geometry.Point([-76.05327214587733, 43.077580089720236]),
{
"class": 0,
"system:index": "15"
}),
ee.Feature(
ee.Geometry.Point([-76.05919446338221, 43.079178747360174]),
{
"class": 0,
"system:index": "16"
}),
ee.Feature(
ee.Geometry.Point([-76.02820958484217, 43.07646727399676]),
{
"class": 0,
"system:index": "17"
}),
ee.Feature(
ee.Geometry.Point([-76.08338200040288, 43.07847763764557]),
{
"class": 0,
"system:index": "18"
}),
ee.Feature(
ee.Geometry.Point([-76.0913642544312, 43.07897917444083]),
{
"class": 0,
"system:index": "19"
}),
ee.Feature(
ee.Geometry.Point([-76.07754551358647, 43.07722377769723]),
{
"class": 0,
"system:index": "20"
}),
ee.Feature(
ee.Geometry.Point([-76.08775936551518, 43.066188703810475]),
{
"class": 0,
"system:index": "21"
}),
ee.Feature(
ee.Geometry.Point([-76.09076343961186, 43.06600058873785]),
{
"class": 0,
"system:index": "22"
}),
ee.Feature(
ee.Geometry.Point([-76.09453998990483, 43.06537353432659]),
{
"class": 0,
"system:index": "23"
}),
ee.Feature(
ee.Geometry.Point([-76.09874569364018, 43.05972975598804]),
{
"class": 0,
"system:index": "24"
}),
ee.Feature(
ee.Geometry.Point([-76.08192287869878, 43.06073313233101]),
{
"class": 0,
"system:index": "25"
}),
ee.Feature(
ee.Geometry.Point([-76.07814632840581, 43.05809923440977]),
{
"class": 0,
"system:index": "26"
}),
ee.Feature(
ee.Geometry.Point([-76.08260952420659, 43.05552793920827]),
{
"class": 0,
"system:index": "27"
}),
ee.Feature(
ee.Geometry.Point([-76.07123695798344, 43.05549658128428]),
{
"class": 0,
"system:index": "28"
}),
ee.Feature(
ee.Geometry.Point([-76.08651482053227, 43.05352099974482]),
{
"class": 0,
"system:index": "29"
}),
ee.Feature(
ee.Geometry.Point([-76.09968983121342, 43.0499146153562]),
{
"class": 0,
"system:index": "30"
}),
ee.Feature(
ee.Geometry.Point([-76.07071439339862, 43.066198653588536]),
{
"class": 0,
"system:index": "31"
}),
ee.Feature(
ee.Geometry.Point([-76.0686759145473, 43.068369772918125]),
{
"class": 0,
"system:index": "32"
}),
ee.Feature(
ee.Geometry.Point([-76.06911330919002, 43.04039875570085]),
{
"class": 0,
"system:index": "33"
}),
ee.Feature(
ee.Geometry.Point([-76.04546159009669, 43.038112941283536]),
{
"class": 0,
"system:index": "34"
})]);

// // /////////////////////////////////////////////////////////////////////////////////////////////
// // ////////////////////////////Supervised Classification //////////////////////////////////////
// // /////////////////////////////////////////////////////////////////////////////////////////////
// Determine a study area for further analysis
var studysite = ee.Geometry.Polygon(
[[[-76.1015, 43.0793],
[-76.0981, 43.0190],
[-76.0203, 43.0225],
[-76.0258, 43.0808]]]);

// Import all the available Landsat 5 images then filter by location and sort by cloud cover.
var L5filtered = ee.ImageCollection('LANDSAT/LT05/C01/T1_TOA')
.filterBounds(studysite) //filter to limit images to those over the study site
.sort('CLOUD_COVER'); //sort by cloud cover to obtain an ideal image for classification

// Select the first image (i.e. the scene with the least cloud cover) in the sorted collection above.
var input = ee.Image(L5filtered.first()) //first in sort on cloud cover is least cloudy
.clip(studysite); //clip the selected image scene to the study site

// Set map display to center on the study area at a zoom level of 13
Map.centerObject(studysite, 13);

// Display the input image as a color infrared composite. 
Map.addLayer(input, {bands: ['B4', 'B3', 'B2']}, 'input image');

/* Manually label training points as vegetation or non-vegetation. 
To do this you need to first create two new layers (under "Geometry Imports").  Click on the gear 
icon next to each layer name, renaming the layers as Veg_train and Nonveg_train, and change both to FeatureCollections. Once the layers are created, select one of the layers and then click on the 
point icon and each identify reference points that belong to the class. After all of the reference 
points are labeled click on the gear icon again and add a property for both Veg_ref and 
Nonveg_ref layers, which has name = class and value = 1 for veg or 0 for non-veg.
*/

// Combine the veg and non-veg layers into a reference dataset
var training = Veg_train.merge(Nonveg_train);

/* Use the training data to sample the classified image and create a new band called class that 
contains the corresponding value for each reference point based on the classified image.
*/
var training = input.sampleRegions({
collection: training,
properties: ['class'],
scale: 30
});

/* Create and train a random forest classifier. A random forest classifier uses a combination of decision tree classifiers where each is generated using a random vector sampled independently from the input vector. Each tree casts a unit vote for the most popular class to classify an input vector (Pal 2005). */
var classifier = ee.Classifier.randomForest(100) //set the number of trees in random forest to 100
.train(training, 'class'); //'nd' is 0 for non-vegetation and 1 for vegetation cover types.

// Classify the input imagery.
var classified = input.classify(classifier);

// Display classified image in the interactive map. Non-vegetation land cover has a pixel value of 0 and vegetation cover has a value of 1.
Map.addLayer(classified,{min:0,max:1},'classified image');  



///////////////////////////////////////////////////////////////////
// Determine a study area for further analysis
var studysite = ee.Geometry.Polygon(
[[[-76.1015, 43.0793],
[-76.0981, 43.0190],
[-76.0203, 43.0225],
[-76.0258, 43.0808]]]);

// Find and import a NAIP image taken around the same time when the input Landsat was taken.
var referenceimage = ee.ImageCollection('USDA/NAIP/DOQQ')
.filterBounds(studysite) //filter images by the previously defined study area
.filterDate('2011-01-01','2011-12-31'); //filter to match Landsat image date

// Display the filtered reference NAIP image.
Map.addLayer(referenceimage,"",'reference NAIP image');

// Produce 100 random sampling points for producing the reference points.
var referencep = ee.FeatureCollection.randomPoints(studysite,100,0);

// Display the reference points in red. 
Map.addLayer(referencep,{color:'red'},"reference points");

/* Manually label the reference points as vegetation or non-vegetation. 
To do this you need to first create two new layers (under "Geometry Imports").  Click on the gear icon next to each layer name, renaming the layers as Veg_ref and Nonveg_ref, and changing both to FeatureCollections. Once the layers are created, select one of the layers and then click on the point icon and each identify reference points that below to the class. After all of the reference points are labeled click on the gear icon again and add a property for both Veg_ref and Nonveg_ref layers, which has name = class and value = 1 for veg or 0 for non-veg.
*/

// Combine the veg and non-veg layers into a reference dataset
var reference = Veg_ref.merge(Nonveg_ref);

/* Use the reference data to sample the classified image and obtain a new band called classification that contains the corresponding value for each reference points based on the classified image.
*/
var validated = classified.sampleRegions({
collection: reference,
properties: ['class'],
scale: 30
});

// Generate and display a confusion matrix representing expected accuracy.
var testAccuracy = validated.errorMatrix('class', 'classification');
print('Validation error matrix: ', testAccuracy);
print('Validation overall accuracy: ', testAccuracy.accuracy()); //Display overall accuracy

//Note the accuracy is very low. What do you think contributes to this problem? How can you improve the classification accuracy?