Spark Naive Bayes结果准确度(Spark ML 1.6.0)

时间:2016-05-19 15:35:44

标签: apache-spark naivebayes

我正在使用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,如下图所示

DataFrames after transform

我不认为问题与提到的问题重复(由@ zero323提及)beacsue of following - 在上面提到的链接上下文是关于看不见的数据,但是对于这个问题,测试数据并不是未知的 - 也有可能性不会太高或太低,而是与我手动计算的一些偏差

在这里添加不同的数据集,其中结果略有不同但差异很大(请参见图片),这里因为5.0类的测试数据10只有1个类我希望概率接近100且测试相同6.0级的数据20,即6.0级的测试数据20的接近100% 但是对于5.0级的测试数据10,结果是~88%,对于6.0级的测试数据20,结果是~50%

Data set 2 with results

0 个答案:

没有答案