2016-01-08 21 views
8

Al fine di costruire un classificatore multiclasse NaiveBayes, sto usando un CrossValidator per selezionare i migliori parametri della mia condotta:SPARK, ML, Tuning, CrossValidator: accedere alle metriche

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

val cvModel = cv.fit(trainingSet) 

La pipeline contiene trasformatori usuali e stimatori nel seguente ordine: Tokenizer, StopWordsRemover, HashingTF, IDF e infine i NaiveBayes.

È possibile accedere alle metriche calcolate per il modello migliore?

Idealmente, vorrei accedere alle metriche di tutti i modelli per vedere come la modifica dei parametri sta cambiando la qualità della classificazione. Ma per il momento, il modello migliore è abbastanza buono.

FYI, sto usando Spark 1.6.0

risposta

6

ecco come lo faccio:

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

opere zip, ma io davvero non lo fanno piace perché presuppone una conoscenza interna su come funziona CrossValidator. Potrebbero cambiare il modo in cui l'array di metriche viene creato in modo tale che sia in un ordine diverso per la prossima versione e tu sia stato scelto, ma non conosci il tuo usato perché il tuo codice funziona ancora. Mi piacerebbe avere i parametri per un modello restituito con la sua metrica. Mi piacerebbe anche vedere le statistiche riassuntive anziché solo la media. Quanto è utile una media senza una deviazione standard? – Turbo

0
cvModel.avgMetrics 

opere in pyspark 2.2.0