/ / Spark ML Konwertuj etykietę przewidywania na ciąg bez treningu DataFrame - scala, apache-spark, machine-learning

Spark ML Convert Etykieta przewidywania na ciąg bez treningu DataFrame - scala, apache-spark, machine-learning

Używam wielowymiarowego klasyfikatora NaiveBayes w Apache Spark ML (wersja 2.1.0) do przewidywania niektórych kategorii tekstowych.

Problem polega na tym, jak przekonwertować etykietę predykcji (0.0, 1.0, 2.0) na ciąg bez przeszkolonej ramki DataFrame.

Wiem, że IndexToString może być użyty, ale jest pomocny tylko wtedy, gdy trening i przewidywanie są w tym samym czasie. Ale w moim przypadku jest to samodzielna praca.

kod wygląda jak
1) TrainingModel.scala: Trenuj model i zapisz model w pliku.
2) CategoryPrediction.scala: Załaduj wyszkolony model z pliku i przeprowadź przewidywanie na danych testowych.

Proszę zasugerować rozwiązanie:

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");

KategoriaPrediction.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"

Odpowiedzi:

1 dla odpowiedzi № 1

Dodaj konwerter, który przetłumaczy kategorie predykcyjne z powrotem na etykiety w potoku, coś takiego:

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

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

Spowoduje to przepowiadanie i przekształcenie go z powrotem na etykietę za pomocą etykiety labelIndexer.