机器学习类函数算子
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地表覆盖数据,作为训练样本的地物真值标签。
1. 2. # 指定研究区域 3. roi = aie.Geometry.BBox(119.8679, 29.7058, 121.0332, 30.7178) 4. 5. # 使用ESA地表覆盖分类作为标签类别, 并将其裁剪到研究区 6. lc = aie.ImageCollection('ESA_WORLD_COVER_V100').filterBounds(roi).mosaic().clip(roi) 7. 8. # 将ESA地表覆盖分类值重新映射到[0, 10] 9. class_values = [10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 100] 10. remap_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 11. label = 'lc' 12. lc_remap = lc.remap(class_values, remap_values).rename([label]) 13. 14. # 选取一景S2A影像的地表辐射波段, 作为训练和预测示例 15. img = aie.Image('S2A_MSIL2A_20220103T024121_N0301_R089_T51RTP_20220103T050347').select('B.*') 16. 17. # 指定获取样本的范围, 如果样本范围过大, 同时采样分辨率过高的话, 将导致sample函数运行时间过长 18. sample_roi = aie.Geometry.BBox(120.1730, 30.1086, 120.3846, 30.2862) 19. # 指定在10m分辨率下获取1000个样本点, 由于sample函数无法保证各类别样本数量均衡, 因此可自行上传训练样本 20. samples = img.addBands(lc_remap).sample(sample_roi, 10, 1000) 21. 22. # 在训练样本中增加一列随机数, 选取80%的样本为训练样本, 选取20%的样本为验证样本 23. sample = samples.randomColumn() 24. training_sample = sample.filter(aie.Filter.lte('random', 0.8)) 25. validation_sample = sample.filter(aie.Filter.gt('random', 0.8))
- 创建分类器,并利用随机获取的样本进行训练,同时利用混淆矩阵进行精度评估。
1. 2. # 创建自适应集成分类器,并进行训练 3. trained_classifier = aie.Classifier.adaBoost(10).train(training_sample, label, img.bandNames().getInfo()) 4. 5. # 训练集混淆矩阵包含的类别,对应class_values中的类别为[10, 30, 40, 50, 60, 70] 6. train_accuracy = trained_classifier.confusionMatrix() 7. print('Training error matrix:', train_accuracy.getInfo()) 8. print('Training overall accuracy:', train_accuracy.accuracy().getInfo()) 9. 10. # 使用验证集对分类器进行评估 11. validation = validation_sample.classify(trained_classifier) 12. # 验证集混淆矩阵包含的类别,对应class_values中的类别为[10, 40, 50, 60, 70] 13. validation_accuracy = validation.errorMatrix(label, 'classification') 14. print('Validation error matrix:', validation_accuracy.getInfo()) 15. print('Validation accuracy:', validation_accuracy.accuracy().getInfo())
- 对Sentinel-2影像进行分类,并将结果可视化
1. 2. # 使用训练好的分类器对影像进行分类 3. img_classified = img.classify(trained_classifier) 4. 5. color = ['#006400' ,'#ffbb22', '#ffff4c', '#f096ff', '#fa0000', '#b4b4b4', 6. '#f0f0f0', '#0064c8', '#0096a0', '#00cf75', '#fae6a0'] 7. map = aie.Map( 8. center=roi.getCenter(), 9. height=800, 10. zoom=9 11. ) 12. # 待分类影像真彩色图层 13. map.addLayer( 14. img, 15. { 16. 'bands': ['B4', 'B3', 'B2'], 17. 'min': 200, 18. 'max': 1800 19. }, 20. 'True Color (432)', 21. bounds=roi.getBounds() 22. ) 23. # 自适应集成分类图层 24. map.addLayer( 25. img_classified, 26. { 27. 'bands': 'classification', 28. 'min': 0, 29. 'max': 10, 30. 'palette': color 31. }, 32. 'aie_classification', 33. bounds=roi.getBounds() 34. ) 35. map