GEE随机森林回归(时间序列)
随机森林回归介绍
随机森林回归模型由多棵回归树构成,且森林中的每一棵决策树之间没有关联,模型的最终输出由森林中的每一棵决策树共同决定。
每一棵回归树就是一个精通于某一个窄领域的专家(因为我们从M个feature中选择m让每一棵回归树进行学习),这样在随机森林中就有了很多个精通不同领域的专家,
对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终由各个专家得出自己的结果,最后将得到结果取均值即可。
随机森林的基学习器并不是弱学习器而是强学习器,是有很高深度的强决策树组成的。
案例介绍
拟采用历史气象数据和历史NDVI,回归拟合未来气候条件下研究区NDVI
使用的数据集’NASA/GDDP-CMIP6’、“NOAA/CDR/AVHRR/NDVI/V5”
数据预处理
拟采用年气象数据和年NDVI均值
// An highlighted block
var data_CMIP = ee.ImageCollection('NASA/GDDP-CMIP6')
var data_NDVI = ee.ImageCollection("NOAA/CDR/AVHRR/NDVI/V5")
var year_list_history = ee.List.sequence(1982,2013)
var ndvi_avhrr = function(year){
var date_start = ee.Date.fromYMD(year, 1, 1);
var date_end = date_start.advance(1, 'year');
var data_use = data_NDVI.filter(ee.Filter.date(date_start, date_end))
.select('NDVI').mean().multiply(0.0001)
return data_use.set('system:index', ee.String(ee.Number(year).int()))
}
var data_NDVI = ee.ImageCollection(year_list_history.map(ndvi_avhrr))
// 由于CMIP6数据集2015年前,包含历史数据,后边都是情景数据了
var se_ACCESS = ee.Filter.eq('model', 'ACCESS-ESM1-5')
var se_BCC = ee.Filter.eq('model', 'BCC-CSM2-MR')
var se_CNRM = ee.Filter.eq('model', 'CNRM-CM6-1')
var se_IPSL = ee.Filter.eq('model', 'IPSL-CM6A-LR')
var se_MIROC6 = ee.Filter.eq('model', 'MIROC6')
var se_MPI = ee.Filter.eq('model', 'MPI-ESM1-2-LR')
var se_select = ee.Filter.or(se_ACCESS, se_BCC, se_CNRM, se_IPSL, se_MIROC6, se_MPI)
// 由于部分模式不包含全部波段,仅选择了三个模式
var se_select2 = ee.Filter.or(se_ACCESS, se_CNRM, se_MPI)
function applyScaleFactors(image){
var pr_data = image.select('pr').multiply(86400);
var tas_data = image.select(['tas', 'tasmin', 'tasmax']).subtract(273.15);
return image.addBands(pr_data, null, true)
.addBands(tas_data, null, true)
}
var dataset = ee.ImageCollection('NASA/GDDP-CMIP6')
.filter(ee.Filter(se_select2));
var data_climate = function(year){
var date_start = ee.Date.fromYMD(year, 1, 1);
var date_end = date_start.advance(1, 'year');
var data_use = dataset.filter(ee.Filter.date(date_start, date_end))
.map(applyScaleFactors)
var data_pr = data_use.select('pr').sum().divide(3)
var data_tas = data_use.select(['tas', 'hurs', 'huss', 'rlds', 'rsds', 'sfcWind', 'tasmin', 'tasmax']).mean()
return ee.Image(year).float()
.addBands(data_pr)
.addBands(data_tas).set('system:index', ee.String(ee.Number(year).int()))
}
var climate_before = ee.ImageCollection(year_list_history.map(data_climate))
print(climate_before)
var data_combine = climate_before.combine(data_out)
在研究区随机生成点
var roi = ee.Geometry.Polygon(
[[[-113.65703661441803, 45.26511850065774],
[-113.65703661441803, 33.12592826913414],
[-92.47539598941805, 33.12592826913414],
[-92.47539598941805, 45.26511850065774]]], null, false);
// 随机生成100个点
var point= ee.FeatureCollection.randomPoints(roi, 100)
// 求取这100个点每年每个波段的值
var point_combine = data_combine.map(function(image){
return image.reduceRegions({
collection: point,
reducer: ee.Reducer.mean(),
scale: 10000,
crs: 'EPSG:4326'
});
});
// 使用flatten函数将多个
var training = point_combine.flatten()
var bands = ['NDVI', 'constant', 'hurs', 'huss', 'pr', 'rlds', 'rsds', 'sfcWind', 'tas', 'tasmax', 'tasmin']
var withRandom = training.randomColumn({
columnName:'random',
seed:2,
distribution: 'uniform',
});
var split = 0.8;
var trainingData = withRandom.filter(ee.Filter.lt('random', split));
var validationData = withRandom.filter(ee.Filter.gte('random', split));
随机森林回归
var classifier = ee.Classifier.smileRandomForest(100, null, 1, 0.5, null, 0).setOutputMode('REGRESSION')
.train({
features: trainingData,
classProperty: 'NDVI',
inputProperties: bands
});
print(classifier);
print(validationData.classify(classifier, 'predicted'))
var regression_C = data_combine.map(function(image){
return image.classify(classifier, 'predicted')
})
print(regression_C)
var sampleTraining = validationData.classify(classifier, 'predicted').select(['NDVI', 'predicted'])
var chartTraining = ui.Chart.feature.byFeature({features:sampleTraining, xProperty:'NDVI', yProperties:['predicted']})
.setChartType('ScatterChart')
.setOptions({
title: 'Predicted vs Observed - Training data ',
hAxis: {
'title': 'observed'
},
vAxis: {
'title': 'predicted'
},
pointSize: 3,
trendlines: {
0: {
showR2: true,
visibleInLegend: true
},
1: {
showR2: true,
visibleInLegend: true
}
}
});
print(chartTraining);
Export.table.toDrive({
collection: sampleTraining,
description: '2020802_RFR_Validation',
folder: "2020802",
fileFormat: 'CSV'
})
完整代码链接为:GEE代码