包装器的normalizeFeatures如何与验证集一起使用?

时间:2019-11-14 13:31:58

标签: mlr

我想知道函数normalizeFeatures和重采样策略如何工作。以下哪种说法是正确的?

  1. 整个任务数据已标准化
  2. 对训练数据进行了归一化,并且使用该归一化的参数(例如,经典标准化中的均值和sd)对归一化数据进行了归一化(mlrCPO::retrafo进行了某种操作)。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:4)

可以在normalizeFeatures()data.frame对象上调用函数Task。 在两种情况下,它都相同。它只是使整个任务正常化。所以陈述1)是正确的。

如果您想获得第二个,则有两个选择:

a)preprocWrapperCaret

包装程序会将缩放比例置于训练和预测的前面。对于训练,缩放参数将被保存并应用。 对于预测,将应用保存的缩放参数。

library(mlr)
lrn = makeLearner("classif.svm")
lrn = makePreprocWrapperCaret(lrn, ppc.center = TRUE, ppc.scale = TRUE)

set.seed(1)
res = resample(lrn, iris.task, resampling = hout, models = TRUE)

# the scaling parameters learnt on the training spit
res$models[[1]]$learner.model$control$mean
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       5.831        3.030        3.782        1.222 
res$models[[1]]$learner.model$control$std
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   0.8611356    0.4118203    1.7487877    0.7710127 

b)mlrCPO

更加优雅和灵活的方法是使用mlrCPO包构建预处理管道,在这种情况下,其效果与包装器相同。

library(mlr)
library(mlrCPO)
lrn = cpoScale(center = TRUE, scale = TRUE) %>>% makeLearner("classif.svm")
set.seed(1)
res = resample(lrn, iris.task, resampling = hout, models = TRUE)
# the scaling parameters learnt on the training spit
res$models[[1]]$learner.model$retrafo$element$state
$center
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       5.831        3.030        3.782        1.222 

$scale
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   0.8611356    0.4118203    1.7487877    0.7710127 

我将种子设置为在两种情况下均获得相同的训练分割,以使两种方法的学习缩放参数相同。