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"
お返事ありがとうございました。 – user657816