//选取随机森林树数目
var numTrees = ee.List.sequence(5, 50, 5);
var numtrees = numTrees.map(function(item){return ee.String(item)})
var accuracies = numTrees.map(function(t)
{
var classifier1 = ee.Classifier.smileRandomForest(t)
.train({
features: trainingPartition,
classProperty: 'lc',
inputProperties: input_col.first().bandNames()
});
return testingPartition
.classify(classifier1)
.errorMatrix('lc', 'classification')
.accuracy();
});
print(ui.Chart.array.values({
array: ee.Array(accuracies),
axis: 0,
xLabels: numTrees
}));
var Accuracies = accuracies.map(function(item){return ee.String(item)})
var tree = numTrees.get(accuracies.indexOf(accuracies.sort().getNumber(9)))
print('tree',tree)
var classifier = ee.Classifier.smileRandomForest(tree)
.train({
features: trainingPartition, //训练集
classProperty: 'lc', //标签
inputProperties:input.bandNames() //[ "B1", "B2", "B3","B5", "B7","NDBI", "NDVI" ,'MNDWI',"SI",'ELEVATION']
});
var classification = input.classify(classifier);
之前是通过查看树的数目与准确度的chart后,选择准确度最高的树,需要人为决定。想通过代码自动确定树的数目,首先将准确度排序,排序后选择最后一个(getnumber(9),这里如果numtrees序列长度变化时需要更改),然后搜索对应该准确度的树的数目(tree),将tree打印下来方便检查代码是否准确,然后在下面训练时将tree输入即可。
后记:尝试过用dictionary,但是GEE里面不知道怎么通过值取键,如果将准确度设置为键,可能出现键相同的情况,所以放弃了。多次尝试之后还是选择了最原始的方法——排序选择最后一个,实际上如果可以降序排序再使用first()最好,但是也不知道怎么设置降序排序。。不过好在最后可以用,效果也还行。如果有更好更简单的方法,欢迎交流~