首页 > 解决方案 > 在 PySpark 中具有多个管道的 CrossValidation/TrainValidationSplit

问题描述

我正在尝试评估 PySpark 中的多个管道。我可以在每个单独的 CV/TVS 中完成它,但我想只在一个中完成它,所以它直接为我提供了最好的模型,我不知道如何让它工作。

lr_assembler并且assemblerVectorAsembler(不同特征选择)的 2 个实例。

pca、和是lrrf和的gbt实例。PCALinearRegressionRandomForestRegressorGBTRegressor

管道定义:

pipeline = Pipeline()

lr_stages = [lr_assembler, pca, lr]
rf_stages = [assembler, rf]
gbt_stages = [assembler, gbt]

lr_pipeline = Pipeline(stages=lr_stages)
rf_pipeline = Pipeline(stages=rf_stages)
gbt_pipeline = Pipeline(stages=gbt_stages)

参数映射定义:

lr_grid = ParamGridBuilder().baseOn({pipeline.stages:lr_stages})\
                            .addGrid(pca.k, [2, 5, 7])\
                            .build()

rf_grid = ParamGridBuilder().baseOn({pipeline.stages:rf_stages})\
                            .addGrid(rf.maxDepth, [5, 10])\
                            .addGrid(rf.featureSubsetStrategy, ['3', '6'])\
                            .build()

gbt_grid = ParamGridBuilder().baseOn({pipeline.stages:gbt_stages})\
                             .addGrid(gbt.maxDepth, [5, 10])\
                             .addGrid(gbt.maxIter, [50, 100])\
                             .build()

grid = lr_grid + rf_grid + gbt_grid

TrainValidationSplit 定义:

tvs = TrainValidationSplit(estimator=pipeline, estimatorParamMaps=grid, evaluator=rmse_evaluator, trainRatio=0.8, parallelism=3, seed=7)

模型训练:

model = tvs.fit(train_val)

在运行最后一行之后,这是我得到的错误(不确定我是否应该在这里发布整个内容):

KeyError: Param(parent='Pipeline_40f78ef0cee04a4ebc61', name='stages', doc='a list of pipeline stages')

谢谢你的时间。

标签: apache-sparkpysparkpipelinecross-validation

解决方案


我有同样的问题,我通过初始化管道阶段解决了这个问题。

pipeline = Pipeline(stages=[])  # Must initialize with empty list!

这里有一个很好的例子: https ://github.com/dsharpc/dsharpc.github.io/blob/master/SparkMLFlights/README.md


推荐阅读