样条是否过度拟合数据?

机器算法验证 回归 样条
2022-01-18 10:11:28

我的问题:我最近遇到了一位统计学家,他告诉我样条曲线仅对探索数据有用并且会过度拟合,因此在预测中没有用。他更喜欢用简单的多项式进行探索......因为我是样条曲线的忠实粉丝,这违背了我的直觉,我有兴趣找出这些论点的有效性,以及是否存在大量反样条曲线-激进分子在那里?

背景:当我创建模型时,我尝试遵循 Frank Harrell,回归建模策略 (1)。他认为受限三次样条是探索连续变量的有效工具。他还认为,多项式在建模某些关系方面很差,例如阈值、对数 (2)。为了测试模型的线性,他建议对样条进行 ANOVA 测试:

H0:β2=β3==βk1=0

我用谷歌搜索过样条曲线,但没有发现有多大用处(除了关于不使用太多结的一般警告)。在这个论坛中,似乎更喜欢样条建模、KolassaHarrellgung

我发现了一篇关于多项式的博客文章,这是关于预测多项式的过度拟合的恶魔。帖子以这些评论结束:

在某种程度上,这里给出的例子是作弊——多项式回归被认为是非常不鲁棒的。在实践中更好的是使用样条而不是多项式。

现在这提示我检查样条在示例中的表现:

library(rms)
p4 <- poly(1:100, degree=4)
true4 <- p4 %*% c(1,2,-6,9)
days <- 1:70

set.seed(7987)
noise4 <- true4 + rnorm(100, sd=.5)
reg.n4.4 <- lm(noise4[1:70] ~ poly(days, 4))
reg.n4.4ns <- lm(noise4[1:70] ~ ns(days,4))
dd <- datadist(noise4[1:70], days)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4[1:70] ~ rcs(days,5))

plot(1:100, noise4)
nd <- data.frame(days=1:100)
lines(1:100, predict(reg.n4.4, newdata=nd), col="orange", lwd=3)
lines(1:100, predict(reg.n4.4ns, newdata=nd), col="red", lwd=3)
lines(1:100, predict(reg.n4.4rcs_ols, newdata=nd), col="darkblue", lwd=3)

legend("top", fill=c("orange", "red","darkblue"), 
       legend=c("Poly", "Natural splines", "RCS - ols"))

给出以下图像:

样条和多项式的比较

总之,我没有发现太多可以说服我重新考虑样条曲线的东西,我错过了什么?

  1. FE Harrell,回归建模策略:应用于线性模型、逻辑回归和生存分析,精装第 1 版的精装版重印。2001. 施普林格,2010。
  2. FE Harrell、KL Lee 和 BG Pollock,“临床研究中的回归模型:确定预测因子和反应之间的关系”,JNCI J Natl Cancer Inst,第一卷。80,没有。15,第 1198-1202 页,1988 年 10 月。

更新

这些评论让我想知道在数据范围内会发生什么但曲线不舒服。在大多数情况下,我不会超出数据边界,如上面的示例所示。我不确定这是否符合预测...

无论如何,这是一个示例,我创建了一条无法转换为多项式的更复杂的线。由于大多数观察结果都位于数据的中心,因此我也尝试对其进行模拟:

library(rms)
cmplx_line <-  1:200/10
cmplx_line <- cmplx_line + 0.05*(cmplx_line - quantile(cmplx_line, .7))^2
cmplx_line <- cmplx_line - 0.06*(cmplx_line - quantile(cmplx_line, .3))^2
center <- (length(cmplx_line)/4*2):(length(cmplx_line)/4*3)
cmplx_line[center] <- cmplx_line[center] + 
    dnorm(6*(1:length(center)-length(center)/2)/length(center))*10

ds <- data.frame(cmplx_line, x=1:200)

days <- 1:140/2

set.seed(1234)
sample <- round(rnorm(600, mean=100, 60))
sample <- sample[sample <= max(ds$x) & 
                     sample >= min(ds$x)]
sample_ds <- ds[sample, ]

sample_ds$noise4 <- sample_ds$cmplx_line + rnorm(nrow(sample_ds), sd=2)
reg.n4.4 <- lm(noise4 ~ poly(x, 6), data=sample_ds)
dd <- datadist(sample_ds)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4 ~ rcs(x, 7), data=sample_ds)
AIC(reg.n4.4)

plot(sample_ds$x, sample_ds$noise4, col="#AAAAAA")
lines(x=ds$x, y=ds$cmplx_line, lwd=3, col="black", lty=4)

