随机森林是一种基于多个决策树的集成学习方法,可以用于分类和回归问题。在gee中可以使用ee.Classifier.smileRandomForest()函数来创建一个随机森林分类器,并用它来对影像进行分类。
随机森林分类器有一个重要的属性,就是可以计算每个特征(或者说波段)的重要性,即该特征对分类结果的贡献程度。特征重要性可以帮助我们选择最有效的特征,从而提高分类的准确性和效率。
在本文中,将使用gee平台上的哨兵二号影像(COPERNICUS/S2)作为数据源,对区域内的土地覆盖进行分类,并计算并排序每个波段的重要性。具体分类过程可见:
【GEE笔记】在线分类流程,标注样本点、分类和精度评价
代码如下:
var geometry = ee.Geometry.Polygon(
[[[121.81940156260009, 40.92383488850036],
[121.81940156260009, 40.73887826797227],
[121.99998933115478, 40.73887826797227],
[121.99998933115478, 40.92383488850036]]], null, false)
// 定义年份和波段列表
var year=2020
var bandlist=['B2','B3','B4','B8','B11','B12']
// 定义时间范围
var start = ee.Date(year+'-4-1');
var finish = ee.Date(year+'-7-1');
// 从gee平台上加载哨兵二号影像,并按照时间、空间和云量进行过滤
var dataset = ee.ImageCollection('COPERNICUS/S2')
.filterDate(start, finish)
.filterBounds(geometry)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
// 从影像集中选择需要的波段
dataset=dataset.select(bandlist);
// 定义RGB波段和显示范围
var rgbVis = {
min: 0.0,
max: 3000,
bands: ['B4', 'B3', 'B2'],
};
// 将地图中心定位
Map.centerObject(geometry)
// 打印影像集的信息
print(dataset)
// 对影像集进行中值合成,并裁剪到西城区范围
var image=dataset.median().clip(geometry)
// 在地图上显示合成影像
Map.addLayer(image,rgbVis)
// 加载样本数据,包括淡水、海水、建盆、农田、芦苇、建筑、潭土和草地等八个类别
var sample=danshui.merge(haishui).merge(jianpeng).merge(nongtian).merge(luwie).merge(jianzhu)
.merge(tantu).merge(caodi)
// 为样本数据添加一个随机数列,用于划分训练集和测试集
var withRandom = sample.randomColumn('random');
// 定义训练集和测试集的比例,大约70%的样本用于训练,30%的样本用于测试
var split = 0.7;
var trainingPartition2 = withRandom.filter(ee.Filter.lt('random', split));
var testingPartition = withRandom.filter(ee.Filter.gte('random', split));
// 从合成影像中提取训练集的像素值,包括波段值和类别标签
var trainingPartition=image.sampleRegions({
collection: trainingPartition2,
scale:10,
properties: ['Map'],
})
// 创建一个随机森林分类器,使用100棵树,并用训练集进行训练
var classifier = ee.Classifier.smileRandomForest(100).train({
features: trainingPartition,
classProperty:'Map',
// inputProperties :['B4', 'B3', 'B2']
});
// 从分类器的explain()方法中获取特征重要性的字典
var dict = ee.Dictionary(classifier.explain().get('importance'));
// 打印特征重要性的字典
print('Explain:',dict);
// 将特征重要性的字典转换为数组,并按照重要性的值进行排序
var tttt=ee.Dictionary(classifier.explain().get('importance')).toArray().toList();
print('重要性排序:',ee.Dictionary(classifier.explain().get('importance')).keys().sort(tttt))
// 使用ui.Chart.feature.byProperty()函数,将特征重要性的字典绘制成柱状图,并显示在控制台中
var variable_importance = ee.Feature(null, ee.Dictionary(dict2).get('importance'));
var chart =
ui.Chart.feature.byProperty(variable_importance)
.setChartType('ColumnChart')
.setOptions({
title: 'Random Forest Variable Importance',
legend: {position: 'none'},
hAxis: {title: 'Bands'},
vAxis: {title: 'Importance'}
});
print(chart);
从输出结果可以看到,B8
波段(近红外波段)的重要性最高,达到了410.5263331047649
,说明该波段对土地覆盖分类的影响最大。
通过计算并排序特征重要性,可以对影像进行特征选择,即只保留最重要的波段,从而减少数据的维度,提高分类的速度和准确性。当然,特征选择的效果还需要通过分类精度评估来验证,这是下一步的工作。