GEE随机森林回归(时间序列)

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代码

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值