如何进行随机林地覆盖分类?


32

这是先前文章:土地覆被分类的机器学习算法的后续文章。

看来,随机森林(RF)分类方法在遥感世界中获得了很大的发展。由于其许多优点,我对RF特别感兴趣:

  • 适用于遥感数据的非参数方法
  • 报告的分类准确性高
  • 报告了可变的重要性

鉴于这些优势,我想使用高分辨率4波段图像进行随机林地分类。有很多材料和研究都在宣传随机森林的优点,但是关于如何实际执行分类分析的信息很少。我熟悉使用R进行的RF回归,并且希望使用此环境来运行RF分类算法。

如何使用R 收集,处理训练数据(即基于高分辨率CIR航空影像)并将其输入到Random Forest算法中?任何有关如何生成分类的土地覆盖栅格的分步建议将不胜感激。


我正在尝试了解这种栅格分类,因为我正在研究具有10cm分辨率图像的RF类(用于物种分布)。所以我想我不能输入点形状,而只能输入栅格。如何处理* png或* tif -files?
steveomb

Answers:


29

我不确定我是否理解“收集”数据的含义。如果要提到平视数字化和班级分配,最好在GIS中完成。有许多适合的免费选项(例如QGIS,GRASS)。理想情况下,您将具有现场数据来训练您的分类。

使用随机森林进行分类的过程非常简单。您可以使用“ rgdal”或“ maptools”读取训练数据(即点shapefile),使用读取光谱数据,使用raster::stack分配栅格值至训练点raster:extract,然后将其传递给randomForest。您需要将“类别”列强制为一个因素,以使RF将模型识别为分类实例。一旦有了拟合模型,就可以使用预测函数,将其传递给栅格堆栈。除了特定于栅格预测功能的参数以外,您还需要传递标准参数来进行预测。栅格包具有处理“内存不足”栅格的能力,因此即使对于非常大的栅格,也是安全的。栅格预测函数中的参数之一是“文件名”,允许将栅格写入磁盘。对于多类问题,您将需要设置type =“ response”和index = 1,这将输出您的类的整数栅格。

有一些注意事项

  1. 您的响应变量(y)或等式右边(x)的任何因子都不能超过32个级别
  2. 您的课程必须保持平衡。遵循30%的规则是一个很好的规则,也就是说,如果您在一类上的观察次数比其他任何类别多30%以上,则您的问题将变得不平衡并且结果可能会产生偏差
  3. RF不能过度拟合是错误的说法。如果您过度关联了整体,则可能会过度拟合模型。避免这种情况的一种好方法是运行初步模型并绘制误差稳定度。根据经验,我选择两倍的引导程序来稳定ntree参数的错误。这是因为变量交互以比错误更慢的速度稳定。如果模型中没有包括很多变量,那么使用此参数可以更加保守。
  4. 不要将节点纯度用作变量重要性的度量。它不会像平均精度下降那样排列。

我在CRAN上的rfUtilities软件包中具有用于模型选择,类不平衡和验证的功能

这是一些简单的代码,可以帮助您入门。

require(sp)
require(rgdal)
require(raster)
require(randomForest)

# CREATE LIST OF RASTERS
rlist=list.files(getwd(), pattern="img$", full.names=TRUE) 

# CREATE RASTER STACK
xvars <- stack(rlist)      

# READ POINT SHAPEFILE TRAINING DATA
sdata <- readOGR(dsn=getwd() layer=inshape)

# ASSIGN RASTER VALUES TO TRAINING DATA
v <- as.data.frame(extract(xvars, sdata))
  sdata@data = data.frame(sdata@data, v[match(rownames(sdata@data), rownames(v)),])

# RUN RF MODEL
rf.mdl <- randomForest(x=sdata@data[,3:ncol(sdata@data)], y=as.factor(sdata@data[,"train"]),
                       ntree=501, importance=TRUE)

# CHECK ERROR CONVERGENCE
plot(rf.mdl)

# PLOT mean decrease in accuracy VARIABLE IMPORTANCE
varImpPlot(rf.mdl, type=1)

# PREDICT MODEL
predict(xvars, rf.mdl, filename="RfClassPred.img", type="response", 
        index=1, na.rm=TRUE, progress="window", overwrite=TRUE)

我一直看到使用RF和预报()识别树冠覆盖的效果相当不错。但是,我似乎无法产生比使用ISODATA算法更好的结果。我怀疑我的训练样本有偏差,或者频谱重叠过多。是否有无监督的RF实现可能会产生更好的结果?是否可以像ISODATA算法那样将类别数分配给输出?
亚伦

3
@Aaron,可以运行未标记(无监督)的RF,但结果难以处理。我建议您查看YaImpute软件包中提供的RF插补方法。这可以解决您遇到的一些偏差/不平衡问题。
杰弗里·埃文斯

5

我知道这个线程有些旧,但是对于任何想在中尝试分类遥感数据的人R,已经发布了一个非常有前途的新软件包。

install.packages("RSToolbox")

它具有用于无监督分类和有监督分类的功能(使用随机森林)。可以在这里找到更多信息-http://bleutner.github.io/RStoolbox/


这看起来非常有前途,感谢您对此软件包的工作。澄清一下,您是否通过插入符号指定了随机森林?如果是这样,您应该在文档中非常清楚地说明这一点。插入符包使用的节点拆分统计信息与原始Breiman(2001)定义不同。该统计数据遵循Strobl等人(2007年)的观点,在建议的统计数据可能有效的情况下,我从未购买过她的模拟条件。此外,观察到的偏差基于阶乘水平的变化。我更喜欢原始的熵统计量,因此不使用插入号。
Jeffrey Evans

Jeffrey,您好,怕我不是软件包的作者。他的详细信息可以在我提供的链接中找到。
JPD


0

由于此处的问题在于对高分辨率CIR图像进行分类,因此我建议不要使用用于卫星数据的传统方法(基于像素),而是要对航空图像进行分段分析,然后使用分类器(RF)。


3
如果这是一种非常有效的方法,则不能假设基于聚合的分类可以满足用户的需求。分割不应仅用于解决计算可处理性,而应满足特定的分析目标。这不是自动取代基于像素的方法的购物车非常规方法。由于统计/空间平滑,人们必须在信息损失与预期结果之间取得平衡。如果您对空间变化感兴趣,可以将其删除。结果也可能高度依赖于细分参数。
杰弗里·埃文斯

我完全同意您的看法,实际上每种方法都应针对特定目标。这就是为什么我建议使用高分辨率CIR图像(可能具有有限的光谱带)的GEOBIA变量集(包括辅助数据或纹理值)可以显着提高分类最终精度,尤其是当与RF等分类器结合使用时。
森特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.