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

R中mgcv包多项式GAM的步长失败与迭代限制问题排查

多项式GAM模型步长失败警告的成因与解决方法

问题背景

我有一个包含40个站点(经纬度)、2个年龄段、2种性别、6个词汇、6个编码为0-5的因变量声音类别的数据集,模拟代码如下:

sound         <- sample(0:5, size=960, replace=T)
word          <- as.factor(rep(c('alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot'), each=4))
age           <- as.factor(rep(c('young', 'old'), times=480))
gender        <- as.factor(rep(c('female', 'female', 'male', 'male'), times=240))
long          <- rep(c(runif(40)), each=24)
lat           <- rep(c(runif(40)), each=24)
pronunciation <- data.frame(sound, word, age, gender, long, lat)

我用mgcv包运行简单多项式GAM模型,代码如下:

library(mgcv)

multinom = gam(list(sound ~ word + s(long, lat),
                          ~ word + s(long, lat),
                          ~ word + s(long, lat),
                          ~ word + s(long, lat),
                          ~ word + s(long, lat)),
                          data=pronunciation, family=multinom(K=5))

模型运行正常,但当我按声音类别的实际概率采样时:

sound <- sample(0:5, size=960, prob=c(0.17, 0.31, 0.21, 0.28, 0.02, 0.03), replace=T)

会出现两种警告之一(或无警告):

Warning message:
In newton(lsp = lsp, X = G$X, y = G$y, Eb = G$Eb, UrS = G$UrS, L = G$L, :
Iteration limit reached without full convergence - check carefully

Warning message:
In newton(lsp = lsp, X = G$X, y = G$y, Eb = G$Eb, UrS = G$UrS, L = G$L, :
Fitting terminated with step failure - check results carefully

我的实际数据仅出现步长失败警告,想知道:

  1. 步长失败的成因是什么?
  2. 是否可以通过调整模型解决,还是需要修改数据?

回答

一、步长失败的成因

  • 类别极端不平衡:采样概率中类别4、5的占比仅2%和3%,属于极稀有类别。这类数据提供的信息极少,模型参数估计的方差极大,牛顿迭代法在更新参数时容易出现步长过大或方向偏差,导致迭代无法找到可行的更新路径,触发步长失败警告。
  • 统一模型结构适配性差:当前模型对所有类别使用完全相同的结构(word + s(long, lat)),但稀有类别和协变量的关系可能与常见类别差异极大,强行用统一结构拟合会增加迭代的不稳定性。
  • 迭代算法的敏感性:mgcv中多项式GAM采用的牛顿-Raphson迭代对初始值和数据分布敏感,当数据存在极端不平衡时,算法容易陷入局部最优或无法收敛。

二、解决方法:优先调整模型,必要时处理数据

模型调整方案

  1. 调整迭代控制参数:在gam()函数中增加迭代次数、限制最小步长,给算法更多收敛空间:
multinom = gam(list(sound ~ word + s(long, lat),
                          ~ word + s(long, lat),
                          ~ word + s(long, lat),
                          ~ word + s(long, lat),
                          ~ word + s(long, lat)),
                          data=pronunciation, family=multinom(K=5),
                          control=gam.control(maxit=100, epsilon=1e-6, step.min=0.01))

通过maxit提高迭代上限,step.min设置更小的最小步长,降低步长搜索失败的概率。
2. 差异化模型结构:针对稀有类别简化模型结构,比如去掉空间平滑项(稀有类别可能没有足够数据支撑复杂的空间效应):

multinom = gam(list(sound ~ word + s(long, lat),
                               ~ word + s(long, lat),
                               ~ word + s(long, lat),
                               ~ word + s(long, lat),
                               ~ word),  # 类别5仅保留word效应
                               data=pronunciation, family=multinom(K=5))
  1. 使用更稳健的拟合函数:用bam()代替gam(),bam()默认采用更适合不稳定拟合场景的优化算法,对不平衡数据的兼容性更好。
  2. 调整参考类别:将占比最高的类别(比如类别1,占比31%)设为参考类别,帮助算法更稳定地估计其他类别的相对概率。

数据处理方案(仅模型调整无效时)

  • 合并稀有类别:如果业务逻辑允许,将类别4和5合并为“其他”类别,降低数据不平衡程度。
  • 过采样稀有类别:对类别4、5的样本进行重复采样,增加其数据量,但需注意后续需验证模型是否过拟合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:04:54