使用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
相关产品推荐
相关产品推荐

