Scala 在k-fold验证中,在每次迭代/折叠时获得单个模型分数

Scala 在k-fold验证中,在每次迭代/折叠时获得单个模型分数,scala,cross-validation,k-fold,Scala,Cross Validation,K Fold,我正在尝试在scala中执行kfold验证。我使用随机森林模型和rmse作为评估者。我只能得到最佳模型的rmse值 代码: 我想在验证阶段打印各个rmse值 例如: 请让我知道如何在Scala中执行此操作。谢谢 交叉验证程序使用以下代码段计算每个参数映射的度量 正如您在高亮(黄色)字段中看到的,中间度量值不存储在任何位置,只能访问平均值,但您可以通过操纵日志级别(带下划线)打印所需的信息 上面的代码片段将关闭所有spark日志,只启用util包日志(所需的日志由位于util包中的Intrume

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

代码:

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

例如:


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

交叉验证程序使用以下代码段计算每个参数映射的度量

正如您在高亮(黄色)字段中看到的,中间度量值不存储在任何位置,只能访问平均值,但您可以通过操纵日志级别(带下划线)打印所需的信息

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

然而,顺序并不是你所要求的;就像第一次分割一样,它计算所有可能的参数,然后移动到第二次分割。如果您确实想要您要求的输出,那么解决方案就是通过定义CustomCV类和覆盖fit方法来扩展CrossValidator,例如出于测试目的(我使用rmse打印每个输入配置的每个k)。导致

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)
(1, 4.3)

(2, 4.4)

(3, 4.2)

.

.

.

(k, rmse for that iteration)
Logger.getLogger("org.apache.spark").setLevel(Level.OFF)
Logger.getLogger("org.apache.spark.ml.util").setLevel(Level.DEBUG)