如何修复 PipeOP 的状态?

How to fix PipeOP's state?

我们如何修复 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

在上面的代码中,po("scale") 中的参数 centerscale 是根据数据重新计算的,即使我试图将它们固定为零和二(不确定是否我做对了),分别。

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

PipeOpScale 将始终将训练数据缩放为均值 0 并按它们的 root-mean-square 缩放它们(参见 ?scale)并存储“学习”参数(即均值和 root-mean-square 的训练数据,例如 scale 函数返回的属性)作为 $state。在预测期间,数据将被类似地转换,导致可能不同的均值和 root-mean-square.

假设你想在训练和预测期间将 "Sepal.Width" 缩放为 0 和 root-mean-square 2 both(如上面代码所建议的;但这可能是个坏主意),你可以使用 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