【问题标题】:Is cross-validation faster without using pipelines in spark-ml?如果不使用 spark-ml 中的管道,交叉验证会更快吗?
【发布时间】:2018-12-31 21:33:54
【问题描述】:

假设我的特征工程有很多步骤:我的管道中有很多转换器。我想知道 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. 中,我可以在 LogisticRegression 之前在管道中使用 Cacher 转换器。 (缓存器见Caching intermediate results in Spark ML pipeline

【问题讨论】:

  • 第二种方法是错误的。您首先转换您的数据,然后进行交叉验证,这会将已转换的数据拆分为训练和测试,并将其用于预测,这将导致有关测试数据的数据泄露给 LR。第一种方法是正确的。
  • @VivekKumar 我们同意这取决于变压器吗?只有当transformer 将train 中的信息放入test 时才会有数据泄漏,并非所有transformer(例如StringIndexer)都如此
  • 是的。如果变压器在fit() 期间没有存储任何有关数据的信息,那么我会说它是安全的。

标签: pyspark pipeline cross-validation apache-spark-ml


【解决方案1】:

我已经做了实验,但如果有人能给出更详细的答案,我仍然很感兴趣。

%%time
pipeline1 = Pipeline(stages=stringIndexers+oneHotEncoders+[vectorAssembler])
train2 = pipeline1.fit(train).transform(train)
crossval = CrossValidator(estimator=logisticRegression, ...)
crossval.fit(train2)

CPU 时间:用户 508 毫秒,系统:136 毫秒,总计:644 毫秒/挂墙时间:2 分 2 秒

%%time
pipeline1 = Pipeline(stages=stringIndexers+oneHotEncoders+[vectorAssembler])
train2 = pipeline1.fit(train).transform(train)
train2.cache().count()
crossval = CrossValidator(estimator=logisticRegression, ...)
crossval.fit(train2)

CPU 时间:用户 560 毫秒,系统:104 毫秒,总计:664 毫秒/挂墙时间:1 分钟 25 秒

%%time
pipeline2 = Pipeline(stages=stringIndexers+oneHotEncoders+[vectorAssembler, logisticRegression])
crossval = CrossValidator(estimator=pipeline2, ...)
crossval.fit(train)

CPU 时间:用户 2.06 秒,系统:504 毫秒,总计:2.56 秒/挂墙时间:3 分钟

【讨论】:

    【解决方案2】:

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

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 2016-02-04
      • 2017-08-24
      • 2015-06-22
      • 2021-03-25
      • 2020-03-07
      • 2017-11-16
      • 2020-09-16
      • 2016-10-21
      相关资源
      最近更新 更多