2016-01-08 66 views
8

爲了建立一個NaiveBayes多類分類器,我使用的是CrossValidator選擇在我的管道的最佳參數:SPARK,ML,調整,CrossValidator:訪問度量

val cv = new CrossValidator() 
     .setEstimator(pipeline) 
     .setEstimatorParamMaps(paramGrid) 
     .setEvaluator(new MulticlassClassificationEvaluator) 
     .setNumFolds(10) 

val cvModel = cv.fit(trainingSet) 

管道包含常用的變壓器和按照以下順序進行估計:Tokenizer,StopWordsRemover,HashingTF,IDF,最後是NaiveBayes。

是否可以訪問爲最佳模型計算的指標?

理想情況下,我想訪問所有模型的指標,以查看更改參數如何改變分類質量。 但目前來看,最好的模式已經足夠好了。

僅供參考,我使用的Spark 1.6.0

回答

6

下面是我如何做到這一點:

val pipeline = new Pipeline() 
    .setStages(Array(tokenizer, stopWordsFilter, tf, idf, word2Vec, featureVectorAssembler, categoryIndexerModel, classifier, categoryReverseIndexer)) 

... 

val paramGrid = new ParamGridBuilder() 
    .addGrid(tf.numFeatures, Array(10, 100)) 
    .addGrid(idf.minDocFreq, Array(1, 10)) 
    .addGrid(word2Vec.vectorSize, Array(200, 300)) 
    .addGrid(classifier.maxDepth, Array(3, 5)) 
    .build() 

paramGrid.size // 16 entries 

... 

// Print the average metrics per ParamGrid entry 
val avgMetricsParamGrid = crossValidatorModel.avgMetrics 

// Combine with paramGrid to see how they affect the overall metrics 
val combined = paramGrid.zip(avgMetricsParamGrid) 

... 

val bestModel = crossValidatorModel.bestModel.asInstanceOf[PipelineModel] 

// Explain params for each stage 
val bestHashingTFNumFeatures = bestModel.stages(2).asInstanceOf[HashingTF].explainParams 
val bestIDFMinDocFrequency = bestModel.stages(3).asInstanceOf[IDFModel].explainParams 
val bestWord2VecVectorSize = bestModel.stages(4).asInstanceOf[Word2VecModel].explainParams 
val bestDecisionTreeDepth = bestModel.stages(7).asInstanceOf[DecisionTreeClassificationModel].explainParams 
+1

拉鍊的作品,但我真的不喜歡它,因爲它假設了關於CrossValidator如何工作的內部知識。他們可能會改變度量數組的構建方式,因此它會按照與下一個版本不同的順序進行構建,並且您會被弄糊塗,但由於代碼仍然有效,所以不知道您的使用情況。 我想要用它的度量返回一個模型的參數。我也希望看到摘要統計數據,而不僅僅是平均數。沒有標準偏差的平均值有多大用處? – Turbo

0
cvModel.avgMetrics 

在pyspark作品2.2.0