SparkML - получение параметров из bestModel в CrossValidator - PullRequest
0 голосов
/ 21 сентября 2018

Я тренирую модель случайного леса в Spark 2.3, используя StringIndexer, OneHotEncoderEstimator и RandomForestRegressor.Например:

//Indexer
val stringIndexers = categoricalColumns.map { colName =>
  new StringIndexer()
    .setInputCol(colName)
    .setOutputCol(colName + "Idx")
    .setHandleInvalid("keep")
    .fit(training)
}

//HotEncoder
val encoders = featuresEnconding.map { colName =>
  new OneHotEncoderEstimator()
    .setInputCols(Array(colName + "Idx"))
    .setOutputCols(Array(colName + "Enc"))
    .setHandleInvalid("keep")
}  

//Adding features into a feature vector column   
val assembler = new VectorAssembler()
              .setInputCols(featureColumns)
              .setOutputCol("features")


val rf = new RandomForestRegressor()
              .setLabelCol("label")
              .setFeaturesCol("features")
              .setMaxBins(1000)


val stepsRF = stringIndexers ++ encoders ++ Array(assembler, rf)

val pipelineRF = new Pipeline().setStages(stepsRF)

val paramGridRF = new ParamGridBuilder()
                  .addGrid(rf.minInstancesPerNode, Array(1, 5, 15))
                  .addGrid(rf.maxDepth, Array(10, 11, 12))
                  .addGrid(rf.numTrees, Array(20, 50, 100))
                  .build()


//Defining the evaluator
val evaluatorRF = new RegressionEvaluator()
.setLabelCol("label")
.setPredictionCol("prediction")

//Using cross validation to train the model
val cvRF = new CrossValidator()
.setEstimator(pipelineRF)
.setEvaluator(evaluatorRF)
.setEstimatorParamMaps(paramGridRF)
.setNumFolds(10)
.setParallelism(3)

//Fitting the model with our training dataset
val cvRFModel = cvRF.fit(training)

Я не уверен, какова лучшая комбинация параметров для этой модели, поэтому я добавил следующую таблицу параметров:

.addGrid(rf.minInstancesPerNode, Array(1, 5, 15))
.addGrid(rf.maxDepth, Array(10, 11, 12))
.addGrid(rf.numTrees, Array(20, 50, 100))

И я позволил CrossValidatorрассчитать лучшую комбинацию.Теперь я хотел бы узнать, какую комбинацию он подобрал, чтобы оттуда настраивать модель.Поэтому я пытался получить следующие параметры:

cvRFModel.bestModel.extractParamMap

Но я получаю пустую карту:

org.apache.spark.ml.param.ParamMap =
{

}

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

1 Ответ

0 голосов
/ 21 сентября 2018

Исходя из следующего вопроса Я попробовал это, но я не уверен, что это правильный подход:

val avgMetricsParamGrid = cvRFModel.avgMetrics

val combined = paramGridRF.zip(avgMetricsParamGrid)

val bestModel = cvRFModel.bestModel.asInstanceOf[PipelineModel]


val parms = bestModel.stages.last.asInstanceOf[RandomForestRegressionModel].explainParams

И он дал мне информацию о нескольких параметрах, таких как этот:

labelCol: имя столбца метки (по умолчанию: метка, ток: метка) maxBins: максимальное количество ячеек для дискретизации непрерывных объектов.Должно быть> = 2 и> = количество категорий для любой категориальной функции.(по умолчанию: 32, ток: 1000) maxDepth: максимальная глубина дерева.(> = 0) Например, глубина 0 означает 1 листовой узел;глубина 1 означает 1 внутренний узел + 2 конечных узла.(по умолчанию: 5, текущий: 12) maxMemoryInMB: максимальный объем памяти в МБ, выделенный для агрегации гистограммы.(по умолчанию: 256) minInfoGain: минимальный прирост информации для разбиения, которое необходимо учитывать на узле дерева.(по умолчанию: 0.0) minInstancesPerNode: минимальное количество экземпляров, которое должен иметь каждый дочерний элемент после разделения.Если разделение приводит к тому, что у левого или правого дочернего элемента будет меньше, чем minInstancesPerNode, разделение будет отклонено как недействительное.Должно быть> = 1. (по умолчанию: 1, текущее: 1) numTrees: количество деревьев для обучения (> = 1) (по умолчанию: 20, текущее: 20 )gnationCol: имя столбца прогноза (по умолчанию: прогноз) seed: random seed(по умолчанию: 235498149) subsamplingRate: доля обучающих данных, используемых для изучения каждого дерева решений, в диапазоне (0, 1]. (по умолчанию: 1,0)

Что я не уверен, так это какой этапМне нужно выбрать. Я решил выбрать последний, так как процесс обучения повторяется, но я не уверен на 100%, правильный ли это ответ. Любая обратная связь будет оценена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...