scala - SparkML - 从 CrossValidator 中的 bestModel 中检索参数
问题描述
我正在使用 StringIndexer、OneHotEncoderEstimator 和 RandomForestRegressor 在 Spark 2.3 中训练随机森林模型。像这样:
//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 =
{
}
我错过了什么?
解决方案
基于以下问题,我尝试了这个,但我不确定这是否是正确的方法:
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:分配给直方图聚合的最大内存(以 MB 为单位)。(默认值:256) minInfoGain:在树节点处考虑的拆分的最小信息增益。(默认值:0.0) minInstancesPerNode:拆分后每个孩子必须拥有的最小实例数。如果拆分导致左或右子节点的数量少于 minInstancesPerNode,则拆分将被视为无效而丢弃。应该 >= 1。(默认值:1,当前值:1) numTrees:
我不确定的仍然是我需要选择哪个阶段。我决定选择最后一个,因为训练过程是迭代的,但我不能 100% 确定这是否是正确的答案。任何反馈将不胜感激。
推荐阅读
- python - Pandas to_gbq 方法 DataFrame 模式与表不匹配
- python - TypeError:TextIOWrapper 类型的对象不是 JSON 可序列化的
- c++ - 从常量字符数组到字符数组的隐式转换
- ruby-on-rails - Rails -- cookies 添加一个数组
- azure - Azure 搜索 - 计数是近似的还是真实的?
- java - 如何从 firebase 检索图像并在 gridview android 中显示
- php - 在 PHP 中使用 foreach 访问 SELECT 查询结果时遇到问题
- java - 找不到 com.android.tools.build:aapt2 AndroidStudio
- c# - 如何使用terraindata.GetHeight(x,y)
- html - Bootstrap:如何在文本区域和按钮之间放置换行符?