在 k 折验证中的每次迭代/折中获取单个模型分数

Get individual model scores at every iteration / fold in k-fold validation

我正在尝试在 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 中执行此操作。谢谢!

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

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

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

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

但是顺序不是你要求的;就像第一次拆分一样,它会计算所有可能的参数,然后移动到第二次拆分。如果你想要你问过的输出,解决方案是通过定义 CustomCV class 和重写拟合方法(例如 CustomCV 来扩展 CrossValidator 以进行测试(我正在为每个输入配置打印每个 k 与 rmse ).结果;