r - 错误: predictors in new data do not match that of the training data when using raster attribute table (RAT)

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

我有一个使用插入符号包训练的随机森林模型,其中包含数字和分类预测变量。我正在尝试使用这个经过训练的模型对新数据集进行预测,该数据集是一个包含每个预测器一层的 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)

最佳答案

因子RasterLayer(属性层)似乎是(或被处理为)一个有序因子。因此,您只需使用有序向量来训练模型即可。您可以通过更改一行来实现这一点:

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

关于r - 错误: predictors in new data do not match that of the training data when using raster attribute table (RAT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48582370/

相关文章:

r - 使用 caret 包的变量重要性(错误);随机森林算法

r - 在 R 中为 plotly 图例添加标题

python - 为什么随机森林的大小随着训练样本数量的增加而增加?

Python RandomForest - 未知标签错误

r - 抑制 data.table j 函数中的输出

javascript - 如果在 Rhandsontable 中编辑了单元格,则突出显示该行并跟踪所有更改

r - 获取 R 中随机森林的准确性

r - 我在姬松茸数据集中进行网格搜索时遇到问题

r - 在插入符号中拟合无截距模型

r - 为什么使用 caret::train(..., method = "rpart") 的结果与 rpart::rpart(...) 不同?