我正在使用Naive Bayes(Spark ML 1.6.0)来计算概率,但是结果即类的概率(我只有2级,如下例所示)不合适,我认为我的意思是使用贝叶斯公式计算概率手册(数据用于非常简单且只有3条记录,因为我想做POC并首先确定结果是正确的。)
我使用的代码就在这里
import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.api.java.JavaSparkContext
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.classification.NaiveBayes
import org.apache.spark.ml.feature.{HashingTF, Tokenizer}
import org.apache.spark.mllib.linalg.Vector
import org.apache.spark.sql.{SQLContext, Row}
object NVTestDebug {
def main(args: Array[String]): Unit = {
Logger.getLogger("org").setLevel(Level.ERROR)
Logger.getLogger("akka").setLevel(Level.ERROR)
val conf: SparkConf = new SparkConf().setMaster("local").setAppName("PipelineSC")
val sc: JavaSparkContext = new JavaSparkContext(conf)
val sqlContext = new SQLContext(sc)
// Prepare training documents from a list of (id, text, label) tuples.
val training = sqlContext.createDataFrame(Seq(
(0L, "10", 5.0),
(1L, "10", 6.0),
(2L, "10", 6.0)
)).toDF("id", "text", "label")
// Configure an ML pipeline, which consists of three stages: tokenizer, hashingTF, and lr.
val tokenizer = new Tokenizer()
.setInputCol("text")
.setOutputCol("words")
val hashingTF = new HashingTF()
.setNumFeatures(1000)
.setInputCol(tokenizer.getOutputCol)
.setOutputCol("features")
val nb = new NaiveBayes().setFeaturesCol("features").setLabelCol("label")
val pipeline = new Pipeline()
.setStages(Array(tokenizer, hashingTF, nb))
// Fit the pipeline to training documents.
val model = pipeline.fit(training)
// Prepare test documents, which are unlabeled (id, text) tuples.
val test = sqlContext.createDataFrame(Seq(
(17L, "10")
)).toDF("id", "text")
// Make predictions on test documents.
model.transform(training).show(false)
model.transform(test).show(false)
}
}
我预计5.0级的概率为33.33%,6.0级的概率为66.66,如果预期结果有误,请告诉我
实际结果为30.7和69.2,如下图所示
我不认为问题与提到的问题重复(由@ zero323提及)beacsue of following - 在上面提到的链接上下文是关于看不见的数据,但是对于这个问题,测试数据并不是未知的 - 也有可能性不会太高或太低,而是与我手动计算的一些偏差
在这里添加不同的数据集,其中结果略有不同但差异很大(请参见图片),这里因为5.0类的测试数据10只有1个类我希望概率接近100且测试相同6.0级的数据20,即6.0级的测试数据20的接近100% 但是对于5.0级的测试数据10,结果是~88%,对于6.0级的测试数据20,结果是~50%