我在使用 R caret 包的 train 函数的 preProc 参数上遇到问题。我想居中并缩放我的预测变量,但忽略因子列。当我在火车之外进行预处理时,它工作正常,但我希望在火车功能内进行预处理。我是不是错过了什么?
下面是一个示例,其中在训练之外使用 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)
这是我在火车内使用 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.formula
,通过调用函数 model.matrix(Terms, m, contrasts)
,您的数据将转换为矩阵。
由于您的数据现在采用矩阵形式,并且矩阵是原子的,因此值被强制为相同类型。在这种情况下
double
。这还有一个奇怪的副作用,即将 var1
重命名为 var11
,如果您检查 mod$preProcess
输出(例如 mod$preProcess$mean
),您可以看到这一点。不知道为什么会这样,但我认为这与你的问题无关。
看来类信息是在矩阵转换之前捕获的,并最终通过
ptype
元素输出在结果中:
sapply(mod$ptype, class)
var1 var2
"factor" "numeric"
但是,模型矩阵会传递到
train.default
,然后继续运行 preProcess()
。当到达该步骤时,因子信息已被剥离,并且该变量的类型为 double
。正如您所指出的,preProcess()
会进行一系列检查,并且仅对数字数据进行评估(数字是指它的类型为“整数”、“数字”或“双精度”),这就是为什么该列被缩放和居中的原因通过 train()
但直接致电 preProcess()
时则不然。
从
?train
的文档中指定:
预处理代码仅在 x 是简单矩阵或数据框时起作用。
我认为这就是他们的意思。调用此参数只是为了“简单”,这意味着所有值都具有相同类型(否则它们最终将被强制)。