GEE中5折交叉验证完整实现指南

本文将详细介绍在Google Earth Engine (GEE)中实现完整的5折交叉验证流程,包括数据采样、预处理、参数搜索和交叉验证评估。

1. 完整实现流程概述

完整的5折交叉验证实现包含以下关键步骤:

  1. 从遥感影像中采样训练数据
  2. 为样本添加交叉验证折标签
  3. 定义参数搜索空间
  4. 生成所有参数组合
  5. 执行5折交叉验证
  6. 评估并选择最优参数

2. 数据采样与预处理

2.1 从遥感影像中采样

// 利用样本点对遥感数据进行采样
var samples_img = test_img.sampleRegions({
  collection: sample_input,  // 样本点集合
  properties: ['landcover'], // 要保留的属性
  scale: 30,                // 采样分辨率(米)
  tileScale: 4,             // 并行处理参数
  geometries: true          // 保留几何信息
});

关键参数说明:

  • sample_input: 包含样本点位置的FeatureCollection
  • landcover: 样本的类别标签属性
  • scale: 应与原始影像分辨率一致
  • tileScale: 增大可提高大范围采样的效率

2.2 添加交叉验证折标签

// 数据预处理(添加折标签)
var samplesWithFolds = samples_img.randomColumn('fold', 2023)
  .map(function (f) {
    // 将0-1的随机数转换为1-5的整数
    return f.set('fold', ee.Number(f.get('fold')).multiply(5).ceil().int());
  });

实现原理:

  1. randomColumn生成0-1的随机数列(使用固定种子2023保证可重复性)
  2. 将随机数乘以5并向上取整,得到1-5的整数作为折标签
  3. 最终每个样本会被随机分配到5个折中的一个

3. 参数搜索与交叉验证

3.1 定义参数搜索空间

// 定义随机森林参数搜索空间
var paramRanges = {
  nTrees: ee.List([50, 100, 150, 200]),    // 树的数量选项
  vPerSplit: ee.List([3,4,5,6]),           // 每次分裂考虑的变量数
  minLeaf: ee.List([1, 2, 4, 8]),         // 叶节点最小样本数
  bagFrac: ee.List([0.3, 0.4, 0.5, 0.6])   // 袋装样本比例
};

3.2 生成参数组合

// 生成所有参数组合(笛卡尔积)
var generateCombinations = function (ranges) {
  return ee.FeatureCollection(
    ranges.nTrees.map(function (nTree) {
      return ranges.vPerSplit.map(function (vSplit) {
        return ranges.minLeaf.map(function (minL) {
          return ranges.bagFrac.map(function (bagF) {
            return ee.Feature(null, {
              'nTrees': ee.Number(nTree).int(),
              'vPerSplit': ee.Number(vSplit).int(),
              'minLeaf': ee.Number(minL).int(),
              'bagFrac': ee.Number(bagF),
            });
          });
        });
      });
    }).flatten().flatten().flatten()
  );
};
var allCombinations = generateCombinations(paramRanges);

3.3 执行交叉验证

// 对所有参数组合执行5折交叉验证
var allResults = ee.FeatureCollection(
  allCombinations.map(function (params) {
    return fiveFoldCV(ee.Feature(params), samplesWithFolds);
  })
);

4. 5折交叉验证核心函数

// 5折交叉验证核心函数
function fiveFoldCV(params, samples) {
  var folds = 5;

  // 对每一折进行验证
  var foldResults = ee.List.sequence(1, folds).map(function (fold) {
    // 分割训练集/验证集(80%训练,20%验证)
    var training = samples.filter(ee.Filter.neq('fold', fold));
    var validation = samples.filter(ee.Filter.eq('fold', fold));

    // 使用当前参数训练随机森林分类器
    var classifier = ee.Classifier.smileRandomForest({
      numberOfTrees: params.getNumber('nTrees'),
      variablesPerSplit: params.getNumber('vPerSplit'),
      minLeafPopulation: params.getNumber('minLeaf'),
      bagFraction: params.getNumber('bagFrac'),
      seed: 1234  // 固定随机种子保证可重复性
    }).train({
      features: training,
      classProperty: 'landcover',  // 分类属性名
      inputProperties: featureList // 特征列表
    });

    // 在验证集上计算混淆矩阵
    var cm = validation.classify(classifier)
      .errorMatrix('landcover', 'classification');

    // 返回当前折的评估指标
    return ee.Feature(null, {
      'accuracy': cm.accuracy(),
      'kappa': cm.kappa(),
    });
  });

  // 计算5折的平均指标
  var meanAccuracy = ee.FeatureCollection(foldResults)
    .aggregate_mean('accuracy');
  var meanKappa = ee.FeatureCollection(foldResults)
    .aggregate_mean('kappa');

  // 返回包含原始参数和评估结果的Feature
  return ee.Feature(params)
    .set({
      'mean_accuracy': meanAccuracy,
      'mean_kappa': meanKappa,
    });
}

5. 实际应用建议

  1. 大数据集处理

    • 对于大规模样本,考虑先进行分层抽样
    • 可以增加tileScale参数提高采样效率
  2. 参数优化

    • 先进行粗搜索(参数范围大、步长大)
    • 在最优参数附近进行精细搜索
  3. 结果分析

    // 找出准确率最高的参数组合
    var bestParams = allResults.limit(1, 'mean_accuracy', false).first();
    print('Best parameters:', bestParams);
    
  4. 内存管理

    • 对于大量参数组合,考虑分批处理
    • 可以使用evaluate()异步获取结果
    • 将参数组合结果以csv保存

通过这套完整的5折交叉验证实现,你可以系统地评估不同参数组合在GEE中的表现,从而选择最优的模型配置用于遥感影像分类任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值