首页 > 解决方案 > 如果不使用 spark-ml 中的管道,交叉验证会更快吗?

问题描述

假设我的特征工程有很多步骤:我的管道中有很多转换器。我想知道 Spark 在管道的交叉验证期间如何处理这些转换器:它们是否为每个折叠执行?在交叉验证模型之前应用转换器会更快吗?

以下哪个工作流程最快(或有更好的解决方案)?:

1.管道上的交叉验证器

transformer1 = ...
transformer2 = ...
transformer3 = ...
lr = LogisticRegression(...)
pipeline = Pipeline(stages=[transformer1, transformer2, transformer3, lr])
crossval = CrossValidator(estimator=pipeline, numFolds=10, ...)

cvModel = crossval.fit(training)
prediction = cvModel.transform(test)

2.流水线后交叉验证器

transformer1 = ...
transformer2 = ...
transformer3 = ...
pipeline = Pipeline(stages=[transformer1, transformer2, transformer3])
training_trans = pipeline.fit(training).transform(training)

lr = LogisticRegression(...)
crossval = CrossValidator(estimator=lr, numFolds=10, ...)

cvModel = crossval.fit(training_trans)
prediction = cvModel.transform(test)

最后,我对使用缓存有同样的问题:在2.我可以在进行交叉验证之前缓存 training_trans。在1.Cacher我可以在 LogisticRegression 之前在管道中使用变压器。(请参阅在 Spark ML 管道中为 Cacher缓存中间结果)

标签: pysparkpipelinecross-validationapache-spark-ml

解决方案


根据我最近参加的 spark.ml 培训 - 建议遵循这种方法:

cv = CrossValidator(estimator=lr,..)
pipelineModel = Pipeline(stages=[idx,assembler,cv])
cv_model= pipelineModel.fit(train)

希望这可以帮助!


推荐阅读