低样本量下tidySDM与SpatialSample实现Jackknife交叉验证的参数问题
极低样本量下用tidySDM实现留一法交叉验证的正确方式
问题背景
处理仅含10-15个存在点的物种分布模型(SDM)数据集,需用留一法(Jackknife)交叉验证替代随机k折。使用tidySDM依赖的spatial_leave_location_out_cv函数时,对group参数的传入值存在困惑:
- 传入
Class列(区分存在/背景点)时模型运行失败 - 传入
Geometry列时计算量过大,运行超8小时未完成
核心原理
留一法的核心是逐个剔除每个存在点,用剩余存在点+全部背景点训练模型,再用被剔除的存在点测试。因此group参数需要:
- 给每个存在点分配唯一的分组ID(确保每次仅剔除一个存在点)
- 给所有背景点分配同一个分组ID(避免背景点被单独剔除,减少不必要的计算)
正确实现步骤
- 新增分组列:为每个存在点生成唯一标识,背景点统一归为一组
- 指定折数
v为存在点的数量(留一法的折数等于存在点总数) - 调用
spatial_leave_location_out_cv函数
代码示例
# 加载必要包 library(dplyr) library(sf) library(SpatialSample) # 为数据添加交叉验证分组列 dive.vars1 <- dive.vars1 %>% mutate( cv_group = case_when( # 假设Class列中"presence"是存在点标识,根据实际值修改 Class == "presence" ~ as.character(row_number()), TRUE ~ "background" ) ) # 统计存在点数量,作为留一法的折数 n_presence <- sum(dive.vars1$Class == "presence") # 执行留一法交叉验证 dive.cv <- spatial_leave_location_out_cv( data = dive.vars1, group = cv_group, v = n_presence ) # 可视化交叉验证分组 autoplot(dive.cv)
错误原因解析
- 传入
Class列:仅生成"存在/背景"两个分组,不符合留一法逐个剔除存在点的要求,导致模型运行逻辑错误 - 传入
Geometry列:每个空间点被视为独立分组,生成10010折交叉验证,计算量呈指数级增长,因此运行耗时极长
内容的提问来源于stack exchange,提问作者Garrett Gimbel
相关产品推荐
相关产品推荐

