[英]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,包括labelIndexer
, featureIndexer
, dt
, labelConverter
。
因此,沒有人知道我怎么可以從安裝在模型中的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.