我正在使用NaiveBayes分类器工作,并且可以使用训练好的模型对单个数据点进行预测,但我想要获取概率值。
数据只被分类为两个类别,预测函数返回0
或1
。
import org.apache.log4j.{Level, Logger}import org.apache.spark.ml.classification.{NaiveBayes, NaiveBayesModel}import org.apache.spark.ml.feature.LabeledPointimport org.apache.spark.ml.linalg.Vectorsimport org.apache.spark.sql.SparkSessionobject Test { def main(args: Array[String]): Unit = { Logger.getLogger("org").setLevel(Level.OFF) Logger.getLogger("akka").setLevel(Level.OFF) val spark = SparkSession.builder.appName("Test").master("local[4]").getOrCreate val dataset = spark.read.option("inferSchema", "true").csv("data/labelled.csv").toDF() import spark.sqlContext.implicits._ val output = dataset.map(row => { LabeledPoint(row.getInt(2), Vectors.dense( row.getInt(0) , row.getInt(1))) }) val Array(training, test) = output.randomSplit(Array(0.7, 0.3),seed = 11L) training.cache() val model : NaiveBayesModel = new NaiveBayes().fit(training) val speed = 110 val hour = 11 val label1 : Double = model.predict(Vectors.dense(speed,hour)) // 更新 val label = model.predictProbability(Vectors.dense(speed,hour)) // 这不起作用并引发错误[1] }}
[1] 使用model.predictProbability
时引发的错误
错误:(24, 23) 在classProbabilisticClassificationModel中的方法predictProbability不能在org.apache.spark.ml.classification.NaiveBayesModel中访问,因为封闭对象Test不是定义目标的包classification中的classProbabilisticClassificationModel的子类,不允许访问受保护的方法predictProbabilityval label = model.predictProbability(Vectors.dense(speed,hour))
回答:
经过多次研究,我在spark.ml
库中没有找到这个功能,但我在使用spark.mllib
时成功实现了,并且代码需要修改为