0

我们如何修复 a PipeOp$state使其参数或配置从一开始就固定,并在训练和预测中保持不变。

task = tsk("iris")
pos1 = po("scale", param_vals =list(
    center = T,
    scale = T,
    affect_columns = selector_name("Sepal.Width")))

pos1$state
pos1$state$center <- c(Sepal.Width = 0) 
pos1$state$scale <- c(Sepal.Width = 2) 
 
graph <- pos1 %>>% lrn("classif.xgboost", eval_metric = "mlogloss")
gl <- GraphLearner$new(graph)
gl$train(task)
gl$state

在上面的代码中,即使我尝试将它们分别固定为零和二(不确定我是否正确地这样做),参数centerscalefrom也会根据数据重新计算。po("scale")

4

1 回答 1

2

PipeOp永远不$state应该手动更改A 。即,它更像是一个日志槽,供您检查,并在其中PipeOp找到在训练后执行其预测步骤所需的所有信息。

PipeOpScale将始终将训练数据缩放为均值 0,并通过它们的均方根(参见 参考资料?scale)对其进行缩放,并存储“学习”参数(即,训练数据的均值和均方根,例如,返回的属性scale函数)作为$state. 在预测期间,数据将进行类似的转换,从而产生可能不同的均值和均方根。

假设您想在训练和预测期间缩放"Sepal.Width"均值 0 和均方根 2 (如您上面的代码所建议的那样;但这可能是一个坏主意),您可以使用:PipeOpColApply

f = function(x) {
  scale(x)[, 1] * 2 + 0
}

task = tsk("iris")
pos = po("colapply", applicator = f, affect_columns = selector_name("Sepal.Width"))

train_out = pos$train(list(task))[[1]]$data(cols = task$feature_names)
round(colMeans(train_out), 2)
round(apply(train_out, MARGIN = 2, FUN = sd), 2)

pos$state
于 2020-10-30T16:31:39.120 回答