Извлечение слоев MLP из PySpark ParamGrid - PullRequest
0 голосов
/ 18 февраля 2019

Поэтому у меня возникли проблемы с извлечением гиперпараметров из модели PySpark после Pipeline и CrossValidator.

Я нашел следующий ответ по StackOverflow: Как извлечь гиперпараметры модели из spark.ml в PySpark?

Это было очень полезно, и следующая строка работала дляme:

modelOnly.bestModel.stages[-1]._java_obj.parent().getRegParam()

Новая проблема заключается в том, что я запускаю MLP, и при попытке извлечь слои я получаю случайную строку символов вместо чего-то вроде списка Python.

Результат:

StepSize: 0.03

Layers: [I@db98c25

Мой код примерно такой:

trainer = MultilayerPerceptronClassifier(featuresCol='features', 
                                     labelCol='label', 
                                     predictionCol='prediction', 
                                     maxIter=100, 
                                     tol=1e-06, 
                                     seed=1331, 
                                     layers=layers1, 
                                     blockSize=128, 
                                     stepSize=0.03, 
                                     solver='l-bfgs', 
                                     initialWeights=None, 
                                     probabilityCol='probability', 
                                     rawPredictionCol='rawPrediction')

pipeline = Pipeline(stages=[assembler1,stringIdx,trainer])

paramGrid = ParamGridBuilder() \
.addGrid(trainer.maxIter, [10]) \
.addGrid(trainer.tol, [1e-06]) \
.addGrid(trainer.stepSize, [0.03]) \
.addGrid(trainer.layers, [layers2]) \
.build()

crossval = CrossValidator(estimator=pipeline,
                      estimatorParamMaps=paramGrid,
                      evaluator=MulticlassClassificationEvaluator(metricName="accuracy"),
                      numFolds=3)

cvModel = crossval.fit(df)

mybestmodel = cvModel.bestModel

java_model = mybestmodel.stages[-1]._java_obj

print("StepSize: ", end='')
print(java_model.parent().getStepSize())
print("Layers: ", end='')
print(java_model.parent().getLayers())

Я использую Spark 2.3.2.

Чего мне не хватает?

Спасибо:)

1 Ответ

0 голосов
/ 18 февраля 2019

Это не случайная строка, а представление соответствующего Java-объекта .

Хотя в теории вы могли бы

[x for x in mybestmodel.stages[-1]._java_obj.parent().getLayers()]

, на самом делев этом нет необходимости

layers

массив размеров слоев, включая входной и выходной слои.

Новое в версии 1.6.0.

т.е.

mybestmodel.stages[-1].layers
...