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

使用MARS算法的Earth函数运行报错,请求技术协助

排查earth包训练模型时的NA/NaN/Inf报错问题

我之前也碰到过类似的earth包报错情况,结合你的描述,咱们一步步拆解可能的原因和排查方法:

1. 高次交互项导致的数值溢出(最可能的原因)

你设置了degree=4,earth会自动生成特征的高次项和交互项(比如x1^4、x1*x2^3这类组合)。哪怕原始特征看起来完全正常,但如果某个特征本身数值较大,四次方后就可能超出R的数值范围,变成Inf;或者多个大数值特征的交互项相乘后溢出成NaN。

验证方法:

  • 先把degree调低到2,重新运行模型:
    EarthAlgo<-earth(cible~., data=train, degree=2, glm=list(family=binomial))
    
    如果不报错,那基本可以确定是高次项的数值溢出问题。
  • 对所有数值型特征做标准化处理后再训练:
    # 标准化除了cible以外的数值列
    num_cols <- sapply(train, is.numeric)
    num_cols["cible"] <- FALSE
    train_scaled <- train
    train_scaled[, num_cols] <- scale(train_scaled[, num_cols])
    
    # 重新训练模型
    EarthAlgo<-earth(cible~., data=train_scaled, degree=4, glm=list(family=binomial))
    

2. 隐藏的异常值/缺失值

有时候表面看最后两行数据没异常,但可能存在隐形的NaN/Inf,或者极端极值:

  • 用以下代码检查整个训练集的异常值:
    # 检查所有列的NA/NaN/Inf
    sapply(train, function(x) any(is.na(x) | is.infinite(x)))
    # 查看数值列的极值
    summary(train[sapply(train, is.numeric)])
    
  • 另外,检查因子变量的水平分布:如果最后两行的某个因子水平在整个数据集里只有这两行存在,生成交互项时也可能触发计算问题,用table(train$你的因子列名)查看分布。

3. 追踪模型训练的中间过程

给earth函数加上trace=1参数,打印训练时的中间步骤,能看到具体处理到哪一步报错:

EarthAlgo<-earth(cible~., data=train, degree=4, glm=list(family=binomial), trace=1)

这样可以定位到是处理哪一行或哪组特征时出现的问题,缩小排查范围。

4. 单独验证最后两行数据

把最后两行单独拿出来训练模型,看是否会触发同样的报错:

test_last_two <- tail(train, 2)
EarthAlgo_test <- earth(cible~., data=test_last_two, degree=4, glm=list(family=binomial))
  • 如果这个测试也报错,说明这两行的特征组合生成高次项时必然出问题;
  • 如果不报错,那可能是这两行和前面的数据组合后,生成了特殊的交互项导致溢出。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:13:56