本文将详细介绍在Google Earth Engine (GEE)中实现完整的5折交叉验证流程,包括数据采样、预处理、参数搜索和交叉验证评估。
1. 完整实现流程概述
完整的5折交叉验证实现包含以下关键步骤:
- 从遥感影像中采样训练数据
- 为样本添加交叉验证折标签
- 定义参数搜索空间
- 生成所有参数组合
- 执行5折交叉验证
- 评估并选择最优参数
2. 数据采样与预处理
2.1 从遥感影像中采样
// 利用样本点对遥感数据进行采样
var samples_img = test_img.sampleRegions({
collection: sample_input, // 样本点集合
properties: ['landcover'], // 要保留的属性
scale: 30, // 采样分辨率(米)
tileScale: 4, // 并行处理参数
geometries: true // 保留几何信息
});
关键参数说明:
sample_input
: 包含样本点位置的FeatureCollectionlandcover
: 样本的类别标签属性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());
});
实现原理:
randomColumn
生成0-1的随机数列(使用固定种子2023保证可重复性)- 将随机数乘以5并向上取整,得到1-5的整数作为折标签
- 最终每个样本会被随机分配到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. 实际应用建议
-
大数据集处理:
- 对于大规模样本,考虑先进行分层抽样
- 可以增加
tileScale
参数提高采样效率
-
参数优化:
- 先进行粗搜索(参数范围大、步长大)
- 在最优参数附近进行精细搜索
-
结果分析:
// 找出准确率最高的参数组合 var bestParams = allResults.limit(1, 'mean_accuracy', false).first(); print('Best parameters:', bestParams);
-
内存管理:
- 对于大量参数组合,考虑分批处理
- 可以使用
evaluate()
异步获取结果 - 将参数组合结果以csv保存
通过这套完整的5折交叉验证实现,你可以系统地评估不同参数组合在GEE中的表现,从而选择最优的模型配置用于遥感影像分类任务。