【问题标题】:Error: predictors in new data do not match that of the training data when using raster attribute table (RAT)错误:使用栅格属性表 (RAT) 时,新数据中的预测变量与训练数据的预测变量不匹配
【发布时间】:2018-07-12 22:28:15
【问题描述】:

我有一个使用 caret 包训练的 RandomForest 模型,该包包含数字和分类预测变量。我正在尝试使用这个训练有素的模型对一个新数据集进行预测,该数据集是一个 rasterStack,每个预测变量都包含一个层。我已经使用raster 包中的ratify 函数将分类栅格图层转换为因子,并通过添加栅格属性表(RAT)添加了与训练集语法相对应的字符串,但是当我预测我收到以下错误:

# Error in predict.randomForest(modelFit, newdata) : 
# Type of predictors in new data do not match that of the training data. 

我认为我可能以某种方式错误地制定了 RAT,或者我误解了 RAT 的功能。下面是一个最小的可重现示例。对出了什么问题有任何想法吗?

require(caret)
require(raster)

set.seed(150)
data("iris")

# Training dataset
iris.x<-iris[,1:4]
iris.x$Cat<-"Low"
iris.x$Cat[1:60]<-"High"
iris.x$Cat<-as.factor(as.character(iris.x$Cat))
iris.y<-iris$Species

# Train RF model in Caret
ctrl<-trainControl("cv", num=5, p = 0.9)

mod<- train(iris.x,iris.y, 
              method="rf",
              trControl=trainControl(method = "cv"))

# Create raster stack prediction dataset
r <- raster(ncol=10, nrow=5)
tt <- sapply(1:4, function(x) setValues(r,  round(runif(ncell(r),1,5))))

#Categorical raster layer with RAT
r_cat<-raster(ncol=10, nrow=5)
r_cat[1:25]<-1
r_cat[26:50]<-2
ratr_cat <- ratify(r_cat)
rat <- levels(ratr_cat)[[1]]
rat$PCN <- c(1,2)
rat$PCN_level <- c('Low','High')
levels(ratr_cat) <- rat

#Stack raster layers
t.stack <- stack(c(tt,ratr_cat),RAT = TRUE)

#Make sure names in stack match training dataset
names(t.stack)<-c('Sepal.Length','Sepal.Width', 'Petal.Length', 'Petal.Width','Cat')

#Ensure that categorical layer still has RAT and is a factor
t.stack[['Cat']] #yep
is.factor(t.stack[['Cat']]) #yep

#Predict new data using model
mod_pred <- predict(t.stack, mod)

【问题讨论】:

  • 你能分享print(RF_model)的输出吗?不过,这不是minimal 也不是reproducible 示例。请尽量让事情变得简单。
  • @lok​​i,请参阅我的编辑以获取最小的可重现示例。谢谢

标签: r random-forest r-caret r-raster rgdal


【解决方案1】:

因子RasterLayer(属性层)似乎是(或被处理为)有序因子。所以你只需要用有序向量训练模型。你可以实现这一改变一行:

iris.x$Cat<- ordered(as.character(iris.x$Cat), levels = c("Low", "High"))

【讨论】:

  • @loci,啊,是的,我看到它现在可以工作了,谢谢。为了澄清,is.ordered(ratr_cat) 返回FALSE,那么我如何确定是否订购了RasterLayer 以供将来参考。此外,我还有其他具有多个级别的分类变量,我想将它们包含在模型中,但它们不是序数因素。我会用factor( x , ordered = FALSE ) 将它们转换为无序,但RasterLayer 对象没有报告它是有序的?
  • is.ordered(t.stack[['Cat']]@data@isfactor)is.ordered(t.stack[['Cat']]@data@attributes[[1]]$PCN_test2) 都不返回 TRUE。奇怪,train 函数是如何按顺序读取这个RasterLayer 的?
  • 事实上,这很奇怪。不幸的是,我也没有找到任何解释。唯一的想法是从levels(t.stack[['Cat']]) 中提取级别的顺序。
猜你喜欢
  • 1970-01-01
  • 2017-12-15
  • 2015-10-31
  • 2016-11-05
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2020-09-12
相关资源
最近更新 更多