原因
在Google Earth Engine(GEE)利用随机森林模型进行地物监督分类时,我们往往也需要输出特征重要性来判别哪一种特征对分类最有效,关于随机森林的地物分类可以参考相关博主的文章:GEE——土地利用分类之监督分类_月球上看星星的博客-CSDN博客_gee土地利用分类。然而很多时候,利用代码输出的特征重要性图没有明确排序。
示范代码
运行下面代码得到柱状图
//随机森林特征重要性
//change to dictionary
var dict = trainedClassifier.explain();
print('Classifier Dictionary',dict);
// get "importance" list
var variable_importance = ee.Feature(null, ee.Dictionary(dict).get('importance'));
// visualize the result
var importancechart = ui.Chart.feature.byProperty(variable_importance)
.setChartType('ColumnChart')
.setOptions({
title:'Random Forest Variable Impotance',
legend:{position:'none'},
hAxis:{title:'Bands'},
vAxis:{title:"Importance"}
});
print(importancechart)
可以看到没有按顺序排列
特征排序
由于想不到什么好办法所以只能将他打印出来看,如果大家有办法排序柱状图的话也欢迎分享哟
//set order
var cc = variable_importance.toDictionary()
var cc_p = cc.getInfo()
print(cc_p)
var ks = Object.keys(cc_p)
print(ks)
var size = ks.length
var datas1 = Array(size);
for(var i=0; i<size; i++) {
datas1[i] = {
key : ks[i],
value : cc_p[ks[i]],
}
}
datas1.sort(
function cmp(left, right) {
return right.value - left.value;
}
)
var order = ""
for(var i=0; i<size; i++) {
order += datas1[i].key + ", " + datas1[i].value + "\n"
}
print(order)
按大小输出,可以更方便的按照特征数阈值进行波段数量和特征波段的选取
-----------------------------------------------------手动分割线-----------------------------------------------------------
方法更新
基于geemap的随机森林特征重要性排序
由于GEE官网对数据有进行封装,使得之前难以利用随机森林特征重要性做一个降序排序的柱状图,后面发现用geemap可以提取出数据且更加方便,以下是代码:
trained = ee.Classifier.smileRandomForest(150).train(**{
'features':sample_training,
'classProperty':'landcover',
'inputProperties':bands
});
importance = trained.explain().get('importance').getInfo()
a = sorted(importance.items(),key=lambda d:d[1],reverse = True)
import matplotlib.pyplot as plt
a2 = [(elem1,elem2) for elem1,elem2 in a]
plt.figure(figsize=(15,5),dpi=100)
plt.bar(*zip(*a2),alpha=1,width=0.6);
plt.xlabel('Bands')
plt.ylabel('Importance')
plt.show()
利用zip函数元胞列表进行绘图,代码效果如下: