【问题标题】:how to obtain the trained best model from a crossvalidator如何从交叉验证器中获得训练有素的最佳模型
【发布时间】:2016-07-20 18:16:10
【问题描述】:

我构建了一个管道,包括这样的 DecisionTreeClassifier(dt)

val pipeline = new Pipeline().setStages(Array(labelIndexer, featureIndexer, dt, labelConverter))

然后我将此管道用作 CrossValidator 中的估计器,以便获得具有最佳超参数集的模型

val c_v = new CrossValidator().setEstimator(pipeline).setEvaluator(new MulticlassClassificationEvaluator().setLabelCol("indexedLabel").setPredictionCol("prediction")).setEstimatorParamMaps(paramGrid).setNumFolds(5)

最后,我可以使用这个交叉验证器在训练测试中训练模型

val model = c_v.fit(train)

但问题是,我想查看带有.toDebugTree 的参数DecisionTreeClassificationModel 的最佳训练决策树模型。但型号是CrossValidatorModel。是的,您可以使用model.bestModel,但它仍然是Model 类型,您不能对其应用.toDebugTree。而且我还假设 bestModel 仍然是一个管道,包括labelIndexerfeatureIndexerdtlabelConverter

那么有谁知道我如何从crossvalidator 拟合的模型中获取decisionTree 模型,我可以通过toDebugString 查看实际模型吗?或者有什么解决方法可以让我查看决策树模型?

【问题讨论】:

    标签: scala apache-spark machine-learning decision-tree cross-validation


    【解决方案1】:

    嗯,在cases like this one 中,答案总是一样的——具体说明类型。

    首先提取管道模型,因为您要训练的是管道:

    import org.apache.spark.ml.PipelineModel
    
    val bestModel: Option[PipelineModel] = model.bestModel match {
      case p: PipelineModel => Some(p)
      case _ => None
    }
    

    然后您需要从底层阶段提取模型。在您的情况下,它是一个决策树分类模型:

    import org.apache.spark.ml.classification.DecisionTreeClassificationModel
    
    val treeModel: Option[DecisionTreeClassificationModel] = bestModel
      flatMap {
        _.stages.collect {
          case t: DecisionTreeClassificationModel => t
        }.headOption
      }
    

    打印树,例如:

    treeModel.foreach(_.toDebugString)
    

    【讨论】:

    【解决方案2】:

    (免责声明:还有一个方面,恕我直言,应该有自己的答案。我知道这个问题有点过时,但是,它质疑这个问题。如果有人因为不同意内容而投反对票,也请留下一个评论)

    您是否应该提取“最佳”树而答案通常是否定的。

    我们为什么要做简历?我们试图评估我们的选择,去获得。选择是使用的分类器、使用的超参数、特征选择等预处理。对于最后一个,重要的是这发生在训练数据上。例如,不要对所有数据的特征进行归一化。所以CV的输出就是生成的管道。附带说明:应在“内部简历”上评估特征选择

    我们没有做什么,我们没有生成一个“分类器池”,我们选择最好的分类器。然而,我经常意外地看到这种情况。问题是你有非常高的机会产生缠绕效应。即使在完美的 Iid 数据集中,也可能存在(接近)重复的训练示例。很有可能“最佳”CV 分类器只是表明您在哪个折叠中具有最佳缠绕。

    因此,你应该怎么做?一旦你已经修复了你的参数,你应该使用整个训练数据来构建最终模型。希望,但没有人这样做,您已经预留了一个额外的评估集,您在此过程中从未接触过它来评估您的最终模型。

    【讨论】:

    • 您绝对有道理,尽管我认为这更多是 API 设计的问题,而不是其他任何问题。 TrainValidationSplit(Model) 可能在这里,但我不确定是否有一种好方法可以将它们组合成一个 Pipeline
    • 是的,我完全同意你所说的。我想查看最佳模型的原因只是出于好奇。
    猜你喜欢
    • 2018-03-08
    • 2015-12-18
    • 2020-07-07
    • 2014-05-02
    • 2021-12-10
    • 1970-01-01
    • 2018-11-28
    • 2015-02-28
    • 2020-11-18
    相关资源
    最近更新 更多