R 中插入符号的训练函数中的中心和比例因子预测器

问题描述 投票:0回答:1

我在使用 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)

提前致谢。

r machine-learning r-caret
1个回答
0
投票

您的调用将被分派到

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 是简单矩阵或数据框时起作用。

认为这就是他们的意思。调用此参数只是为了“简单”,这意味着所有值都具有相同类型(否则它们最终将被强制)。

© www.soinside.com 2019 - 2024. All rights reserved.