我正在为数百个物种生成物种分布模型,其中包含 45 个特征的 vrt 堆栈,总计约 110GiB。这些模型以 0-1 的范围预测合适栖息地的概率,其中 < 0.5 is unsuitable and > 0.5 是合适的。对于每个物种的
randomForest
模型,只有一个特征子集(gen. < 20) are used. Currently, predicting the predicted probabilities onto .tifs takes 4-9 hours depending on the domain and number of terms.
我一直将预测直接写入磁盘ala:
terra::predict(
x, y, cpkgs="randomForest", type = 'prob', ncores = parallel::detectCores(), filename = 'example.tif', ...))
所以我希望可以仅预测单个类别的概率。
可以在 terras ?predict 中找到一个 mre 示例,在末尾添加图来说明所需的结果。
library(terra)
library(randomForest)
logo <- rast(system.file("ex/logo.tif", package="terra"))
names(logo) <- c("red", "green", "blue")
p <- matrix(c(48, 48, 48, 53, 50, 46, 54, 70, 84, 85, 74, 84, 95, 85,
66, 42, 26, 4, 19, 17, 7, 14, 26, 29, 39, 45, 51, 56, 46, 38, 31,
22, 34, 60, 70, 73, 63, 46, 43, 28), ncol=2)
a <- matrix(c(22, 33, 64, 85, 92, 94, 59, 27, 30, 64, 60, 33, 31, 9,
99, 67, 15, 5, 4, 30, 8, 37, 42, 27, 19, 69, 60, 73, 3, 5, 21,
37, 52, 70, 74, 9, 13, 4, 17, 47), ncol=2)
xy <- rbind(cbind(1, p), cbind(0, a))
# extract predictor values for points
e <- extract(logo, xy[,2:3])
# combine with response (excluding the ID column)
v <- data.frame(cbind(pa=xy[,1], e))
rm(p, a, xy, e)
### with two output variables (probabilities for each class)
v$pa <- as.factor(v$pa)
rfm2 <- randomForest(formula=pa~., data=v)
rfp <- predict(logo, rfm2, cores=2, type="prob", cpkgs="randomForest")
plot(rfp) # showing probabilities for both classes
plot(sum(rfp)) # obviously in binary classification the probabilities sum to 1
plot(subset(rfp, 2)) # interested in only one of the probabilities!!
可以看出,
predict
的默认行为有点多余——这对于大多数应用程序来说并不重要。
我相信我可以通过仅在内存中进行预测,然后写出单个栅格来加快该过程。
rfp <- terra::subset(
terra::predict(logo, rfm2, cores=2, type="prob", cpkgs="randomForest"),
2)
# terra::writeRaster(rfp)
但是,我想知道是否可以通过仅返回单个类别的概率来加快内存中的预测或(希望)直接到磁盘的预测?
我对
predict
的了解还不够,除了对输出进行子集化之外,无法得出暂定解决方案。我认为两类概率的实际计算都非常快,但考虑到数据的大小,它会产生显着的差异。
(P.S.关于GIS,我怀疑更严重的速率限制步骤可能会将VRT的值拉入内存,它们现在正在从HDD转移到SDD)。
您可以围绕 randomForest
predict
函数创建一个包装器,如下所示:
f <- \(...) predict(...)[,1]
rfp <- predict(logo, rfm2, cores=2, type="prob", cpkgs="randomForest", fun=f)