Spark--NaiveBayes(朴素贝叶斯分类)--记录

贝叶斯定理解决了在已知P(y),P(x),P(x|y)的情况下求P(y|x)

贝叶斯定理:

P(y|x) = P(x|y)*P(Y)/P(x)

P(y|x) = P(x|y)*P(Y)/P(x)

P(y|x) = P(x|y)*P(Y)/P(x)


朴素贝叶斯分类:

1.从待训练样本逐个求出P(x)、P(y)、P(x|y)对应的概率

2.根据贝叶斯定理来对待预测样本进行预测P(y|x) = P(x|y)*P(Y)/P(x)=(P(x1|y)*P(Y)   *   P(x2|y)*P(Y)  * ...  *  P(xn|y)*P(Y))/P(x)

问题:若2对应的某项P(xn|y)*P(Y)的值为0,那么连乘后会导致P(y|x)的值为0。因此会有可能加入平滑因子,使分子不为0,即在分子和分母都加入值。

3.可能会出现相同P(xn-1|y)和P(xn|y)中xn-1和xn相同,那么会出现是计算一次还是计算两次的问题。

因此有了多项式模型和伯努力模型。

多项式模型中相同的计算多次,分母也是多次计算相同值。

伯努力模型中只计算一次,分母中多次出现只算一次。


测试数据集:链接: https://pan.baidu.com/s/1jKmYoce 密码: 3fdv

代码:

import org.apache.spark.mllib.classification.NaiveBayes
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.sql.SparkSession

/**
  * Created by root on 1/15/18.
  */
object NaiveBayesTest {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("NaiveBayesTest").master("local[*]").getOrCreate()
    val path = "file:/home/enche/data/sample_naive_bayes_data.txt"
    val sc = spark.sparkContext
    val data = sc.textFile(path)

//转成Rdd[LabeledPoint]
    val labelPoints = data.map{
      line=>
        val parts = line.split(",")
        LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(" ").map(_.toDouble)))
    }

//70%数据用于训练,30%数据用于检测
    val splits = labelPoints.randomSplit(Array(0.7, 0.3, 1L))

//朴素贝叶斯进行训练,lambda表示平滑因子取值,modelType表示的是多项式模型还是伯努力模型
    val model = NaiveBayes.train(input = splits(0),lambda = 1.0, modelType = "multinomial")
    val vectors = splits(1).map{
      case (l : LabeledPoint)=>
        l.features
    }
    val labels = splits(1).map{
      case (l : LabeledPoint)=>
        l.label
    }
    val predicts = model.predict(vectors)
    labels.zip(predicts).foreach(println)

  }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里是一个 RDD-based API 的简单 Scala 代码示例,展示如何使用 Apache Spark 中的 MLlib 库来训练一个朴素贝叶斯分类器并输出结果: ```scala import org.apache.spark.mllib.classification.{NaiveBayes, NaiveBayesModel} import org.apache.spark.mllib.util.MLUtils import org.apache.spark.{SparkConf, SparkContext} // 创建 SparkConf 和 SparkContext val conf = new SparkConf().setAppName("NaiveBayesExample") val sc = new SparkContext(conf) // 读取数据集 val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt") // 划分数据集为训练集和测试集 val Array(trainingData, testData) = data.randomSplit(Array(0.7, 0.3), seed = 1234L) // 训练朴素贝叶斯分类器 val model = NaiveBayes.train(trainingData, lambda = 1.0, modelType = "multinomial") // 在测试集上进行预测 val predictions = testData.map { point => val prediction = model.predict(point.features) (prediction, point.label) } // 计算模型准确率 val accuracy = 1.0 * predictions.filter(r => r._1 == r._2).count() / testData.count() println(s"Test set accuracy = $accuracy") // 输出预测结果 predictions.take(10).foreach(println) // 保存模型 model.save(sc, "myModelPath") // 加载模型 val sameModel = NaiveBayesModel.load(sc, "myModelPath") ``` 你可以将你的数据集替换文中的数据集路径,然后运行代码即可得到训练好的模型和预测结果。需要注意的是,在 RDD-based API 中,我们需要显式地调用 `predict` 方法来进行预测。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值