2

我正在尝试在 scala 中执行 kfold 验证。我正在使用随机森林模型和 rmse 作为评估器。我只能获得最佳模型的 rmse 值。

代码:

val rf = new RandomForestRegressor().setLabelCol("label").setFeaturesCol("features").setNumTrees(2).setMaxDepth(2)
val paramGrid = new ParamGridBuilder().build()
val evaluator = new RegressionEvaluator().setMetricName("rmse").setLabelCol("label").setPredictionCol("prediction")

val cv = new CrossValidator().setEstimator(pipeline).setEvaluator(evaluator).setEstimatorParamMaps(paramGrid).setNumFolds(2).setParallelism(2) 

val cvModel = cv.fit(trainingValDf)

我想在验证阶段打印各个 rmse 值。

例如:

(1, 4.3)

(2, 4.4)

(3, 4.2)

.

.

.

(k, rmse for that iteration)

请让我知道如何在 Scala 中执行此操作。谢谢!

4

1 回答 1

1

交叉验证器使用以下代码片段计算每个参数映射的指标;

火花交叉验证

正如您从高亮(黄色)字段中看到的,中间指标未存储在任何地方,只能访问平均值,但您可以通过操作日志级别(下划线)打印所需的信息。

Logger.getLogger("org.apache.spark").setLevel(Level.OFF)
Logger.getLogger("org.apache.spark.ml.util").setLevel(Level.DEBUG)

上面的代码片段将关闭所有 spark 日志并仅启用 util 包日志(您想要的日志由位于 util 包中的 Intrumentation 对象打印)。这将生成以下输出;

结果

然而,顺序不是你问的;就像第一次拆分它计算所有可能的参数然后移动到第二次拆分。如果您想要确切的输出,则解决方案是通过定义 CustomCV 类和覆盖拟合方法(例如CustomCV )来扩展 CrossValidator以进行测试(我正在打印每个输入配置,每个 k 都带有 rmse)。结果是;

CustomCV 结果

于 2019-08-01T14:07:47.530 回答