在pySpark中使用paramGrid从CrossValidator提取结果

时间:2018-07-08 09:45:25

标签: python apache-spark pyspark apache-spark-ml

我用pySpark训练了一个随机森林。我想在结果中每个网格点都有一个csv。 我的代码是:

estimator = RandomForestRegressor()
evaluator = RegressionEvaluator()
paramGrid = ParamGridBuilder().addGrid(estimator.numTrees, [2,3])\
                              .addGrid(estimator.maxDepth, [2,3])\
                              .addGrid(estimator.impurity, ['variance'])\
                              .addGrid(estimator.featureSubsetStrategy, ['sqrt'])\
                              .build()
pipeline = Pipeline(stages=[estimator])

crossval = CrossValidator(estimator=pipeline,
                          estimatorParamMaps=paramGrid,
                          evaluator=evaluator,
                          numFolds=3)

cvModel = crossval.fit(result)

所以我要一个csv:

numTrees | maxDepth | impurityMeasure 

2            2          0.001 

2            3          0.00023

做到这一点的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

您必须合并不同的数据位:

  • Estimator ParamMaps使用getEstimatorParamMaps方法提取。
  • 可以使用avgMetrics参数检索的训练指标。

首先获取映射中声明的所有参数的名称和值:

params = [{p.name: v for p, v in m.items()} for m in cvModel.getEstimatorParamMaps()]

具有度量标准的zip,并转换为数据框

import pandas as pd

pd.DataFrame.from_dict([
    {cvModel.getEvaluator().getMetricName(): metric, **ps} 
    for ps, metric in zip(params, cvModel.avgMetrics)
])

答案 1 :(得分:1)

这里真的很有帮助。我想我会扩展那些使用替代 pyspark 调整类的人。

pyspark.ml.tuning.TrainValidationSplit

现在使用validationMetrics 参数检索训练指标

将 cvModel 替换为 tvsModel(pyspark.ml.tuning.TrainValidationSplitModel 的一个实例),解决方案变为:

params = [{p.name: v for p, v in m.items()} for m in tvsModel.getEstimatorParamMaps()]

pd.DataFrame.from_dict([
    {tvsModel.getEvaluator().getMetricName(): metric, **ps} 
    for ps, metric in zip(params, tvsModel.validationMetrics)
])