-
Notifications
You must be signed in to change notification settings - Fork 2
/
RF_GEE.txt
105 lines (101 loc) · 4.5 KB
/
RF_GEE.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Function to mask clouds using the Sentinel-2 QA band.
function maskS2clouds(image) {
var qa = image.select('QA60')
// Bits 10 and 11 are clouds and cirrus, respectively.
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
// Both flags should be set to zero, indicating clear conditions.
var mask = qa.bitwiseAnd(cloudBitMask).eq(0).and(
qa.bitwiseAnd(cirrusBitMask).eq(0))
// Return the masked and scaled data, without the QA bands.
return image.updateMask(mask).divide(10000)
.select("B.*")
.copyProperties(image, ["system:time_start"])
}
function addIndices(image){
var ndvi = image.normalizedDifference(['B8', 'B4']).rename(['ndvi']);
var ndvire1 = image.normalizedDifference(['B8A', 'B5']).rename(['ndvire1']);
var ndvire2 = image.normalizedDifference(['B8A', 'B6']).rename(['ndvire2']);
var ndvire3 = image.normalizedDifference(['B8A', 'B7']).rename(['ndvire3']);
return image.addBands(ndvi.rename("NDVI")).addBands(ndvire1.rename("NDVIRE1")).addBands(ndvire2.rename("NDVIRE2")).addBands(ndvire3.rename("NDVIRE3"))
}
// Call and filter sentinel-1 images
var collection_S1=ee.ImageCollection('COPERNICUS/S1_GRD')
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH'));
var collection_S1_IW=collection_S1
.filterBounds(region)
.filterMetadata('instrumentMode','equals','IW')
.filterDate('2021-07-01', '2021-08-31');
var Sentinel_1=collection_S1_IW.median()
var collection2 = ee.ImageCollection('COPERNICUS/S2')
.filterDate('2021-07-01', '2021-08-31')
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.map(maskS2clouds)
var composite2= collection2
.map(addIndices)
.median();
//print(composite2)
var data=ee.Image.cat([Sentinel_1,composite2.clip(region)]).float().clip(region)
Map.addLayer(composite2.clip(region), {bands: ['B4', 'B3', 'B2'], min: 0, max: 0.3}, 'RGB2')
// Merge sample points
var samples=XIAOMAI.merge(YOUCAI).merge(LIMAI).merge(QITA);
//Add random number field
var sampleData = samples.filterBounds(region).randomColumn('random')
// Randomly split the sample points into training samples and verification samples 7:3
var sample_training = sampleData.filter(ee.Filter.lt("random", 0.7));
var sample_validate = sampleData.filter(ee.Filter.gte("random", 0.7));
//Map.addLayer(sample_training,{color:'red'},'training samples')
//Map.addLayer(sample_validate,{color:'blue'},'validation samples')
// Using sample points to pick up eigenvalues for model training and verification
var training = data.sampleRegions({
collection: sample_training,
properties: ["landcover"],
scale: 10
});
var validation = data.sampleRegions({
collection: sample_validate,
properties: ["landcover"],
scale: 10
});
var classifier = ee.Classifier.smileRandomForest(60)
.train({
features: training,
classProperty: 'landcover',
inputProperties: data.select(['B8','B4','VV','B3','NDVIRE2','VH','NDVI','B1','B6','B7','B2','B12','B8A','B9','NDVIRE1','NDVIRE3','B10','B5','B11']).bandNames()//
});
var Classified_RF = data.classify(classifier);
print(Classified_RF)
var dict = classifier.explain();
print('Explain:',dict);
var variable_importance = ee.Feature(null, ee.Dictionary(dict).get('importance'));
// Show the relative importance of each feature with a histogram
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);
// Confusion matrix method
var validated = validation.classify(classifier);
// Confusion matrix
var testAccuracy = validated.errorMatrix('landcover', 'classification');
// Overall classification accuracy
var accuracy = testAccuracy.accuracy();
// User classification accuracy
var userAccuracy = testAccuracy.consumersAccuracy();
// Producers classification accuracy
var producersAccuracy = testAccuracy.producersAccuracy();
// Kappa coefficient
var kappa = testAccuracy.kappa();
print('Validation error matrixRF:', testAccuracy);
print('User accRF:', userAccuracy);
print('Prod accRF:', producersAccuracy);
print('Validation overall accuracyRF:', accuracy);
print('KappaRF:', kappa);
Map.addLayer(Classified_RF.clip(region), {min: 0, max: 3,
palette: ['#FF0000','#00FF00','#0000FF','#F5DEB3']}, 'RFQ');