Я тренирую модель случайного леса в 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 =
{
}
Чего мне не хватает?