GEE随记(二):随机森林特征重要性的排序

原因

在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)

fec127518f9f4ec283dc0474e513e952.png

 可以看到没有按顺序排列

特征排序

由于想不到什么好办法所以只能将他打印出来看,如果大家有办法排序柱状图的话也欢迎分享哟

//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)

按大小输出,可以更方便的按照特征数阈值进行波段数量和特征波段的选取 

193d444ef7a34da1b4bc8ae2941369ef.png

-----------------------------------------------------手动分割线-----------------------------------------------------------

 方法更新

基于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函数元胞列表进行绘图,代码效果如下:

b14a833eecbe473faba586deed345240.png

 

  • 10
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值