You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

低样本量下tidySDM与SpatialSample实现Jackknife交叉验证的参数问题

极低样本量下用tidySDM实现留一法交叉验证的正确方式

问题背景

处理仅含10-15个存在点的物种分布模型(SDM)数据集,需用留一法(Jackknife)交叉验证替代随机k折。使用tidySDM依赖的spatial_leave_location_out_cv函数时,对group参数的传入值存在困惑:

  • 传入Class列(区分存在/背景点)时模型运行失败
  • 传入Geometry列时计算量过大,运行超8小时未完成

核心原理

留一法的核心是逐个剔除每个存在点,用剩余存在点+全部背景点训练模型,再用被剔除的存在点测试。因此group参数需要:

  • 给每个存在点分配唯一的分组ID(确保每次仅剔除一个存在点)
  • 给所有背景点分配同一个分组ID(避免背景点被单独剔除,减少不必要的计算)

正确实现步骤

  1. 新增分组列:为每个存在点生成唯一标识,背景点统一归为一组
  2. 指定折数v为存在点的数量(留一法的折数等于存在点总数)
  3. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:49:55