使用superClass进行遥感图像分类时遇newdata行数为0错误求助
运行遥感图像分类代码时出现报错:
Error in predict.randomForest(modelFit, newdata): newdata has 0 rows
使用的代码如下:
#libraries library(sf) library(RStoolbox) library(sp) library(raster) library(terra) library(caret) library(e1071) #Load image kalomo2022<- brick("Kalomo_2022.tif") #Train data train <- sf::read_sf("Train_Kal_only2022_1.shp") train_1 <- as(train, "Spatial") #to change it from sf to spatial #conducting the classification sc_kalomo2022<- superClass(kalomo2022, model = "rf", trainData = train_1, responseCol = "id", mode = "classification", nsamples = 10000, nSamplesV = 10000, polygonBasedCV = T, kfold = 5, minDist = 1, trainPartition = .8, na.rm = T, predict=T, predType = "raw")
空间坐标系不匹配
检查训练矢量数据train_1和栅格图像kalomo2022的坐标系是否一致。若投影不同,superClass无法从图像中提取训练样本,直接导致后续无数据可用。
操作:用proj4string(train_1)和crs(kalomo2022)查看坐标系,不一致则执行train_1 <- spTransform(train_1, crs(kalomo2022))统一投影。采样参数设置过度
nsamples = 10000的总采样数可能远超训练区域的实际像素量,加上minDist = 1要求采样点间隔至少1个像素,会导致实际提取的样本数为0。
操作:先将nsamples调小(比如改为1000),移除minDist参数(或设为0),测试是否能正常提取样本,再逐步调整参数至合理值。训练标签字段无效
确认train_1中的id字段是否存在,且包含非空的分类标签。若id字段为空或不存在,模型无法划分训练集,后续流程直接报错。
操作:用head(train_1@data)查看属性表,验证id字段的有效性,必要时更换为正确的分类标签字段。训练区域栅格全为NA
若kalomo2022中训练数据覆盖的区域全是NA值,无法提取有效样本。
操作:用plot(kalomo2022)查看图像范围,确认训练矢量是否落在图像有效区域内;用mask(kalomo2022, train_1)提取训练区域栅格,检查是否有非NA值。交叉验证参数冲突
开启polygonBasedCV = T时,若训练多边形数量少于kfold = 5,或单个多边形的像素量不足以支撑采样,会导致验证集采样失败,进而触发预测报错。
操作:先将polygonBasedCV设为F,测试分类流程是否正常;若正常,再开启该参数并将kfold调整为小于训练多边形数量的值。
内容的提问来源于stack exchange,提问作者Bravedo

