我对使用R插入符号包的train函数的preProc参数有问题.我想集中和zoom 我的预测值,但忽略因子列.当我在train外进行预处理时,它工作正常,但我希望在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)

以下是当我在火车内部使用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()执行一系列判断,并且只对数值数据进行判断(数值的意思是它属于"integer"、"numeric"或"double"类).因此,当preProcess()通过train()被调用时,你的值已经是double,这就是为什么它们被zoom 和居中的原因.

但是,当你直接调用preProcess()时,不会进行同样的矩阵转换,因此因子类在zoom 和居中之前会被捕获并移除.

它从?trainpreProcess个参数文档中指定:

预处理代码只设计为当x是简单的矩阵或数据帧时工作.

这就是他们要说的——调用这个参数只是为了"简单",意思是所有的值都属于同一个类.如果他们不是同一个阶级,他们最终会被强迫.


长话短说,我认为你应该要么将经过预处理的数据传递给train(),要么创建一个食谱并将其传递给train(),如下所示:

library(recipe)
recipe(score ~ ., data = df) |>
  step_center(all_numeric_predictors()) |>
  step_scale(all_numeric_predictors()) |>
  train(method = "lm", data = df)

如果你走recipe路由,你应该仔细阅读文档,看看all_numeric_predictors()中是否包括了这些因素,我根本不确定.

R相关问答推荐

通过绘图 Select 线串几何体并为其着色

按R中的组查找相邻列的行累积和的最大值

在位置周围设定一个半径并识别该半径内的其他位置

使用R中相同值创建分组观测指标

如何删除gggvenn与gggplot绘制的空白?

将包含卷的底部25%的组拆分为2行

计算时间段的ECDF(R)

多个过滤器内的一个盒子在仪表板Quarto

如何根据数据帧中的值从该数据帧中提取值?

如何在R中通过多个变量创建交叉表?

QY数据的处理:如何定义QY因素的水平

汇总数据的Sheffe检验的P值(平均值和标准差)

在列表中排列R数据框中的列顺序

如何从向量构造一系列双边公式

如何将一些单元格的内容随机 Select 到一个数据框中?

为什么在写入CSV文件时Purrr::Pwalk不起作用

排序R矩阵的行和列

将某个阈值以下的列中的值分类到不同的列中,否则保持该列的原样

子样本间系数检验的比较

动态统计函数在ShinyApp内部更改