当前位置: 首页 > 知识库问答 >
问题:

具有随机森林的图像分类(光栅堆栈)(package ranger)

郤瀚
2023-03-14

我正在使用R软件包ranger对随机森林进行拟合,以对光栅图像进行分类。预测函数会产生错误,下面我将提供一个可重复的示例。

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[单元格,]中的错误

虽然我真实数据的错误是

p[-naind,]中有错误

我唯一想到的是,除了感兴趣的预测之外,ranger.prediction对象还包括几个元素。无论如何,游侠如何被用来预测栅格堆栈?

共有3个答案

严阳秋
2023-03-14

如果有帮助的话,我用randomForest而不是ranger工作

library(randomForest)
rf.model<-randomForest(Species ~ ., data=iris)   
rf.pred<-predict(r,rf.model)
厉钊
2023-03-14

经过一点摆弄:

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

<代码>组件。数据框架(如矩阵(r))成功了!

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

identical(iris$Species, ranger.pred$predictions)
顾梓
2023-03-14

编辑,2021-07-15

有一个关于使用clusterR的问题,我发现了一种比我最初建议的更直接的方法。新代码的功能与原始代码相同,但方式更简单,并提供了并行处理选项:

# First train the ranger model

ranger.model <- ranger(Species ~ .
                       , data = iris
                       , probability = TRUE  # This argument is needed for se
                       , keep.inbag = TRUE   # So is this one
                       )


# Create prediction function for clusterR

f_se <- function(model, ...) predict(model, ...)$se


# Predict se using clusterR
  
beginCluster(2)

map_se <- clusterR(r
                   , predict
                   , args = list(ranger.model
                                 , type = 'se'  # Remember to include this argument
                                 , fun = f_se
                                 )
                   )

endCluster()

原始答案,2018年5月31日

您可以通过在插入符号包的训练函数中训练模型来从栅格堆栈上的Rranger模型运行预测:

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")
              )
 类似资料:
  • 我正在尝试在R中设置一个randomForest,以便根据其他光栅图像对光栅图像进行分类。我的训练数据是一个完全填充的光栅图像,我想训练许多其他光栅,以尝试基于初始光栅创建光栅输出。代码示例如下: <代码>rf1 ...其中,是我的光栅格式的实际已知值,而到是我想用来预测trainingRaster1是什么的其他光栅图像。我知道您将使用向量或点的训练类来训练一系列光栅,但在我的情况下,我希望使用光

  • 我正在使用randomForest包对不同预测值的光栅堆栈进行分类。分类工作正常,但我还想检索类概率。对于我的代码,我只得到一个具有第一个类概率的RasterLayer,但我希望得到一个具有一个层中每个类的类概率的RasterStack。

  • 随机森林是集成学习中可以和梯度提升树GBDT分庭抗礼的算法,尤其是它可以很方便的并行训练,在如今大数据大样本的的时代很有诱惑力。 1. bagging的原理 在集成学习原理小结中,我们给Bagging画了下面一张原理图。 从上图可以看出,Bagging的弱学习器之间的确没有boosting那样的联系。它的特点在“随机采样”。那么什么是随机采样? 随机采样(bootsrap)就是从我们的训练集里面采

  • 在随机森林方法中,创建了大量决策树。 每个观察都被送入每个决策树。 每次观察的最常见结果用作最终输出。 一个新的观察结果被输入所有树木,并对每个分类模型进行多数投票。 对构建树时未使用的情况进行错误估计。 这称为OOB (Out-of-bag)错误估计,以百分比形式提及。 R包"randomForest"用于创建随机森林。 安装R包 在R控制台中使用以下命令安装程序包。 您还必须安装依赖包(如果有

  • 主要内容:安装R包 - randomForest,语法,示例在随机森林方法中,创建了大量的决策树。每个观察结果都被送入每个决策树。 每个观察结果最常用作最终输出。对所有决策树进行新的观察,并对每个分类模型进行多数投票。 对于在构建树时未使用的情况进行错误估计。 这被称为OOB(Out-of-bag)错误估计,以百分比表示。 R中的软件包用于创建随机林。 安装R包 - randomForest 在R控制台中使用以下命令安装软件包,还必须安装其它依赖软件包(如

  • 1 Bagging   Bagging采用自助采样法(bootstrap sampling)采样数据。给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时,样本仍可能被选中, 这样,经过m次随机采样操作,我们得到包含m个样本的采样集。   按照此方式,我们可以采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基本学习器,再将这些基本学习