似乎在遥感世界中,随机森林(RF)分类方法正在获得很大发展。我对RF特别感兴趣,原因是它具有许多优点:
一种适合遥感数据的非参数方法
报告的分类精度高
报道了各种重要性
鉴于这些优势,我想使用高分辨率4波段图像进行随机林地分类。有很多材料和研究都在宣传随机森林的优点,但是关于如何实际执行分类分析的信息很少。我熟悉使用R进行的RF回归,并且希望使用此环境来运行RF分类算法。
如何使用R收集,处理和输入训练数据(即基于高分辨率CIR航空影像)到随机森林算法中?任何有关如何生成分类的土地覆盖栅格的分步建议将不胜感激。
#1 楼
我不确定我是否理解“收集”数据的含义。如果要提到平视数字化和班级分配,最好在GIS中完成。有许多适合的免费选项(例如QGIS,GRASS)。理想情况下,您将具有现场数据来训练您的分类。使用随机森林进行分类的过程非常简单。您可以使用“ rgdal”或“ maptools”读取训练数据(即点shapefile),使用
raster::stack
读取光谱数据,使用raster:extract
将栅格值分配给训练点,然后将其传递给randomForest
。您需要将“类别”列强制为一个因素,以使RF将模型识别为分类实例。一旦有了拟合模型,就可以使用预测函数,将其传递给栅格堆栈。除了特定于栅格预测功能的参数以外,您还需要传递标准参数来进行预测。栅格包具有处理“内存不足”栅格的能力,因此即使对于非常大的栅格,也是安全的。栅格预测函数中的参数之一是“文件名”,允许将栅格写入磁盘。对于多类问题,您将需要设置type =“ response”和index = 1,这将输出您的类的整数栅格。 有一些注意事项:
您的响应变量(y)或任何其他变量的水平不能超过32个等式(x)右侧的系数
您的类必须平衡。遵循30%的规则是一个很好的规则,
,也就是说,如果您在一类上的观察次数多于其他任何类别的观察值
,那么您的问题就变得不平衡,结果可能会变得有偏见。
RF不能过度拟合是错误的说法。如果您过度关联了
合奏,则可能会过度拟合模型。避免这种情况的一种好方法是
运行初步模型并绘制误差稳定度。通常
凭经验,我选择2x来稳定ntree参数错误所需的引导程序数量。这是因为可变交互作用的稳定速度比误差稳定。如果您不
在模型中包含许多变量,则可以更保守地使用此参数。
不要使用节点纯度作为变量重要性的度量。它没有像平均精度下降那样排列。
我在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算法那样将类别数分配给输出?
–亚伦♦
2012年11月10日22:09
@Aaron,可以运行未标记(无监督)的RF,但结果难以处理。我建议您查看YaImpute软件包中提供的RF插补方法。这可能会解决您遇到的一些偏差/不平衡问题。
–杰弗里·埃文斯(Jeffrey Evans)
2012年11月12日18:55
#2 楼
我知道这个线程有点旧,但是对于任何想在R
中尝试对遥感数据进行分类的人,已经发布了非常有前途的新软件包。install.packages("RSToolbox")
它具有用于无监督分类和有监督分类的功能(使用随机森林)。在此处可以找到更多信息-http://bleutner.github.io/RStoolbox/
评论
这看起来非常有前途,感谢您对此软件包的工作。澄清一下,您是否通过插入符号指定了随机森林?如果是这样,您应该在文档中非常清楚地说明这一点。插入符包使用的节点拆分统计信息与原始Breiman(2001)定义不同。该统计数据遵循Strobl等人(2007年)的观点,在提出的统计数据可能有效的情况下,我从未购买过她的模拟条件。此外,观察到的偏差基于阶乘水平的变化。我更喜欢原始的熵统计量,因此不使用插入号。
–杰弗里·埃文斯(Jeffrey Evans)
15年12月4日在17:05
Jeffrey,您好,怕我不是软件包的作者。他的详细信息可以在我提供的链接中找到。
–JPD
2015年12月8日上午10:57
#3 楼
此处和此处是有关使用R进行监督分类/回归的教程,其中包括RandomForest示例。#4 楼
由于此处的问题在于对高分辨率CIR图像进行分类,因此我建议不要使用用于卫星数据的传统方法(基于像素),而是要对航空图像进行分段分析,然后使用分类器(RF)。 br />评论
如果这是一种非常有效的方法,则不能假设基于聚合的分类可以满足用户的需求。分割不应仅用于解决计算可处理性,而应满足特定的分析目标。这不是自动取代基于像素的方法的购物车非常规方法。人们必须平衡由于统计/空间平滑而导致的信息丢失与预期结果之间的平衡。如果您对空间变化感兴趣,可以将其删除。结果也可能高度依赖细分参数。
–杰弗里·埃文斯(Jeffrey Evans)
19-10-23在15:25
我完全同意您的观点,实际上每种方法都应针对特定目标。这就是为什么我建议使用高分辨率CIR图像(可能具有有限的光谱带)的GEOBIA变量集(包括辅助数据或纹理值)可以显着提高分类最终精度,尤其是当与RF等分类器结合使用时。
– Vincent
19-10-25在15:37
评论
我正在尝试了解这种栅格分类,因为我正在研究具有10cm分辨率图像的RF类(用于物种分布)。所以我想我不能输入点形状,而只能输入栅格。如何处理* png或* tif -files?