geemap学习笔记019:监督分类与精度验证(上)

前言

上一节中介绍了非监督分类,今天就详细介绍一下监督分类与精度验证。从这一节开始,我也是配置了本地的geemap,就可以不用colab了,配置也是花了挺长时间,但好在也是能够成功应用了,准备用两节的时间介绍监督分类与精度验证。GEE中的监督分类方法主要是包括以下几种,包括决策树、随机森林(RF)、贝叶斯、支持向量机(SVM)等。监督分类主要是包括以下几个步骤:(1)收集数据,包括待分类的影像数据以及标签数据;(2)划分训练集和测试集;(3)利用训练数据训练一个分类器;(3)对原有的数据进行分类;(4)精度验证。

geemap学习笔记019:监督分类与精度验证(上)_第1张图片

1 导入库并显示地图

import ee
import geemap 

ee.Initialize() #这一行代码实在本地代码中要添加的
Map = geemap.Map()
Map

2 添加数据

point = ee.Geometry.Point([-87.7719, 41.8799]) #初始化点坐标

image = (
    ee.ImageCollection('LANDSAT/LC08/C01/T1_SR') #Landsat 8数据
    .filterBounds(point) #过滤经过该点的影像
    .filterDate('2016-01-01', '2016-12-31') #与非监督不同的是,这里取了206年的数据,是为了与NLCD2016相对应
    .sort('CLOUD_COVER') #按照云量进行排序
    # .limit(10) #可以限制取前多少个
    .first() #选择第一景影像
    .select('B[1-7]') #选择1-7个波段
)

vis_params = {'min': 0, 'max': 3000, 'bands': ['B5', 'B4', 'B3']}

Map.centerObject(point, 8)
Map.addLayer(image, vis_params, "Landsat-8")

nlcd_raw = ee.Image('USGS/NLCD/NLCD2016').select('landcover').clip(image.geometry()) #加载NLCD数据,并根据影像范围进行裁剪
Map.addLayer(nlcd_raw, {}, 'NLCD')
Map

加载数据结果
geemap学习笔记019:监督分类与精度验证(上)_第2张图片

3 查看图像的属性

ee.Date(image.get('system:time_start')).format('YYYY-MM-dd').getInfo() #时间属性
image.get('CLOUD_COVER').getInfo() #云量属性

4 制作数据集

以NLCD数据创建标签
geemap学习笔记019:监督分类与精度验证(上)_第3张图片

4.1 准备连续的类别标签

在分类中,标签需要设定从0开始,使用 remap() 函数将类标签转换为连续的整数。

raw_class_values = nlcd_raw.get('landcover_class_values').getInfo() #获取原始数据的标签值
print(raw_class_values)

n_classes = len(raw_class_values)
new_class_values = list(range(0, n_classes)) #定义从0开始的标签
new_class_values

class_palette = nlcd_raw.get('landcover_class_palette').getInfo() #获取原始数据的颜色表
print(class_palette)

nlcd = nlcd_raw.remap(raw_class_values, new_class_values).select(
    ['remapped'], ['landcover']
) #将原始数据标签值改为新值
nlcd = nlcd.set('landcover_class_values', new_class_values)
nlcd = nlcd.set('landcover_class_palette', class_palette)

4.2 生成样本点数据集

#有多种方法可以创建用于生成训练数据集的区域
# region = Map.user_roi #可以在地图绘制ROI
# region = ee.Geometry.Rectangle([-122.6003, 37.4831, -121.8036, 37.8288]) #可以自定义矩形范围
# region = ee.Geometry.Point([-122.4439, 37.7538]).buffer(10000) #也可以创建缓冲区

# 生成样本点数据集
points = nlcd.sample(
    **{
        'region': image.geometry(),
        'scale': 30,
        'numPixels': 5000,
        'seed': 0,
        'geometries': True,  # Set this to False to ignore geometries
    }
)

Map.addLayer(points, {}, 'training', False)
Map

print(points.size().getInfo()) #打印样本点的属性
print(points.first().getInfo())

4.3 制作训练和测试数据集

# 利用这些波段用于训练和预测
bands = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7']


# 这个属性储存标签.
label = 'landcover'

# 将点叠加在图像上以获得训练
sample = image.select(bands).sampleRegions(
    **{'collection': points, 'properties': [label], 'scale': 30}
)

# 添加一列伪随机数
sample = sample.randomColumn()

split = 0.7 #划分比例

training = sample.filter(ee.Filter.lt('random', split)) #小于0.7划分为训练数据
validation = sample.filter(ee.Filter.gte('random', split)) #大于等于0.7划分为训练数据

print(training.first().getInfo()) #打印第一个点的信息

5 训练分类器

# 使用默认参数训练 CART 分类器
classifier = ee.Classifier.smileCart().train(training, label, bands)

后记

大家如果有问题需要交流或者有项目需要合作,可以加Q Q :504156006详聊,加好友请留言“CSDN”,谢谢。

你可能感兴趣的:(geemap,学习,笔记,分类)