2016-01-08 33 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