对两个FeatureCollection执行准确性评估

时间:2020-08-26 16:32:16

标签: google-earth-engine

我想对包含湖为多边形的两个FeatureCollection执行二进制精度评估(ErrorMatrix)。一个集合包含分类的结果(需要将栅格转换为矢量以计算区域大小并删除较小的对象),而另一个集合则包含代表现实的验证数据。多边形代表具有土地覆盖1作为属性的湖泊。如何合并两个集合以具有执行ErrorMatrix()所需的特定列?我尝试使用此处描述的方法 https://developers.google.com/earth-engine/guides/joins_spatial 但似乎不适用于ErrorMatrix()。可能还有其他方法可以为两个FeatureCollection创建混淆矩阵吗?

1 个答案:

答案 0 :(得分:0)

我发现了以下解决方案:我可以使用ROC分析的方法来计算正确和错误的分类区域。这是我的功能:

var validateLakes = function(classified, truth){
  //clip classified lakes to sampleareas
  classified = classified.filterBounds(sampleareas);
  
  //convert required FeatureCollections to single multipolygon Feature
  var classified_union = ee.Feature(classified.union().first());
  truth = ee.Feature(truth.union().first());
  var area = ee.Feature(sampleareas.union().first());
  
  //calculate tp, tf, fp & fn areas
  var tp = classified_union.intersection(truth);
  var tn = area.difference(classified_union.union(truth));
  var fp = classified_union.difference(truth);
  var fn = truth.difference(classified_union);
  
  /*
  //check results
  Map.addLayer(tp, {palette: 'FF0000'}, 'tp');
  Map.addLayer(tn, {palette: 'FF0000'}, 'tn');
  Map.addLayer(fp, {palette: 'FF0000'}, 'fp');
  Map.addLayer(fn, {palette: 'FF0000'}, 'fn');
  */
  
  //calculate size of areas
  var tp_area = ee.Number(tp.area());
  var tn_area = ee.Number(tn.area());
  var fp_area = ee.Number(fp.area());
  var fn_area = ee.Number(fn.area());
  
  //calculate tpr, fdr and accuracy
  //tpr = tp / (tp + fn)
  var tpr = tp_area.divide(tp_area.add(fn_area));
  //fdr = tp / (fp + tp)
  var fdr = fp_area.divide(fp_area.add(tp_area));
  //accuracy = (tp + tn) / (tp + tn + fp + fn)
  var numerator = tp_area.add(tn_area);
  var denominator = tp_area.add(tn_area.add(fp_area.add(fn_area)));
  var accuracy = numerator.divide(denominator);

  //function for adding values to classfied FeatureCollection
  var addProps = function(feature){
    feature = feature.set('TPR', tpr);
    feature = feature.set('FDR', fdr);
    feature = feature.set('ACCURACY', accuracy);
    return feature;
  };

  //return classified Collection with new properties
  return classified.map(addProps);
};
相关问题