我确定我在理解Spark ML的管道方面存在差距。
我有一个针对一组数据进行训练的管道,其模式为“标签”,“注释”(两个字符串)。我的管道转换了“标签”,添加了“ indexedLabel”,并通过标记化然后HashingTF
(以“ vectorizedComment”结尾)对“注释”进行了矢量化处理。管道以LogisticRegression
结尾,标签列为“ indexedLabel”以及“ vectorizedComment”的功能列。
效果很好!我可以适应我的管道并获得一个管道模型,该模型可以整天用“ label”,“ comment”转换数据集! 但是,我的目标是能够抛出仅“评论”的数据集,因为“标签”仅用于训练模型目的。
我有信心在理解管道预测的工作原理方面存在差距-有人可以为我指出这一点吗?
答案 0 :(得分:1)
标签的转换可以在管道外部(即之前)进行。仅在培训期间才需要标签,而在管道/模型的实际使用中则不需要标签。通过在管道中执行标签转换,任何数据帧都需要具有不希望的标签列。
小例子:
val indexer = new StringIndexer()
.setInputCol("label")
.setOutputCol("indexedLabel")
val df2 = indexer.fit(df).transform(df)
// Create pipeline with other stages and use df2 to fit it
或者,您可以有两个单独的管道。一种包括在训练过程中使用的标签转换,另一种没有标签转换。确保其他阶段在两个管道中引用相同的对象。
val indexer = new StringIndexer()
.setInputCol("label")
.setOutputCol("indexedLabel")
// Create feature transformers and add to the pipelines
val pipelineTraining = new Pipeline().setStages(Array(indexer, ...))
val pipelineUsage = new Pipeline().setStages(Array(...))