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

R caret包train函数preProc参数问题:如何忽略因子列仅中心化缩放数值预测变量

问题:caret包train函数中preProc参数未忽略因子列

当使用R语言caret包的train()函数时,期望对预测变量执行中心化(center)和缩放(scale)操作,但自动忽略因子(factor)类型列。单独调用preProcess()函数时能正确忽略因子列,但将preProc参数嵌入train()内使用时,因子列被错误纳入了中心化和缩放处理。


单独调用preProcess()的正常情况

df <- data.frame(
    score = runif(1000, 80, 110),
    var1 = as.factor(sample(0:1, 1000, replace = TRUE)),
    var2 = runif(1000, 5, 25)
)
preProcess(df[-1], method=c('center','scale'))

输出:

Created from 1000 samples and 2 variables

Pre-processing:

  • centered (1)
  • ignored (1)
  • scaled (1)

train()函数内使用preProc的异常情况

df <- data.frame(
    score = runif(1000, 80, 110),
    var1 = as.factor(sample(0:1, 1000, replace = TRUE)),
    var2 = runif(1000, 5, 25)
)
mod <- train(score ~., data = df,
             method = "lm",
             preProc = c("center", "scale"))
mod$preProcess

输出:

Created from 1000 samples and 2 variables

Pre-processing:

  • centered (2)
  • ignored (0)
  • scaled (2)

原因与解决方案

问题原因

train()函数在处理preProc参数时,会先对因子列执行虚拟变量编码(dummy coding),将因子转换为数值型虚拟变量,之后再对所有数值型变量(包括编码后的虚拟变量)执行中心化和缩放,因此看起来因子列被纳入了处理。

解决方法

方法1:手动创建preProcess对象并指定处理列

先定义仅针对数值型预测变量的预处理规则,再传入train()函数:

# 创建预处理对象,仅处理数值型预测变量
pre_obj <- preProcess(df[, sapply(df[-1], is.numeric)], method = c("center", "scale"))

# 在train中使用该对象,同时保留因子列
mod <- train(score ~., data = df,
             method = "lm",
             preProcess = pre_obj,
             preProcOptions = list(keepFactors = TRUE))

方法2:使用recipes包精细控制预处理逻辑

通过配方系统可以针对不同类型变量设置独立的预处理规则:

library(recipes)

# 创建配方:仅对数值型预测变量执行中心化和缩放
rec <- recipe(score ~., data = df) %>%
  step_center(all_numeric_predictors()) %>%
  step_scale(all_numeric_predictors())

# 基于配方训练模型
mod <- train(rec, data = df, method = "lm")

使用上述两种方法后,预处理只会作用于数值型预测变量,因子列会被保留或忽略,符合预期需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:10:14