nd <- data.frame(x=ds$x)
lines(ds$x, predict(reg.n4.4, newdata=ds), col="orange", lwd=3)
lines(ds$x, predict(reg.n4.4rcs_ols, newdata=ds), col="lightblue", lwd=3)

legend("bottomright", fill=c("black", "orange","lightblue"), 
       legend=c("True line", "Poly", "RCS - ols"), inset=.05)

这给出了以下情节:

更复杂的非多项式线图

更新 2

自从这篇文章以来,我发表了一篇文章,研究大型数据集上年龄的非线性。补充比较了不同的方法,我写了一篇关于它的博客文章。

2个回答

过度拟合来自于允许过大的一类模型。这对于具有连续参数的模型(如样条曲线和多项式)来说有点棘手,但如果你将参数离散化为一些不同的值,你会发现增加节点/系数的数量会以指数方式增加可用模型的数量. 对于每个数据集,只要您允许足够的系数/结,就有一个精确拟合的样条曲线和一个多项式。可能具有三个结的样条曲线比具有三个系数的多项式更适合,但这并不是一个公平的比较。

如果您的参数数量较少且数据集较大,则可以合理地确定您没有过度拟合。如果您想尝试更多数量的参数,您可以尝试在测试集中进行交叉验证以找到最佳数量,或者您可以使用诸如最小描述长度之类的标准。

编辑:根据评论中的要求,一个如何应用 MDL 的示例。首先,您必须处理数据是连续的这一事实,因此它不能用有限代码表示。为了简单起见,我们将数据空间分割成边的盒子,而不是描述数据点,我们将描述数据落入的盒子。这意味着我们失去了一些准确性,但我们可以使任意小,所以它并不重要。ϵϵ

现在,任务是在一些多项式的帮助下尽可能简洁地描述数据集。首先我们描述多项式。如果它是一个 n 阶多项式,我们只需要存储 (n+1) 个系数。同样,我们需要离散化这些值。之后,我们需要首先将值存储在无前缀编码中(这样我们就知道何时停止读取),然后是nn+1参数值。有了这些信息,我们代码的接收者可以恢复多项式。然后我们添加存储数据集所需的其余信息。对于每个数据点,我们给出 x 值,然后数据点向上或向下多少个框位于多项式之外。我们将这两个值都存储在无前缀编码中,因此短值需要很少的位,并且我们不需要点之间的分隔符。(您可以通过仅存储值之间的增量来缩短 x 值的代码)

这里的基本点是权衡。如果我选择一个 0 阶多项式(如 f(x) = 3.4),那么模型的存储非常简单,但对于 y 值,我本质上是存储到平均值的距离。更多的系数给了我一个更好的拟合多项式(因此 y 值的代码更短),但我必须花费更多的位来描述模型。为您的数据提供最短代码的模型最符合 MDL 标准。

(请注意,这被称为“粗 MDL”,您可以进行一些改进来解决各种技术问题)。

统计学家多年来一直在争论多项式拟合,根据我的经验,它归结为:

样条曲线基本上是一系列不同的方程拼凑在一起,这往往会增加插值的准确性,但代价是投影数据范围之外的能力。如果您知道您的数据是纯净的并且来自一致的来源,并且如果您试图描述不同值在您的值范围内存在的可能性,那么这很好。但是,我们通常不会对驱动数据的理论基础了解太多,因为当旧样条停止准确描述数据时,新样条就会开始。这使得对我们数据之外的值的预测几乎毫无价值。

现在,样条曲线在这方面并不是唯一的。如果我们只是拟合数据而不使用理论框架来选择变量,多项式函数实际上会遇到同样的问题。那些拥有完善的理论来驱动允许哪些变量发生变化以及变化多少的人将更加相信复杂多项式函数在数据之外推断预测的能力。

然而,许多统计学家在没有预先建立的理论框架的帮助下处理数据,这将一些人推向了简单的多项式。他们认为适合数据的不太灵活的函数更有可能准确预测数据之外的值,因为该函数不太可能受到数据内异常的影响。虽然我和喜欢简单多项式的人讨论过这个问题,但我从来没有感觉到反样条组。感觉更像是简单的多项式让一些统计学家对避免过度拟合感到更自在。

免责声明

就个人而言,我不倾向于对我的大部分数据使用样条曲线或简单的多项式,因为我在一个具有许多预先建立的理论框架的领域工作。此外,我通常会观察数据的收集,并且可以很好地掌握推动结果的因素。在这种情况下,我正在构建更多的逻辑算法并测试算法的适应度,而不是测试多项式函数的适应度。您可以在我的答案中添加这一粒盐。