使用P-splines拟合数据时,是否需要将数据集分为验证集和测试集?
When using P-splines to fit data, does the dataset need to be divided into validation set and testing set?
我正在通过一维数据集中的 p 样条曲线(使用基本 b 样条曲线)进行曲线拟合。我苦苦挣扎的是,几乎在每个回归模型中,都必须将数据集划分为验证集和测试集,以查看数据是否拟合良好或过拟合。但在 p-splines(R 中的#mgcv#)中,它使用 GCV 或 AIC 来控制节点的位置和数量,以防止过度拟合并生成最佳的 lambda(或节点)。在这种情况下,我不太确定是否需要划分数据集。如果需要,划分数据集和不划分数据集有什么区别?因为我读了这篇论文,它说惩罚将有助于防止过度拟合。
以及如何测试拟合是否良好?由于 GCV 仅表明我选择了此模型中的最佳结果。
我尝试使用 R 中的#mgcv# 包来进行拟合。代码如下:
dataset <- read.csv("bsplinesforR.csv", header = TRUE)
x <- dataset[,2]
y <- dataset[,4]
vdist <- hdist <- 0.2
layout( matrix(1:4, 2, 2, byrow=TRUE), widths=c(10,10), heights=c(10, 10))
par(mar= c(vdist, 4, 3, hdist))
library(gamlss)
gamlss.ps<- gamlss( y~pb(x), control=gamlss.control(trace=FALSE))
detach("package:gamlss")
library(mgcv)
mgcv.ps <- gam(y~s(x,bs="ps"), method = "GCV.Cp")
t.gl <- predict(gamlss.ps)
t.g <- predict(mgcv.ps)
lines(x, t.gl,col=2, lwd=2)
lines(x, t.g,col=3, lwd=2)
legend(5, 600, c("Real", "gamlss", "mgcv"), col=c(1, 2, 3), lty=c(2, 1, 1), bty="n")
layout(matrix(1, 1, 1))
legend("topright", "p-splines: default values", col=1 ,lty=0, bty="n")
Family: gaussian
Link function: identity
Formula:
y ~ s(x, bs = "ps")
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 327.182 4.945 66.17 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(x) 5.294 6.123 214.5 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
R-sq.(adj) = 0.961 Deviance explained = 96.4%
GCV = 1518.4 Scale est. = 1344.7 n = 55
GCV 是 mgcv 中选择平滑度参数的默认方式。这是执行此操作的几种方法之一。 GCV 是默认值,因为当 Simon Wood 提出他通过惩罚样条估计 GAM 的想法时,这是可用的最佳选项。此后的研究结果表明,GCV 可以降低数据的平滑度,因为 GCV 分数的轮廓可以在最佳分数附近变得非常平坦;由于 GCV 得分曲线的平坦度,从已知模型中提取的数据的轻微变化可能会产生非常不同的平滑度参数选择值。
REML 或 ML 平滑度选择,其中 GAM 被估计为具有与随机效应方差参数相关的平滑度参数的混合效应模型,两者都被证明比 GCV 工作得更好,对欠平滑敏感得多。理想情况下,您应该使用 method = "REML"
或 method = "ML"
.
在 mgcv 中拟合 GAM
在大多数使用 mgcv 拟合的 GAM 应用中,您不会对数据进行拆分采样。或者至少你必须非常小心你如何做,因为你必须从协变量创建基础并且你要小心不要推断。还有一些其他问题; CV a GAM 需要很多时间,并且该过程对于协变量的正交变换不是不变的。
如果您担心过度拟合,可以通过多种方法获得更平滑的模型。一种是应用 一个标准误差 规则,其中我们选择在所选值的一个标准误差范围内的平滑度参数。请参阅 ?one.se.rule
了解如何执行此操作。
另一种选择是双重交叉验证;使用 GCV 并设置 gamma = 1.5
。在此过程中,发生的事情是选择平滑参数以最小化模型中包含这些观察值和排除它们时的响应预测值之间的差异;即,当您在模型中包含观测值时,以最小化模型变化的方式选择平滑度参数。
我正在通过一维数据集中的 p 样条曲线(使用基本 b 样条曲线)进行曲线拟合。我苦苦挣扎的是,几乎在每个回归模型中,都必须将数据集划分为验证集和测试集,以查看数据是否拟合良好或过拟合。但在 p-splines(R 中的#mgcv#)中,它使用 GCV 或 AIC 来控制节点的位置和数量,以防止过度拟合并生成最佳的 lambda(或节点)。在这种情况下,我不太确定是否需要划分数据集。如果需要,划分数据集和不划分数据集有什么区别?因为我读了这篇论文,它说惩罚将有助于防止过度拟合。
以及如何测试拟合是否良好?由于 GCV 仅表明我选择了此模型中的最佳结果。
我尝试使用 R 中的#mgcv# 包来进行拟合。代码如下:
dataset <- read.csv("bsplinesforR.csv", header = TRUE)
x <- dataset[,2]
y <- dataset[,4]
vdist <- hdist <- 0.2
layout( matrix(1:4, 2, 2, byrow=TRUE), widths=c(10,10), heights=c(10, 10))
par(mar= c(vdist, 4, 3, hdist))
library(gamlss)
gamlss.ps<- gamlss( y~pb(x), control=gamlss.control(trace=FALSE))
detach("package:gamlss")
library(mgcv)
mgcv.ps <- gam(y~s(x,bs="ps"), method = "GCV.Cp")
t.gl <- predict(gamlss.ps)
t.g <- predict(mgcv.ps)
lines(x, t.gl,col=2, lwd=2)
lines(x, t.g,col=3, lwd=2)
legend(5, 600, c("Real", "gamlss", "mgcv"), col=c(1, 2, 3), lty=c(2, 1, 1), bty="n")
layout(matrix(1, 1, 1))
legend("topright", "p-splines: default values", col=1 ,lty=0, bty="n")
Family: gaussian
Link function: identity
Formula:
y ~ s(x, bs = "ps")
Parametric coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 327.182 4.945 66.17 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Approximate significance of smooth terms:
edf Ref.df F p-value
s(x) 5.294 6.123 214.5 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
R-sq.(adj) = 0.961 Deviance explained = 96.4%
GCV = 1518.4 Scale est. = 1344.7 n = 55
GCV 是 mgcv 中选择平滑度参数的默认方式。这是执行此操作的几种方法之一。 GCV 是默认值,因为当 Simon Wood 提出他通过惩罚样条估计 GAM 的想法时,这是可用的最佳选项。此后的研究结果表明,GCV 可以降低数据的平滑度,因为 GCV 分数的轮廓可以在最佳分数附近变得非常平坦;由于 GCV 得分曲线的平坦度,从已知模型中提取的数据的轻微变化可能会产生非常不同的平滑度参数选择值。
REML 或 ML 平滑度选择,其中 GAM 被估计为具有与随机效应方差参数相关的平滑度参数的混合效应模型,两者都被证明比 GCV 工作得更好,对欠平滑敏感得多。理想情况下,您应该使用 method = "REML"
或 method = "ML"
.
在大多数使用 mgcv 拟合的 GAM 应用中,您不会对数据进行拆分采样。或者至少你必须非常小心你如何做,因为你必须从协变量创建基础并且你要小心不要推断。还有一些其他问题; CV a GAM 需要很多时间,并且该过程对于协变量的正交变换不是不变的。
如果您担心过度拟合,可以通过多种方法获得更平滑的模型。一种是应用 一个标准误差 规则,其中我们选择在所选值的一个标准误差范围内的平滑度参数。请参阅 ?one.se.rule
了解如何执行此操作。
另一种选择是双重交叉验证;使用 GCV 并设置 gamma = 1.5
。在此过程中,发生的事情是选择平滑参数以最小化模型中包含这些观察值和排除它们时的响应预测值之间的差异;即,当您在模型中包含观测值时,以最小化模型变化的方式选择平滑度参数。