簡體   English   中英

如何從交叉驗證器獲得訓練有素的最佳模型

[英]how to obtain the trained best model from a crossvalidator

我構建了一個包含這樣的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)

但問題是,我想查看具有DecisionTreeClassificationModel參數.toDebugTree的經過最佳訓練的決策樹模型。 但模型是CrossValidatorModel 是的,您可以使用model.bestModel ,但它仍然是Model類型,您不能將.toDebugTree應用於它。 而且我還假設bestModel仍然是一個pipline,包括labelIndexerfeatureIndexerdtlabelConverter

因此,沒有人知道我怎么可以從安裝在模型中的decisionTree模型crossvalidator ,我可以通過查看實際的模型toDebugString 或者有沒有可以查看decisionTree模型的解決方法?

那么,在這樣的情況下 ,答案總是一樣的 - 具體說明類型。

首先提取管道模型,因為您要訓練的是管道:

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)

(免責聲明:還有另外一個方面,我們應該得到自己的答案。我知道這是一個小問題,然而,它對問題提出疑問。如果有人因為不同意內容而投票,請發表評論)

你應該提取“最好的”樹,答案通常是否定的。

我們為什么要做簡歷? 我們正在努力評估我們的選擇。 選擇是使用的分類器,使用的超參數,像特征選擇的預處理。 對於最后一個,重要的是這發生在訓練數據上。 例如,不要規范化所有數據的功能。 因此CV的輸出是生成的管道。 在旁注:特征選擇應評估在“內部簡歷”

我們沒有做什么,我們沒有生成一個“分類池”,我們選擇最好的分類器。 但是,我經常出乎意料地看到這一點。 問題是你有很高的纏繞效果。 即使在完美的I id數據集中,也有可能(接近)重復的訓練示例。 “最好的”CV分類器很有可能只是表示你有最好的纏繞效果。

因此,你應該怎么做? 一旦修復了參數,就應該使用整個訓練數據來構建最終模型。 希望,但沒有人這樣做,你已經預留了一個額外的評估集,你從未在過程中接觸到評估你的最終模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM