朴素贝叶斯 - 基于 RDD 的 API

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

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

示例

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

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

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

from pyspark.mllib.classification import NaiveBayes, NaiveBayesModel
from pyspark.mllib.util import MLUtils



# Load and parse the data file.
data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")

# Split data approximately into training (60%) and test (40%)
training, test = data.randomSplit([0.6, 0.4])

# Train a naive Bayes model.
model = NaiveBayes.train(training, 1.0)

# Make prediction and test accuracy.
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))

# Save and load model
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))
在 Spark 仓库的 “examples/src/main/python/mllib/naive_bayes_example.py” 中可以找到完整的示例代码。

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

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

import org.apache.spark.mllib.classification.{NaiveBayes, NaiveBayesModel}
import org.apache.spark.mllib.util.MLUtils

// Load and parse the data file.
val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")

// Split data into training (60%) and test (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()

// Save and load model
model.save(sc, "target/tmp/myNaiveBayesModel")
val sameModel = NaiveBayesModel.load(sc, "target/tmp/myNaiveBayesModel")
在 Spark 仓库的 “examples/src/main/scala/org/apache/spark/examples/mllib/NaiveBayesExample.scala” 中可以找到完整的示例代码。

NaiveBayes 实现了多项式朴素贝叶斯。它接受一个 LabeledPoint 的 Scala RDD 和一个可选的平滑参数 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]; // training set
JavaRDD<LabeledPoint> test = tmp[1]; // test set
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();

// Save and load model
model.save(jsc.sc(), "target/tmp/myNaiveBayesModel");
NaiveBayesModel sameModel = NaiveBayesModel.load(jsc.sc(), "target/tmp/myNaiveBayesModel");
在 Spark 仓库的 “examples/src/main/java/org/apache/spark/examples/mllib/JavaNaiveBayesExample.java” 中可以找到完整的示例代码。