Las clasificaciones supervisadas se realizan cuando se tienen definidas las clases y se dispone de información de casos correspondientes a esas clases (información de campo). Los distintos clasificadores se entrenan con la información de campo disponible a partir del comportamiento en las distintas bandas consideradas. La evaluación del resultado de una clasificación requiere disponer de datos independientes a los utilizados para el entrenamiento. Estos datos se suelen llamar de testing o validación.
Una de las primeras tareas a realizar para poder realizar la clasificación supervisada es separar el conjunto de datos para entrenamiento y validación. La plataforma permite generar atributos (llamado random en este caso) con números al azar mediante la función randomColumn y agregarlos al FeatureCollection que contiene el set de datos. La función genera valores entre 0 y 1; requiere indicar el FeatureCollection y un valor inicial (semilla) para generar los números al azar (seed):
// Separación de set de datos (polígonos) para entrenamiento y validación
// generación de atributo con números al azar (columna "random")
// para hacer muestreo
var seed = 2015;
puntos = puntos.randomColumn('random', seed);
print ('Puntos random',puntos)
Esto nos permitirá hacer un muestreo, seleccionando filas que contengan cierto rango de números generados al azar (mayores o menores a cierto valor umbral). Para entrenar el algoritmo de clasificación se requiere extraer información de las imágenes para los puntos seleccionados, incluyendo en las salidas los atributos clase y “random”:
// extracción de información incluyendo atributos clase y "random"
var set_datos = stack_completo.sampleRegions({
collection: puntos,
properties: ['clase','random'],
scale: 30
});
print (' set datos ',set_datos);
Posteriormente se subdivide el FeatureCollection con el set de datos en Entrenamiento (training) y Validación (testing). Se selecciona un umbral de separación de los valores al azar generados entre 0 y 1 (atributo random). En este caso, se seleccionan los valores mayores o iguales a 0.6 para entrenamiento y los menores a 0.6 para validación. Se pueden ver en consola los nuevos set de datos generados:
// Separación entre Entrenamiento y validación. Identificar umbral de separación
var training = set_datos.filterMetadata('random', 'not_less_than', 0.6);
var testing = set_datos.filterMetadata('random', 'less_than', 0.6);
print ("Set de datos entrenamiento", training);
print ("Set de datos validación", testing);
Aquí debemos seleccionar el algoritmo de clasificación, el set de datos de entrenamiento (training), el atributo de separación en clases (clase) y las bandas seleccionadas. En este caso usamos el algoritmo Random Forest:
// Entrenamiento
var bandas_sel = ['BLUE','GREEN','RED', 'NIR', 'SWIR1','SWIR2','NDVIL5','BLUE_1','GREEN_1','RED_1', 'NIR_1', 'SWIR1_1','SWIR2_1','NDVIL8'];
var trained = ee.Classifier.randomForest().train(training, 'clase', bandas_sel);
Una vez entrenado el modelo, se lo aplica a una imagen y se genera la clasificación. La misma también puede ser exportada a Geotiff o al Assest.
// clasificación con el modelo entrenado
var classified = stack_completo.select(bandas_sel).classify(trained).clip(area_estudio);
Map.addLayer(classified, {min:1, max:3, palette: ['d63000', '98ff00','0b4a8b']}, 'Clasificacion');
print(classified);
// Exportar imagen de clasificación
Export.image.toDrive({
image:classified,
description: 'clasificacion',
scale: 30,
region: area_estudio
});
La herramienta permite calcular la matriz de confusión, y estimar exactitud general, de usuario y de productor e índice Kappa.
// Generación de matriz de confusión y resultados
var validation = testing.classify(trained);
var errorMatrix = validation.errorMatrix('clase', 'classification');
print('Matriz de Confusión:', errorMatrix);
print('Exactitud General:', errorMatrix.accuracy());
print('Indice Kappa:', errorMatrix.kappa());
print('Exactitudes de Usuario:', errorMatrix.consumersAccuracy());
print('Exactitudes de Productor:', errorMatrix.producersAccuracy());
// exportar matriz de confusion como csv
var err = ee.FeatureCollection( ee.Feature(null, {
'matrix': errorMatrix.getInfo()
}));
print ('Err',err);
Export.table.toDrive({
'collection': err,
'description': 'CM_tutorial_2',
'fileNamePrefix': 'CM_tutorial_2',
'fileFormat': 'CSV'}
);