Bootstrap

中科星图(GVE)——使用随机森林方法进行土地分类

目录

简介

函数

gve.Classifier.smileRandomForest(numberOfTrees,variablesPerSplit,minLeafPopulation,bagFraction,maxNodes,seed)

代码

结果


简介

使用随机森林方法进行土地分类的步骤如下:

  1. 数据准备:收集所需的土地分类数据,并对数据进行预处理,包括缺失值处理、数据标准化等。

  2. 特征选择:根据土地特征的重要性选择合适的特征,可以使用特征选择算法如信息增益、方差选择等。

  3. 数据集划分:将数据集划分为训练集和测试集,通常采用70%的数据作为训练集、30%的数据作为测试集。

  4. 随机森林建模:使用训练集数据建立随机森林模型。随机森林是由多个决策树组成的集成学习模型,每个决策树通过对一部分有放回的样本进行训练而构建。

  5. 模型训练:通过训练集数据对随机森林模型进行训练,即对每个决策树进行单独的训练。

  6. 模型预测:使用训练好的随机森林模型对测试集数据进行分类预测。

  7. 模型评估:对预测结果进行评估,可以使用准确率、精确率、召回率等指标衡量模型的性能。

  8. 参数调优:根据模型评估结果,对随机森林模型的参数进行调优,以提高模型的性能。

  9. 模型应用:使用经过调优的随机森林模型对新的土地分类数据进行预测。

需要注意的是,随机森林方法在处理高维数据和大数据集时具有较好的性能,但对于类别不平衡的情况可能存在一定的问题。在实际应用中,可以根据具体需求选择合适的模型和算法进行土地分类。

函数

gve.Classifier.smileRandomForest(numberOfTrees,variablesPerSplit,minLeafPopulation,bagFraction,maxNodes,seed)

创建一个空的随机森林分类器

方法参数

- numberOfTrees( number )

创建的决策树数量

- variablesPerSplit( number,optional )

可选参数,每个变量拆分的数量

- minLeafPopulation( number,optional )

可选参数,创建至少包含这些点的节点

- bagFraction( number,optional )

可选参数,每棵树的输入袋比例

- maxNodes( number,optional )

可选参数,每棵树中最大的叶子节点数量

- seed( number,optional )

可选参数,随机种子

返回值: Classifier

代码

/**
 * @File    :   
 * @Time    :   2023/08/28
 * @Author  :   GEOVIS Earth Brain
 * @Version :   0.1.0
 * @Contact :   中国(安徽)自由贸易试验区合肥市高新区望江西路900号中安创谷科技园一期A1楼36层
 * @License :   (C)Copyright 中科星图数字地球合肥有限公司 版权所有
 * @Desc    :   对影像使用随机森林算法进行分类
 */
/** */

// 地物分类标签影像
var imgLable = gve.Image("AIRCAS/GLC_FCS30_2020/GLC_FCS30_2020_E115N35");
Map.centerObject(imgLable)
var id = Map.addLayer(imgLable, null, "imgLable");

var label = 'LABLE';
var imgLableRemapped = imgLable.rename(label)

// Sentinel2 待分类影像
var img = gve.Image("S2/L2A/20221107T024919_20221107T050438_T50SNA").select('B.*');
// print("Sentinel2 img",img);

// 获取区域
var ROI = gve.Geometry.Polygon(
    [
        [
            [117.15900037027156, 31.807122313784646],
            [117.15900037027156, 31.633066875770748],
            [117.65750500894343, 31.633066875770748],
            [117.65750500894343, 31.807122313784646]
        ]
    ]
);


// 波段采样的数量 
var numPoints = 100;
// 分类波段id 
var classBand = label;
// 采样区域 
var region = ROI;
// 缩放 
var scale = 100;
var sample = img.addBands(imgLableRemapped).stratifiedSample(numPoints, classBand, region, scale);
// print('sample',sample)

// 样本数据增加随机值属性,用于划分训练数据和验证数据
var sample = sample.randomColumn();

// 80%样本用于训练,20%样本用于验证
var trainingSample = sample.filter('random<=0.8');
var validationSample = sample.filter('random>0.8');

// 采用欧几里得距离模式训练最小距离分类器
var features = trainingSample;
var classProperty = label;
var inputProperties = img.bandNames();
//gve.Classifier.Cart(maxNodes,minLeafPopulation,maxDepth)
var trainedClassifier = gve.Classifier.smileRandomForest(50).train(features, classProperty, inputProperties);
//gve.Classifier.Cart()
//gve.Classifier.minimumDistance('euclidean', 10)
// print('trainedClassifier',trainedClassifier)
// 打印已训练完的分类器信息
print('Explain of trained classifier', trainedClassifier.explain());
// 获取训练数据的混淆矩阵和整体准确率
var trainedMatrix = trainedClassifier.confusionMatrix();
// print('Training confusion matrix', trainedMatrix);
print('Training overall accuracy', trainedMatrix.accuracy());

// 获取验证数据的混淆矩阵和整体准确率
validationSample = validationSample.classify(trainedClassifier);
// print('validationSample',validationSample)

// errorMatrix是一个混淆矩阵 
var validationMatrix = validationSample.errorMatrix(label, 'classification');
// print('Validation confusion matrix', validationMatrix);
print('Validation accuracy', validationMatrix.accuracy());

// 使用分类器对分类
var imgClassified = img.classify(trainedClassifier);
// print("imgClassified",imgClassified)

var classVis = {
    band_rendering: {
        uniquevalue: {
            colortable: {
                values: [10, 11, 20, 51, 52, 61, 62, 71, 72, 130, 180, 190, 210],
                colors: ['#FFFF64', '#FFFF64', '#AAF0F0', '#4C7300', '#006400', '#00A000',
                    '#AAC800', '#003C00', '#005000', '#FFB432', '#00DC82', '#C31400', '#0046C8'],
                na: "#000000"
            }
        }
    }
};

Map.centerObject(img)
var id1 = Map.addLayer(img, { bands: ['B4', 'B3', 'B2'], min: 100, max: 3500 }, 'img');

Map.centerObject(imgClassified)
var id2 = Map.addLayer(imgClassified, { palette: classVis }, 'Classified');

结果

  • Explain of trained classifier"
  • 2024-10-11 11:00:57.769 

    ▶ Object (15 properties)
  • 2024-10-11 11:00:57.770 

    "Training overall accuracy"
  • 2024-10-11 11:00:57.770 

    0.9896680216802168
  • 2024-10-11 11:00:57.770 

    "Validation accuracy"
  • 2024-10-11 11:00:57.771 

    0.01386001386001386
  • 2024-10-11 11:02:52.600 

    "Error: {"message":"参数异常","code":40205}"
;