Извлечение результатов из CrossValidator с помощью paramGrid в pySpark

Я тренирую случайный лес с помощью 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

И т.д

Как лучше всего это сделать?


person okuoub    schedule 08.07.2018    source источник


Ответы (2)


Вам придется комбинировать разные биты данных:

  • Estimator ParamMaps извлечено с использованием метода getEstimatorParamMaps.
  • Показатели обучения, которые можно получить с помощью параметра avgMetrics.

Сначала получите имена и значения всех параметров, объявленных на карте:

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

Thane zip с метриками и преобразовать во фрейм данных

import pandas as pd

pd.DataFrame.from_dict([
    {cvModel.getEvaluator().getMetricName(): metric, **ps} 
    for ps, metric in zip(params, cvModel.avgMetrics)
])
person Alper t. Turker    schedule 08.07.2018
comment
Вы должны использовать устаревшую версию Python. Вы можете найти методы, которые работают с устаревшими версиями, здесь. - person Alper t. Turker; 08.07.2018
comment
Можно ли получить метрику accuracy с помощью вышеупомянутой процедуры? - person Simone; 13.07.2019

Действительно полезный ответ здесь. Думал, я бы расширил для тех, кто использует альтернативный класс настройки 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)
])
person Clem Manger    schedule 11.03.2021