如何在tidymodels中生成独立列形式的ispline特征?
在tidymodels中生成独立的I-spline特征列
你遇到的嵌套问题是因为model.matrix()返回的矩阵在step_mutate()中会被作为单个列存入数据框,而非拆分后的独立列。解决这个问题最简洁的方式是使用tidymodels生态中recipes包提供的专门样条步骤函数,而非手动调用model.matrix()。
推荐方案:使用step_spline_is()
step_spline_is()是recipes包中专门用于生成I-spline特征的步骤,它会自动将样条特征拆分为独立列,完美适配后续的bake()操作。
代码示例
library(tidymodels) data(mtcars) # 创建包含I-spline特征的recipe spline_rec <- recipe(mpg ~ ., data = mtcars) %>% # 对disp变量生成df=5的I-spline特征,可选择保留原变量(keep_original=TRUE) step_spline_is(disp, df = 5, keep_original = FALSE) # 预处理recipe并生成结果 prepped_rec <- prep(spline_rec) bake(prepped_rec, new_data = NULL) %>% head()
执行后,你会得到命名为disp_splines_1到disp_splines_5的独立列,每个列对应一个I-spline特征。
备选方案:手动展开嵌套列(不推荐)
如果你一定要用step_mutate()结合model.matrix(),可以配合unnest_wider()将嵌套的矩阵列拆分为独立列,但这种方式不如专门的样条步骤简洁,且容易引入额外问题:
alt_rec <- recipe(mpg ~ ., data = mtcars) %>% step_mutate( # 将model.matrix结果转换为tibble,方便后续展开 splines = as_tibble(model.matrix(~ isp(disp, df=5) - 1)) ) %>% # 展开嵌套的splines列 unnest_wider(splines) bake(prep(alt_rec), new_data = NULL) %>% head()
总结
优先使用step_spline_is(),它是tidymodels官方推荐的样条特征生成方式,能更好地与其他预处理步骤兼容,且无需手动处理嵌套问题。
内容的提问来源于stack exchange,提问作者Demetri Pananos
相关产品推荐
相关产品推荐

