apache-spark - 在 PySpark 中具有多个管道的 CrossValidation/TrainValidationSplit
问题描述
我正在尝试评估 PySpark 中的多个管道。我可以在每个单独的 CV/TVS 中完成它,但我想只在一个中完成它,所以它直接为我提供了最好的模型,我不知道如何让它工作。
lr_assembler
并且assembler
是VectorAsembler
(不同特征选择)的 2 个实例。
pca
、和是lr
、rf
和的gbt
实例。PCA
LinearRegression
RandomForestRegressor
GBTRegressor
管道定义:
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')
谢谢你的时间。
解决方案
我有同样的问题,我通过初始化管道阶段解决了这个问题。
pipeline = Pipeline(stages=[]) # Must initialize with empty list!
这里有一个很好的例子: https ://github.com/dsharpc/dsharpc.github.io/blob/master/SparkMLFlights/README.md
推荐阅读
- c - 返回类型默认为 'int' [-Wimplicit-int]
- python - 在使用子字符串列表进行子字符串搜索后返回列表条目
- angular - 从子组件路由“闪烁”我的导航
- jquery - CakePHP 3 用 ajax 返回的数据替换 div 中的内容
- gcc - 在 inline asm 中使用特定的 zmm 寄存器
- sql - 是否有任何最佳方法来查找行数
- python - TimestampedGeoJson 持续时间参数导致多边形消失
- python - Write one line code to get odd and even numbers in separate arrays
- node.js - 如何使用 Mongoose 进行排序和限制
- c# - Azure 服务总线队列连接问题