【问题标题】:Get individual model scores at every iteration / fold in k-fold validation在 k 折验证中的每次迭代/折中获取单个模型分数
【发布时间】:2019-07-31 08:19:40
【问题描述】:

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

【问题讨论】:

    标签: scala cross-validation k-fold


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 2021-10-04
      • 1970-01-01
      • 2018-01-10
      • 2018-12-17
      • 2021-07-13
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      相关资源
      最近更新 更多