首页 文章

带随机森林的图像分类(光栅堆栈)(包护林员)

提问于
浏览
6

我正在使用R包护林员对随机森林进行拟合以对光栅图像进行分类 . 预测函数产生错误,此后我提供了一个可重现的例子 .

library(raster)
library(nnet)
library(ranger)
data(iris)

# put iris data into raster
r<-list()
for(i in 1:4){
  r[[i]]<-raster(nrows=10, ncols=15)
  r[[i]][]<-iris[,i]
}
r<-stack(r)
names(r)<-names(iris)[1:4]

# multinom (an example that works)
nn.model <- multinom(Species ~ ., data=iris, trace=F)
nn.pred<-predict(r,nn.model)

# ranger (doesn't work)
ranger.model<-ranger(Species ~ ., data=iris)   
ranger.pred<-predict(r,ranger.model)

给出的错误是

v [cells,]中的错误< - predv:矩阵上的下标数不正确

虽然我的真实数据的错误是

p [-naind,]中的错误< - predv:要替换的项目数不是替换长度的倍数

我唯一想到的是,ranger.prediction对象包含了除感兴趣的预测之外的几个元素 . 无论如何,如何使用游侠在光栅堆栈上进行预测?

3 回答

  • 2

    您可以通过在插入符号包的train函数内训练模型,从栅格堆栈上的游侠模型运行预测:

    library(caret)
    ranger.model<-train(Species ~ ., data=iris,method = "ranger")  
    ranger.pred<-predict(r,ranger.model)
    

    但是,如果要预测标准误差,则此方法不起作用,因为列车对象的预测函数不接受 type = 'se' . 我通过使用本文档为此目的构建函数来解决这个问题:

    https://cran.r-project.org/web/packages/raster/vignettes/functions.pdf

    # Function to predict standard errors on a raster
    predfun <- function(x, model, type, filename)
    {
      out <- raster(x)
      bs <- blockSize(out)
      out <- writeStart(out, filename, overwrite=TRUE)
      for (i in 1:bs$n) {
        v <- getValues(x, row=bs$row[i], nrows=bs$nrows[i])
        nas<-apply(v,1,function(x) sum(is.na(x)))
        p<-numeric(length = nrow(v))
        p[nas > 0]<-NA
        p[nas == 0]<-predict(object = model,
                             v[nas == 0,],
                         type = 'se')$se
        out <- writeValues(out, p, bs$row[i])
      }
      out <- writeStop(out)
      return(out)
    }
    
    # New ranger model 
    ranger.model<-ranger(Species ~ .
                         , data=iris
                         , probability=TRUE
                         , keep.inbag=TRUE
                         )
    # Run predictions
    se<-predfun(r
                , model = ranger.model
                , type = "se"
                , filename = paste0(getwd(),"/se.tif")
                )
    
  • 3

    经过一番摆弄:

    pacman::p_load(raster, nnet, ranger)
    
    data(iris)
    
    # put iris data into raster
    r<-list()
    for(i in 1:4){
      r[[i]]<-raster(nrows=10, ncols=15)
      r[[i]][]<-iris[,i]
    }
    r<-stack(r)
    names(r)<-names(iris)[1:4]
    
    # multinom (an example that works)
    nn.model <- multinom(Species ~ ., data=iris, trace=F)
    nn.pred <- predict(r,nn.model)  # predict(object, newdata, type = c("raw","class"), ...)
    
    # ranger (doesn't work)
    ranger.model <- ranger(Species ~ ., data=iris)   
    ranger.pred <- predict(ranger.model, as.data.frame(as.matrix(r)))
    

    as.data.frame(as.matrix(r)) 做到了!

    免责声明:我没有检查输出的正确性,所以这可能根本没有结果,但......

    identical(iris$Species, ranger.pred$predictions)
    
  • 1

    如果有帮助,它可以使用randomForest而不是游侠

    library(randomForest)
    rf.model<-randomForest(Species ~ ., data=iris)   
    rf.pred<-predict(r,rf.model)
    

相关问题