From a80fcd4be79f465e1303a3b28d21acacf77e930e Mon Sep 17 00:00:00 2001 From: Yuhao Yang Date: Mon, 1 Feb 2016 10:28:33 -0500 Subject: [PATCH 1/7] add doc and scala example --- docs/ml-classification-regression.md | 25 ++++++++ .../spark/examples/ml/NaiveBayesExample.scala | 58 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala diff --git a/docs/ml-classification-regression.md b/docs/ml-classification-regression.md index 8ffc997b4bf5a..f6ae24daab707 100644 --- a/docs/ml-classification-regression.md +++ b/docs/ml-classification-regression.md @@ -302,6 +302,31 @@ Refer to the [Java API docs](api/java/org/apache/spark/ml/classification/OneVsRe +## Naive Bayes + +[OneVsRest](http://en.wikipedia.org/wiki/Multiclass_classification#One-vs.-rest) are a family of simple +probabilistic classifiers based on applying Bayes' theorem with strong (naive) independence assumptions +between the features. More information about the spark.ml implementation can be found further in the +section on [Naive Bayes in MLlib](mllib-naive-bayes.html#naive-bayes-sparkmllib). + +**Example** + +
+
+ +Refer to the [Scala API docs](api/scala/index.html#org.apache.spark.ml.classification.NaiveBayes) for more details. + +{% include_example scala/org/apache/spark/examples/ml/NaiveBayesExample.scala %} +
+ +
+ +Refer to the [Java API docs](api/java/org/apache/spark/ml/classification/OneVsRest.html) for more details. + +{% include_example java/org/apache/spark/examples/ml/JavaOneVsRestExample.java %} +
+
+ # Regression diff --git a/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala b/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala new file mode 100644 index 0000000000000..80048ef801326 --- /dev/null +++ b/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// scalastyle:off println +package org.apache.spark.examples.ml + +import org.apache.spark.{SparkConf, SparkContext} +// $example on$ +import org.apache.spark.ml.classification.{NaiveBayes} +import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator +// $example off$ +import org.apache.spark.sql.SQLContext + +object NaiveBayesExample { + def main(args: Array[String]): Unit = { + val conf = new SparkConf().setAppName("NaiveBayesExample") + val sc = new SparkContext(conf) + val sqlContext = new SQLContext(sc) + // $example on$ + // Load the data stored in LIBSVM format as a DataFrame. + val data = sqlContext.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt") + + // Split the data into training and test sets (30% held out for testing) + val Array(trainingData, testData) = data.randomSplit(Array(0.7, 0.3)) + + // Train a DecisionTree model. + val model = new NaiveBayes() + .fit(trainingData) + + // Select example rows to display. + val predictions = model.transform(testData) + predictions.show() + + // Select (prediction, true label) and compute test error + val evaluator = new MulticlassClassificationEvaluator() + .setLabelCol("label") + .setPredictionCol("prediction") + .setMetricName("precision") + val accuracy = evaluator.evaluate(predictions) + println("Test Error = " + (1.0 - accuracy)) + // $example off$ + } +} +// scalastyle:on println From ee2cabbc9efe7a73dc8fcc5a105ce4078e0bb563 Mon Sep 17 00:00:00 2001 From: Yuhao Yang Date: Tue, 2 Feb 2016 10:45:56 +0800 Subject: [PATCH 2/7] add java and python example --- .../examples/ml/JavaNaiveBayesExample.java | 62 +++++++++++++++++++ .../src/main/python/ml/naivebayes_example.py | 56 +++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java create mode 100644 examples/src/main/python/ml/naivebayes_example.py diff --git a/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java b/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java new file mode 100644 index 0000000000000..64cede5c2c252 --- /dev/null +++ b/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.examples.ml; + +// $example on$ +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaSparkContext; +import org.apache.spark.ml.classification.NaiveBayes; +import org.apache.spark.ml.classification.NaiveBayesModel; +import org.apache.spark.sql.SQLContext; +import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator; +import org.apache.spark.sql.DataFrame; +// $example off$ + +/** + * An example for Multilayer Perceptron Classification. + */ +public class JavaNaiveBayesExample { + + public static void main(String[] args) { + SparkConf conf = new SparkConf().setAppName("JavaNaiveBayesExample"); + JavaSparkContext jsc = new JavaSparkContext(conf); + SQLContext jsql = new SQLContext(jsc); + + // $example on$ + // Load training data + DataFrame dataFrame = jsql.read().format("libsvm").load("data/mllib/sample_libsvm_data.txt"); + // Split the data into train and test + DataFrame[] splits = dataFrame.randomSplit(new double[]{0.6, 0.4}, 1234L); + DataFrame train = splits[0]; + DataFrame test = splits[1]; + + // create the trainer and set its parameters + NaiveBayes trainer = new NaiveBayes(); + // train the model + NaiveBayesModel model = trainer.fit(train); + // compute precision on the test set + DataFrame result = model.transform(test); + DataFrame predictionAndLabels = result.select("prediction", "label"); + MulticlassClassificationEvaluator evaluator = new MulticlassClassificationEvaluator() + .setMetricName("precision"); + System.out.println("Precision = " + evaluator.evaluate(predictionAndLabels)); + // $example off$ + + jsc.stop(); + } +} diff --git a/examples/src/main/python/ml/naivebayes_example.py b/examples/src/main/python/ml/naivebayes_example.py new file mode 100644 index 0000000000000..de288757b7770 --- /dev/null +++ b/examples/src/main/python/ml/naivebayes_example.py @@ -0,0 +1,56 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from __future__ import print_function + +from pyspark import SparkContext +from pyspark.sql import SQLContext +# $example on$ +from pyspark.ml.classification import NaiveBayes +from pyspark.ml.evaluation import MulticlassClassificationEvaluator +# $example off$ + +if __name__ == "__main__": + + sc = SparkContext(appName="multilayer_perceptron_classification_example") + sqlContext = SQLContext(sc) + + # $example on$ + # Load training data + data = sqlContext.read.format("libsvm") \ + .load("data/mllib/sample_libsvm_data.txt") + # Split the data into train and test + splits = data.randomSplit([0.6, 0.4], 1234) + train = splits[0] + test = splits[1] + # specify layers for the neural network: + # input layer of size 4 (features), two intermediate of size 5 and 4 + # and output of size 3 (classes) + layers = [4, 5, 4, 3] + # create the trainer and set its parameters + trainer = NaiveBayes(smoothing=1.0, modelType="multinomial") + + # train the model + model = trainer.fit(train) + # compute precision on the test set + result = model.transform(test) + predictionAndLabels = result.select("prediction", "label") + evaluator = MulticlassClassificationEvaluator(metricName="precision") + print("Precision:" + str(evaluator.evaluate(predictionAndLabels))) + # $example off$ + + sc.stop() From 71f1f89f226b6b24da827a98ad0394132d801041 Mon Sep 17 00:00:00 2001 From: Yuhao Yang Date: Tue, 2 Feb 2016 11:05:29 +0800 Subject: [PATCH 3/7] add python link --- docs/ml-classification-regression.md | 19 +++++++++++++------ .../examples/ml/JavaNaiveBayesExample.java | 2 +- ...ayes_example.py => naive_bayes_example.py} | 0 3 files changed, 14 insertions(+), 7 deletions(-) rename examples/src/main/python/ml/{naivebayes_example.py => naive_bayes_example.py} (100%) diff --git a/docs/ml-classification-regression.md b/docs/ml-classification-regression.md index f6ae24daab707..d8a55280affdf 100644 --- a/docs/ml-classification-regression.md +++ b/docs/ml-classification-regression.md @@ -304,10 +304,10 @@ Refer to the [Java API docs](api/java/org/apache/spark/ml/classification/OneVsRe ## Naive Bayes -[OneVsRest](http://en.wikipedia.org/wiki/Multiclass_classification#One-vs.-rest) are a family of simple -probabilistic classifiers based on applying Bayes' theorem with strong (naive) independence assumptions -between the features. More information about the spark.ml implementation can be found further in the -section on [Naive Bayes in MLlib](mllib-naive-bayes.html#naive-bayes-sparkmllib). +[Naive Bayes](http://en.wikipedia.org/wiki/Naive_Bayes_classifier) are a family of simple +probabilistic classifiers based on applying Bayes' theorem with strong (naive) independence +assumptions between the features. More information about the spark.ml implementation can be +found further in the section on [Naive Bayes in MLlib](mllib-naive-bayes.html#naive-bayes-sparkmllib). **Example** @@ -321,9 +321,16 @@ Refer to the [Scala API docs](api/scala/index.html#org.apache.spark.ml.classific
-Refer to the [Java API docs](api/java/org/apache/spark/ml/classification/OneVsRest.html) for more details. +Refer to the [Java API docs](api/java/org/apache/spark/ml/classification/NaiveBayes.html) for more details. -{% include_example java/org/apache/spark/examples/ml/JavaOneVsRestExample.java %} +{% include_example java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java %} +
+ +
+ +Refer to the [Python API docs](api/python/pyspark.ml.html#pyspark.ml.classification.NaiveBayes) for more details. + +{% include_example python/ml/naive_bayes_example.py %}
diff --git a/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java b/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java index 64cede5c2c252..f0361214e6b70 100644 --- a/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java +++ b/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java @@ -22,9 +22,9 @@ import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.ml.classification.NaiveBayes; import org.apache.spark.ml.classification.NaiveBayesModel; -import org.apache.spark.sql.SQLContext; import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator; import org.apache.spark.sql.DataFrame; +import org.apache.spark.sql.SQLContext; // $example off$ /** diff --git a/examples/src/main/python/ml/naivebayes_example.py b/examples/src/main/python/ml/naive_bayes_example.py similarity index 100% rename from examples/src/main/python/ml/naivebayes_example.py rename to examples/src/main/python/ml/naive_bayes_example.py From be5586bee139e73fcd936ea24b2c0b73c61668d0 Mon Sep 17 00:00:00 2001 From: Yuhao Yang Date: Tue, 2 Feb 2016 11:12:32 +0800 Subject: [PATCH 4/7] fix some comment --- .../apache/spark/examples/ml/JavaNaiveBayesExample.java | 2 +- examples/src/main/python/ml/naive_bayes_example.py | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java b/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java index f0361214e6b70..f18e2f4906cbc 100644 --- a/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java +++ b/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java @@ -28,7 +28,7 @@ // $example off$ /** - * An example for Multilayer Perceptron Classification. + * An example for Naive Bayes Classification. */ public class JavaNaiveBayesExample { diff --git a/examples/src/main/python/ml/naive_bayes_example.py b/examples/src/main/python/ml/naive_bayes_example.py index de288757b7770..1ad4c85a81fbf 100644 --- a/examples/src/main/python/ml/naive_bayes_example.py +++ b/examples/src/main/python/ml/naive_bayes_example.py @@ -26,7 +26,7 @@ if __name__ == "__main__": - sc = SparkContext(appName="multilayer_perceptron_classification_example") + sc = SparkContext(appName="naive_bayes_example") sqlContext = SQLContext(sc) # $example on$ @@ -37,10 +37,7 @@ splits = data.randomSplit([0.6, 0.4], 1234) train = splits[0] test = splits[1] - # specify layers for the neural network: - # input layer of size 4 (features), two intermediate of size 5 and 4 - # and output of size 3 (classes) - layers = [4, 5, 4, 3] + # create the trainer and set its parameters trainer = NaiveBayes(smoothing=1.0, modelType="multinomial") From 769595f8813af66eb95d58e1e007a0ab01a9874f Mon Sep 17 00:00:00 2001 From: Yuhao Yang Date: Sun, 10 Apr 2016 03:18:29 -0400 Subject: [PATCH 5/7] change name and comment --- .../examples/ml/JavaNaiveBayesExample.java | 22 ++++++++++--------- .../src/main/python/ml/naive_bayes_example.py | 4 ++-- .../spark/examples/ml/NaiveBayesExample.scala | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java b/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java index f18e2f4906cbc..41d7ad75b9d45 100644 --- a/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java +++ b/examples/src/main/java/org/apache/spark/examples/ml/JavaNaiveBayesExample.java @@ -17,13 +17,15 @@ package org.apache.spark.examples.ml; -// $example on$ + import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; +// $example on$ import org.apache.spark.ml.classification.NaiveBayes; import org.apache.spark.ml.classification.NaiveBayesModel; import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator; -import org.apache.spark.sql.DataFrame; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; import org.apache.spark.sql.SQLContext; // $example off$ @@ -39,19 +41,19 @@ public static void main(String[] args) { // $example on$ // Load training data - DataFrame dataFrame = jsql.read().format("libsvm").load("data/mllib/sample_libsvm_data.txt"); + Dataset dataFrame = jsql.read().format("libsvm").load("data/mllib/sample_libsvm_data.txt"); // Split the data into train and test - DataFrame[] splits = dataFrame.randomSplit(new double[]{0.6, 0.4}, 1234L); - DataFrame train = splits[0]; - DataFrame test = splits[1]; + Dataset[] splits = dataFrame.randomSplit(new double[]{0.6, 0.4}, 1234L); + Dataset train = splits[0]; + Dataset test = splits[1]; // create the trainer and set its parameters - NaiveBayes trainer = new NaiveBayes(); + NaiveBayes nb = new NaiveBayes(); // train the model - NaiveBayesModel model = trainer.fit(train); + NaiveBayesModel model = nb.fit(train); // compute precision on the test set - DataFrame result = model.transform(test); - DataFrame predictionAndLabels = result.select("prediction", "label"); + Dataset result = model.transform(test); + Dataset predictionAndLabels = result.select("prediction", "label"); MulticlassClassificationEvaluator evaluator = new MulticlassClassificationEvaluator() .setMetricName("precision"); System.out.println("Precision = " + evaluator.evaluate(predictionAndLabels)); diff --git a/examples/src/main/python/ml/naive_bayes_example.py b/examples/src/main/python/ml/naive_bayes_example.py index 1ad4c85a81fbf..db8fbea9bf9b1 100644 --- a/examples/src/main/python/ml/naive_bayes_example.py +++ b/examples/src/main/python/ml/naive_bayes_example.py @@ -39,10 +39,10 @@ test = splits[1] # create the trainer and set its parameters - trainer = NaiveBayes(smoothing=1.0, modelType="multinomial") + nb = NaiveBayes(smoothing=1.0, modelType="multinomial") # train the model - model = trainer.fit(train) + model = nb.fit(train) # compute precision on the test set result = model.transform(test) predictionAndLabels = result.select("prediction", "label") diff --git a/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala b/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala index 80048ef801326..2af2249cf9e84 100644 --- a/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala +++ b/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala @@ -51,7 +51,7 @@ object NaiveBayesExample { .setPredictionCol("prediction") .setMetricName("precision") val accuracy = evaluator.evaluate(predictions) - println("Test Error = " + (1.0 - accuracy)) + println("Precision:" + accuracy) // $example off$ } } From 03d22b37c5198702691c378f7400c1bf078c97d5 Mon Sep 17 00:00:00 2001 From: Yuhao Yang Date: Tue, 12 Apr 2016 15:15:17 +0800 Subject: [PATCH 6/7] enrich docs --- docs/ml-classification-regression.md | 6 ++++-- .../org/apache/spark/examples/ml/NaiveBayesExample.scala | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/ml-classification-regression.md b/docs/ml-classification-regression.md index 4d0abf26d2457..eaf4f6d843368 100644 --- a/docs/ml-classification-regression.md +++ b/docs/ml-classification-regression.md @@ -306,8 +306,10 @@ Refer to the [Java API docs](api/java/org/apache/spark/ml/classification/OneVsRe [Naive Bayes](http://en.wikipedia.org/wiki/Naive_Bayes_classifier) are a family of simple probabilistic classifiers based on applying Bayes' theorem with strong (naive) independence -assumptions between the features. More information about the spark.ml implementation can be -found further in the section on [Naive Bayes in MLlib](mllib-naive-bayes.html#naive-bayes-sparkmllib). +assumptions between the features. The spark.ml implementation currently supports both [multinomial +naive Bayes](http://nlp.stanford.edu/IR-book/html/htmledition/naive-bayes-text-classification-1.html) +and [Bernoulli naive Bayes](http://nlp.stanford.edu/IR-book/html/htmledition/the-bernoulli-model-1.html). +More information can be found in the section on [Naive Bayes in MLlib](mllib-naive-bayes.html#naive-bayes-sparkmllib). **Example** diff --git a/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala b/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala index 2af2249cf9e84..87f380bf30d6b 100644 --- a/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala +++ b/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala @@ -37,7 +37,7 @@ object NaiveBayesExample { // Split the data into training and test sets (30% held out for testing) val Array(trainingData, testData) = data.randomSplit(Array(0.7, 0.3)) - // Train a DecisionTree model. + // Train a NaiveBayes model. val model = new NaiveBayes() .fit(trainingData) From e27fe714e553901860f45dba6906fa7fcc4dcdb0 Mon Sep 17 00:00:00 2001 From: Yuhao Yang Date: Wed, 13 Apr 2016 14:20:36 +0800 Subject: [PATCH 7/7] change accuracy to precision --- .../org/apache/spark/examples/ml/NaiveBayesExample.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala b/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala index 87f380bf30d6b..5ea1270c9781c 100644 --- a/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala +++ b/examples/src/main/scala/org/apache/spark/examples/ml/NaiveBayesExample.scala @@ -50,8 +50,8 @@ object NaiveBayesExample { .setLabelCol("label") .setPredictionCol("prediction") .setMetricName("precision") - val accuracy = evaluator.evaluate(predictions) - println("Precision:" + accuracy) + val precision = evaluator.evaluate(predictions) + println("Precision:" + precision) // $example off$ } }