朴素貝葉斯算法原理及Spark MLlib實例(Scala/Java/Python)


朴素貝葉斯

算法介紹:

朴素貝葉斯法是基於貝葉斯定理與特征條件獨立假設的分類方法。

朴素貝葉斯的思想基礎是這樣的:對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,在沒有其它可用信息下,我們會選擇條件概率最大的類別作為此待分類項應屬的類別。

朴素貝葉斯分類的正式定義如下:

1、設 為一個待分類項,而每個a為x的一個特征屬性。

2、有類別集合 。

3、計算 。

4、如果 ,則 。

那么現在的關鍵就是如何計算第3步中的各個條件概率。我們可以這么做:

1、找到一個已知分類的待分類項集合,這個集合叫做訓練樣本集。

2、統計得到在各類別下各個特征屬性的條件概率估計。即 

3、如果各個特征屬性是條件獨立的,則根據貝葉斯定理有如下推導:

 

因為分母對於所有類別為常數,因為我們只要將分子最大化皆可。又因為各特征屬性是條件獨立的,所以有:

 

spark.ml現在支持多項朴素貝葉斯和伯努利朴素貝葉斯。

參數:

featuresCol:

類型:字符串型。

含義:特征列名。

labelCol:

類型:字符串型。

含義:標簽列名。

modelType:

類型:字符串型。

含義:模型類型(區分大小寫)。

predictionCol:

類型:字符串型。

含義:預測結果列名。

probabilityCol:

類型:字符串型。

含義:用以預測類別條件概率的列名。

rawPredictionCol:

類型:字符串型。

含義:原始預測。

smoothing:

類型:雙精度型。

含義:平滑參數。

thresholds:

類型:雙精度數組型。

含義:多分類預測的閥值,以調整預測結果在各個類別的概率。

示例:

Scala:

import org.apache.spark.ml.classification.NaiveBayes import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator // Load the data stored in LIBSVM format as a DataFrame. 
val data = spark.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), seed = 1234L) // Train a NaiveBayes 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("accuracy") val accuracy = evaluator.evaluate(predictions) println("Accuracy: " + accuracy)  

Java:

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.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession; // Load training data 
Dataset<Row> dataFrame = spark.read().format("libsvm").load("data/mllib/sample_libsvm_data.txt"); // Split the data into train and test 
Dataset<Row>[] splits = dataFrame.randomSplit(new double[]{0.6, 0.4}, 1234L); Dataset<Row> train = splits[0]; Dataset<Row> test = splits[1]; // create the trainer and set its parameters 
NaiveBayes nb = new NaiveBayes(); // train the model 
NaiveBayesModel model = nb.fit(train); // compute accuracy on the test set 
Dataset<Row> result = model.transform(test); Dataset<Row> predictionAndLabels = result.select("prediction", "label"); MulticlassClassificationEvaluator evaluator = new MulticlassClassificationEvaluator() .setMetricName("accuracy"); System.out.println("Accuracy = " + evaluator.evaluate(predictionAndLabels));  

Python:

from pyspark.ml.classification import NaiveBayes from pyspark.ml.evaluation import MulticlassClassificationEvaluator # Load training data data = spark.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] # create the trainer and set its parameters nb = NaiveBayes(smoothing=1.0, modelType="multinomial") # train the model model = nb.fit(train) # compute accuracy on the test set result = model.transform(test) predictionAndLabels = result.select("prediction", "label") evaluator = MulticlassClassificationEvaluator(metricName="accuracy") print("Accuracy: " + str(evaluator.evaluate(predictionAndLabels)))  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM