32
社区成员




机器学习类函数算子
AI Earth在用户访谈中收到了多位用户反馈,希望平台能提供机器学习相关算子能力。我们快速规划和研发,近期上线了20多类与机器学习相关的函数算子,包括常用的分类器,如随机森林、支持向量机、贝叶斯等,同时上线对分类模型精度进行评价的混淆矩阵。
/函数列表/
函数名称 |
函数用途 |
aie.Classifier.linearsvm |
创建线性支持向量机分类器 |
aie.Classifier.decisionTree |
创建决策树分类器 |
aie.Classifer.cart |
创建CART分类器 |
aie.Classifer.randomForest |
创建随机森林分类器 |
aie.Classifier.gradientTreeBoost |
创建梯度提升树分类器 |
aie.Classifier.AdaBoost |
创建自适应集成分类器 |
aie.Classifer.naiveBayes |
创建贝叶斯分类器 |
aie.Classifer.train |
利用样本数据对分类器进行训练 |
aie.Classifier.confusionMatrix |
基于已经训练好的分类器,对训练样本进行再预测,获取真实结果与预测结果的混淆矩阵 |
aie.Image.classify |
对影像进行分类 |
aie.FeatureCollection.classify |
对FeatureCollection进行分类 |
aie.ConfusionMatrix |
构建混淆矩阵 |
aie.ConfusionMatrix.accuracy |
计算混淆矩阵的准确率 |
aie.ConfusionMatrix.consumersAccuracy |
计算混淆矩阵每一类别的查全率 |
aie.ConfusionMatrix.fscore |
计算混淆矩阵每一类别的F度量 |
aie.ConfusionMatrix.kappa |
计算混淆矩阵的kappa系数 |
aie.ConfusionMatrix.producersAccuracy |
计算混淆矩阵每一类别的查准率 |
aie.FeatureCollection.errorMatrix |
基于FeatureCollection中指定的两列属性构建混淆矩阵 |
aie.Image.sample |
从影像中获取样本点,每一个样本点将包含对应坐标点下所有波段的像元值 |
/应用案例/
平台的案例广场中提供了进行地表覆盖监督分类的应用案例,我们利用ESA地表覆盖数据作为随机采样的训练样本真值标签,对单景Sentinel-2A影像采用自适应集成分类器(aie.Classifier.adaBoost)进行地物覆盖的分类,并利用混淆矩阵进行分类精度的分析。
欢迎平台用户进行相关体验与测试。
附案例代码
利用ESA地表覆盖数据,作为训练样本的地物真值标签。
# 指定研究区域
roi = aie.Geometry.BBox(119.8679, 29.7058, 121.0332, 30.7178)
# 使用ESA地表覆盖分类作为标签类别, 并将其裁剪到研究区
lc = aie.ImageCollection('ESA_WORLD_COVER_V100').filterBounds(roi).mosaic().clip(roi)
# 将ESA地表覆盖分类值重新映射到[0, 10]
class_values = [10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 100]
remap_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
label = 'lc'
lc_remap = lc.remap(class_values, remap_values).rename([label])
# 选取一景S2A影像的地表辐射波段, 作为训练和预测示例
img = aie.Image('S2A_MSIL2A_20220103T024121_N0301_R089_T51RTP_20220103T050347').select('B.*')
# 指定获取样本的范围, 如果样本范围过大, 同时采样分辨率过高的话, 将导致sample函数运行时间过长
sample_roi = aie.Geometry.BBox(120.1730, 30.1086, 120.3846, 30.2862)
# 指定在10m分辨率下获取1000个样本点, 由于sample函数无法保证各类别样本数量均衡, 因此可自行上传训练样本
samples = img.addBands(lc_remap).sample(sample_roi, 10, 1000)
# 在训练样本中增加一列随机数, 选取80%的样本为训练样本, 选取20%的样本为验证样本
sample = samples.randomColumn()
training_sample = sample.filter(aie.Filter.lte('random', 0.8))
validation_sample = sample.filter(aie.Filter.gt('random', 0.8))
创建分类器,并利用随机获取的样本进行训练,同时利用混淆矩阵进行精度评估。
# 创建自适应集成分类器,并进行训练
trained_classifier = aie.Classifier.adaBoost(10).train(training_sample, label, img.bandNames().getInfo())
# 训练集混淆矩阵包含的类别,对应class_values中的类别为[10, 30, 40, 50, 60, 70]
train_accuracy = trained_classifier.confusionMatrix()
print('Training error matrix:', train_accuracy.getInfo())
print('Training overall accuracy:', train_accuracy.accuracy().getInfo())
# 使用验证集对分类器进行评估
validation = validation_sample.classify(trained_classifier)
# 验证集混淆矩阵包含的类别,对应class_values中的类别为[10, 40, 50, 60, 70]
validation_accuracy = validation.errorMatrix(label, 'classification')
print('Validation error matrix:', validation_accuracy.getInfo())
print('Validation accuracy:', validation_accuracy.accuracy().getInfo())
对Sentinel-2影像进行分类,并将结果可视化
# 使用训练好的分类器对影像进行分类
img_classified = img.classify(trained_classifier)
color = ['#006400' ,'#ffbb22', '#ffff4c', '#f096ff', '#fa0000', '#b4b4b4',
'#f0f0f0', '#0064c8', '#0096a0', '#00cf75', '#fae6a0']
map = aie.Map(
center=roi.getCenter(),
height=800,
zoom=9
)
# 待分类影像真彩色图层
map.addLayer(
img,
{
'bands': ['B4', 'B3', 'B2'],
'min': 200,
'max': 1800
},
'True Color (432)',
bounds=roi.getBounds()
)
# 自适应集成分类图层
map.addLayer(
img_classified,
{
'bands': 'classification',
'min': 0,
'max': 10,
'palette': color
},
'aie_classification',
bounds=roi.getBounds()
)
map