2016-01-08 16 views
8

Để xây dựng một bộ phân loại nhiều lớp NaiveBayes, tôi đang sử dụng một CrossValidator để chọn các thông số tốt nhất trong các đường ống của tôi:SPARK, ML, Tuning, CrossValidator: truy cập vào các số liệu

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

val cvModel = cv.fit(trainingSet) 

Đường ống dẫn dầu chứa máy biến áp thông thường và ước tính theo thứ tự sau: Tokenizer, StopWordsRemover, HashingTF, IDF và cuối cùng là NaiveBayes.

Có thể truy cập các số liệu được tính cho mô hình tốt nhất không?

Lý tưởng nhất, tôi muốn truy cập các chỉ số của tất cả các mô hình để xem việc thay đổi các thông số đang thay đổi chất lượng phân loại như thế nào. Nhưng hiện tại, mô hình tốt nhất là đủ tốt.

FYI, tôi đang sử dụng Spark 1.6.0

Trả lời

6

Dưới đây là cách tôi làm điều đó:

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

công trình zip nhưng tôi thực sự không thích nó vì nó giả định kiến ​​thức nội bộ về cách CrossValidator hoạt động. Họ có thể thay đổi cách mảng số liệu được xây dựng sao cho theo thứ tự khác cho phiên bản tiếp theo và bạn được đặt, nhưng không biết bạn đã sử dụng vì mã của bạn vẫn hoạt động. Tôi muốn có các thông số cho mô hình được trả về với chỉ số của nó. Tôi cũng muốn xem thống kê tóm tắt thay vì chỉ là trung bình. Làm thế nào hữu ích là một trung bình mà không có một độ lệch chuẩn? – Turbo

0
cvModel.avgMetrics 

công trình trong pyspark 2.2.0

Các vấn đề liên quan