我不确定我是否理解“收集”数据的含义。如果要提到平视数字化和班级分配,最好在GIS中完成。有许多适合的免费选项(例如QGIS,GRASS)。理想情况下,您将具有现场数据来训练您的分类。
使用随机森林进行分类的过程非常简单。您可以使用“ rgdal”或“ maptools”读取训练数据(即点shapefile),使用读取光谱数据,使用raster::stack
分配栅格值至训练点raster:extract
,然后将其传递给randomForest
。您需要将“类别”列强制为一个因素,以使RF将模型识别为分类实例。一旦有了拟合模型,就可以使用预测函数,将其传递给栅格堆栈。除了特定于栅格预测功能的参数以外,您还需要传递标准参数来进行预测。栅格包具有处理“内存不足”栅格的能力,因此即使对于非常大的栅格,也是安全的。栅格预测函数中的参数之一是“文件名”,允许将栅格写入磁盘。对于多类问题,您将需要设置type =“ response”和index = 1,这将输出您的类的整数栅格。
有一些注意事项:
- 您的响应变量(y)或等式右边(x)的任何因子都不能超过32个级别
- 您的课程必须保持平衡。遵循30%的规则是一个很好的规则,也就是说,如果您在一类上的观察次数比其他任何类别多30%以上,则您的问题将变得不平衡并且结果可能会产生偏差
- RF不能过度拟合是错误的说法。如果您过度关联了整体,则可能会过度拟合模型。避免这种情况的一种好方法是运行初步模型并绘制误差稳定度。根据经验,我选择两倍的引导程序来稳定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)