今天讲讲如何在GEE中做最后的精度评价。主要是因为在和许多读者或通过交流群,或通过私聊沟通过程中,发现很多人还不是很理解在GEE中分类后精度评价的问题。
在进行评价之前,需要明晰在GEE中精度评价分为哪几种情况。我们这里说的是两种情况。
第一种,构建好了分类模型后,将分类模型应用于验证样本集,然后计算混淆矩阵;
第二种,没有分类模型,只有分类结果图,那么应该是将分类结果图应用于样本集,最后计算混淆矩阵。
对于第一种情况,由于官方给出了有关代码,所以大家都比较好理解,也正是这么做的,具体参见下图。(参见代码:https://code.earthengine.google.com/e145a3f0e88cc272c6541f4514bb3093)
对于第二种情况,则有很多人不理解,或者还没有完全掌握。举个例子,下面有一张水体分类图和验证样本,需要计算水体精度,该如何做呢?其实也是可以做的,最后的结果见下图:
那么两种方法的区别或者一致性是什么呢?这地方有个概念需要理解清楚,即精度评价针对的是测试样本本身,而不是模型。也就是说,对于测试样本集,我们已经构建好了标签信息,那么接下来要做的只是找到每个样本对应的分类标记就行。而分类标签的获取,可以是来源于模型,而更多的应该是直接来源于分类图结果。
那么,对应到GEE中,测试样本集最后会是一个FeatureCollection类,在FeatureCollection类中可以计算混淆矩阵等指标,其输入只需要两个不同的字段(比如样本的属性字段“class”和分类结果图字段“classification”)。那么,如何获取这两个字段,以及成功获取这两个字段,就可以计算精度。
对应于第一种情况,因为模型已经构建好了,当然可以用于分类每个样本的分类属性,所以可以构建这两个字段以及计算混淆矩阵的,也就是直接使用:
对应于第二种情况,由于没有模型而只有分类结果图,所以需要做的就是获取测试样本集对应位置的分类结果,那么在GEE中自然想到sampleRegions函数,或者类似于能够替换sampleRegions的函数,效果如下图:
那么,第二种方式较第一种方式有什么好处呢?
1)第二种方式使用范围更广泛,本质上更好,因为不再设计推理的过程;
2)第二种方案非常适合在分块情况下的精度评价。我们知道分块后,每一块的测试样本集都是不同的,但是又需要给出一个总的整体的精度评价,那么此时需要将每一块内的测试样本集整合起来,最后利用全局分类图进行评价,那么此时就需要使用我们今天介绍的方法了。
今天的水体精度评价代码如下,大家有需要的自取:
https://code.earthengine.google.com/6d2ed19fb3917832c8883ad8ab0d77e6
var imgData = waterImg.rename('waterImg');
Map.addLayer(imgData,{'min':0,'max':1,'palette':["f1f1f1","2010ff"]},"2018-01水體分佈圖")
var sampleSet = ee.FeatureCollection([waterPoint,nonWaterPoint]).flatten();
var imageSamp = imgData.sampleRegions({
"collection": sampleSet,
"scale": 10,
'properties':['class']
// geometries: true
});
print(imageSamp)
var confusionMatrix = imageSamp.errorMatrix('waterImg', 'class');//计算混淆矩阵
print('confusionMatrix',confusionMatrix);//面板上显示混淆矩阵
print('overall accuracy', confusionMatrix.accuracy());//面板上显示总体精度
print('kappa accuracy', confusionMatrix.kappa());//面板上显示kappa值