朴素贝叶斯 - 基于RDD的API

Naive Bayes 是一种简单的多类分类算法,假设每对特征之间是独立的。Naive Bayes 可以非常高效地进行训练。在对训练数据进行一次遍历时,它计算每个特征在给定标签下的条件概率分布,然后应用贝叶斯定理计算给定观察值的标签的条件概率分布,并用于预测。

spark.mllib 支持 多项式朴素贝叶斯 伯努利朴素贝叶斯 。 这些模型通常用于 文档分类 。 在此背景下,每个观测值都是一个文档,每个 特征表示一个术语,其值是术语的频率(在多项式朴素贝叶斯中)或 一个零或一,表示术语是否在文档中找到(在伯努利朴素贝叶斯中)。 特征值必须是非负的。模型类型通过可选参数 “multinomial”或“bernoulli”进行选择,默认值为“multinomial”。 加性平滑 可以通过 设置参数 $\lambda$(默认为 $1.0$)来使用。对于文档分类,输入特征 向量通常是稀疏的,应该将稀疏向量作为输入提供,以利用 稀疏性。由于训练数据仅使用一次,因此不必缓存它。

示例

NaiveBayes 实现了多项式朴素贝叶斯。它接受一个 LabeledPoint 的 RDD 和一个可选的平滑参数 lambda 作为输入,并输出一个 NaiveBayesModel ,该模型可用于评估和预测。

请注意,Python API 尚不支持模型的保存/加载,但未来会支持。

请参阅 NaiveBayes Python 文档 NaiveBayesModel Python 文档 获取有关 API 的更多详细信息。

from pyspark.mllib.classification import NaiveBayes, NaiveBayesModel
from pyspark.mllib.util import MLUtils
# 加载和解析数据文件。
data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")
# 将数据大致拆分为训练集 (60%) 和测试集 (40%)
training, test = data.randomSplit([0.6, 0.4])
# 训练一个朴素贝叶斯模型。
model = NaiveBayes.train(training, 1.0)
# 进行预测并测试准确性。
predictionAndLabel = test.map(lambda p: (model.predict(p.features), p.label))
accuracy = 1.0 * predictionAndLabel.filter(lambda pl: pl[0] == pl[1]).count() / test.count()
print('model accuracy {}'.format(accuracy))
# 保存和加载模型
output_dir = 'target/tmp/myNaiveBayesModel'
shutil.rmtree(output_dir, ignore_errors=True)
model.save(sc, output_dir)
sameModel = NaiveBayesModel.load(sc, output_dir)
predictionAndLabel = test.map(lambda p: (sameModel.predict(p.features), p.label))
accuracy = 1.0 * predictionAndLabel.filter(lambda pl: pl[0] == pl[1]).count() / test.count()
print('sameModel accuracy {}'.format(accuracy))
Find full example code at "examples/src/main/python/mllib/naive_bayes_example.py" in the Spark repo.

NaiveBayes 实现了多项式朴素贝叶斯。它接受一个 LabeledPoint 的 RDD 和一个可选的平滑参数 lambda 作为输入,一个可选的模型类型参数(默认是“multinomial”),并输出一个 NaiveBayesModel ,可用于评估和预测。

请参阅 NaiveBayes Scala文档 NaiveBayesModel Scala文档 了解API的详细信息。

import org.apache.spark.mllib.classification.{NaiveBayes, NaiveBayesModel}
import org.apache.spark.mllib.util.MLUtils
// 加载并解析数据文件。
val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")
// 将数据分为训练(60%)和测试(40%)。
val Array(training, test) = data.randomSplit(Array(0.6, 0.4))
val model = NaiveBayes.train(training, lambda = 1.0, modelType = "multinomial")
val predictionAndLabel = test.map(p => (model.predict(p.features), p.label))
val accuracy = 1.0 * predictionAndLabel.filter(x => x._1 == x._2).count() / test.count()
// 保存和加载模型
model.save(sc, "target/tmp/myNaiveBayesModel")
val sameModel = NaiveBayesModel.load(sc, "target/tmp/myNaiveBayesModel")
Find full example code at "examples/src/main/scala/org/apache/spark/examples/mllib/NaiveBayesExample.scala" in the Spark repo.

NaiveBayes 实现了多项式朴素贝叶斯。它接受一个 Scala RDD 的 LabeledPoint 和一个可选的平滑参数 lambda 作为输入,并输出一个 NaiveBayesModel ,可以用于评估和预测。

有关API的详细信息,请参阅 NaiveBayes Java文档 NaiveBayesModel Java文档

import scala.Tuple2;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.mllib.classification.NaiveBayes;
import org.apache.spark.mllib.classification.NaiveBayesModel;
import org.apache.spark.mllib.regression.LabeledPoint;
import org.apache.spark.mllib.util.MLUtils;
String path = "data/mllib/sample_libsvm_data.txt";
JavaRDD<LabeledPoint> inputData = MLUtils.loadLibSVMFile(jsc.sc(), path).toJavaRDD();
JavaRDD<LabeledPoint>[] tmp = inputData.randomSplit(new double[]{0.6, 0.4});
JavaRDD<LabeledPoint> training = tmp[0]; // 训练集
JavaRDD<LabeledPoint> test = tmp[1]; // 测试集
NaiveBayesModel model = NaiveBayes.train(training.rdd(), 1.0);
JavaPairRDD<Double, Double> predictionAndLabel =
test.mapToPair(p -> new Tuple2<>(model.predict(p.features()), p.label()));
double accuracy =
predictionAndLabel.filter(pl -> pl._1().equals(pl._2())).count() / (double) test.count();
// 保存和加载模型
model.save(jsc.sc(), "target/tmp/myNaiveBayesModel");
NaiveBayesModel sameModel = NaiveBayesModel.load(jsc.sc(), "target/tmp/myNaiveBayesModel");
Find full example code at "examples/src/main/java/org/apache/spark/examples/mllib/JavaNaiveBayesExample.java" in the Spark repo.