【发布时间】:2021-12-30 15:42:09
【问题描述】:
在过去的几个小时里,我一直面临着一个问题。 理论上,当我们拆分数据进行训练和测试时,我们应该独立地对训练数据进行标准化,以免引入偏差,然后在训练完模型后,我们是否使用相同的“参数”值对测试集进行标准化训练集。
到目前为止,我只设法在没有管道的情况下做到了,看起来像这样:
val training = splitData(0)
val test = splitData(1)
val assemblerTraining = new VectorAssembler()
.setInputCols(training.columns)
.setOutputCol("features")
val standardScaler = new StandardScaler()
.setInputCol("features")
.setOutputCol("normFeatures")
.setWithStd(true)
.setWithMean(true)
val scalerModel = standardScaler.fit(training)
val scaledTrainingData = scalerModel.transform(training)
val scaledTestData = scalerModel.transform(test)
我将如何使用管道实现这一点? 我的问题是,如果我创建这样的管道:
val pipelineTraining = new Pipeline()
.setStages(
Array(
assemblerTraining,
standardScaler,
lr
)
)
其中 lr 是线性回归,则无法从管道内部实际访问缩放模型。
我还考虑过使用中间管道进行缩放,如下所示:
val pipelineScalingModel = new Pipeline()
.setStages(Array(assemblerTraining, standardScaler))
.fit(training)
val pipelineTraining = new Pipeline()
.setStages(Array(pipelineScalingModel,lr))
val scaledTestData = pipelineScalingModel.transform(test)
但我不知道这是否是正确的做法。
任何建议将不胜感激。
【问题讨论】:
标签: scala apache-spark pipeline apache-spark-mllib