如何在R的caret包train函数中使用GAM的tensor交互函数
在caret的train函数中使用GAM的样条函数与Tensor交互项
要在caret::train()中结合GAM的样条函数s()和张量交互函数ti(),核心是直接在模型公式中显式调用mgcv包的这些函数(因为caret的method = "gam"底层依赖mgcv::gam()),具体实现如下:
完整修改代码
library(caret) library(mgcv) # 必须加载,s()和ti()是该包的核心函数 # 生成数据(简化冗余处理) set.seed(1) df <- data.frame(Y=rnorm(100), x1=rnorm(100),x2=rnorm(100), x3=rnorm(100)) # 划分训练集和测试集(用响应变量Y划分更合理) training.samples <- createDataPartition(df$Y, p = 0.8, list = FALSE) train_df <- df[training.samples, ] test_df <- df[-training.samples, ] # 设置交叉验证控制 train.control <- trainControl(method = "repeatedcv", number = 10, repeats = 2) # 显式在公式中定义GAM的样条项和张量交互项 fit_train <- train( Y ~ s(x1) + s(x2) + s(x3) + ti(x1, x2), data = train_df, method = "gam", trControl = train.control ) # 训练集与测试集预测 Prediction_train <- as.numeric(predict(fit_train, newdata = train_df, type = "raw")) Prediction_test <- as.numeric(predict(fit_train, newdata = test_df, type = "raw"))
关键说明
- 依赖
mgcv包:s()和ti()是mgcv包的专属函数,caret的gam方法只是封装了mgcv::gam(),因此必须提前加载该包。 - 公式需自定义GAM结构:当需要添加张量交互这类自定义GAM项时,不能像线性模型那样仅写变量名,必须直接在公式中使用
s()、ti()等函数,caret会自动将这些结构传递给底层的mgcv::gam()拟合。 - 数据划分优化:原代码用自变量
x1划分数据集,建议改为用响应变量Y,能保证训练集和测试集的响应变量分布更均衡。
内容的提问来源于stack exchange,提问作者Natalia
相关产品推荐
相关产品推荐

