【发布时间】: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