2017-07-09 13 views
0

Apache Spark ML(バージョン2.1.0)でNaiveBayes多項式分類子を使用して、一部のテキストカテゴリを予測しています。Spark ML予測ラベルをトレーニングなしの文字列に変換します。DataFrame

問題は、訓練されたDataFrameなしで予測ラベル(0.0、1.0、2.0)を文字列に変換する方法です。

私はIndexToStringを使用できますが、トレーニングと予測の両方が同時に行われている場合にのみ役立つことがわかります。しかし、私の場合は独立した仕事です。

コードは
のようになります。1)TrainingModel.scala:モデルをトレーニングし、モデルにファイルを保存します。
2)CategoryPrediction.scala:訓練されたモデルをファイルから読み込み、テストデータを予測します。

TrainingModel.scala

val trainData: Dataset[LabeledRecord] = spark.read.option("inferSchema", "false") 
    .schema(schema).csv("trainingdata1.csv").as[LabeledRecord] 

val labelIndexer = new StringIndexer().setInputCol("category").setOutputCol("label").fit(trainData).setHandleInvalid("skip") 

val tokenizer = new RegexTokenizer().setInputCol("text").setOutputCol("words") 

val hashingTF = new HashingTF() 
    .setInputCol("words") 
    .setOutputCol("features") 
    .setNumFeatures(1000) 

val rf = new NaiveBayes().setLabelCol("label").setFeaturesCol("features").setModelType("multinomial") 

val pipeline = new Pipeline().setStages(Array(tokenizer, hashingTF, labelIndexer, rf)) 

val model = pipeline.fit(trainData) 

model.write.overwrite().save("naivebayesmodel"); 

CategoryPrediction.scala

val testData: Dataset[PredictLabeledRecord] = spark.read.option("inferSchema", "false") 
     .schema(predictSchema).csv("testingdata.csv").as[PredictLabeledRecord] 

val model = PipelineModel.load("naivebayesmodel") 

val predictions = model.transform(testData) 

//  val labelConverter = new IndexToString() 
//  .setInputCol("prediction") 
//  .setOutputCol("predictedLabelString") 
//  .setLabels(trainDataFrameIndexer.labels)  

predictions.select("prediction", "text").show(false) 

trainingdata1.csv

ソリューションを提案して下さい

category,text 
Drama,"a b c d e spark" 
Action,"b d" 
Horror,"spark f g h" 
Thriller,"hadoop mapreduce" 

testingdata.csv

text 
"a b c d e spark" 
"spark f g h" 

答えて

-1

、このような何かあなたのパイプラインに戻ってラベルに予測カテゴリを翻訳するコンバータを追加します。これは、予測がかかります

val categoryConverter = new IndexToString() 
    .setInputCol("prediction") 
    .setOutputCol("category") 
    .setLabels(labelIndexer.labels) 

val pipeline = new Pipeline().setStages(Array(tokenizer, hashingTF, labelIndexer, rf, categoryConverter)) 

をlabelIndexerを使用してラベルに戻します。

+0

お返事ありがとうございました。 – user657816

関連する問題