离线轻量级大数据平台Spark之MLib机器学习库朴素贝叶斯实例
?1、樸素貝葉斯介紹
表示事件B已經發生的前提下,事件A發生的概率,叫做事件B發生下事件A的條件概率,公式為:
?
貝葉斯定理:?
從已知P(A|B)獲得P(B|A)值。
假設A和B代表兩類互相影響的事件,如B代表正常郵件和騷擾郵件事件、A代表郵件文本中出現特定詞匯的事件。定義:Ai,其中i∈[1,m],m是A事件總數;Bj,其中j∈[1,n],n是B事件的總數。
根據條件概率公式,先根樣本數求得得P(Ai| Bj)= P(AiBj)/ P(Bj),即AB事件同時發生的概率除以B事件單獨發生時間概率。接著要預測在A事件出現下發生事件B的概率,即:
P(Bj |Ai)=P(Bj)* P(A0| Bj) * P(A1| Bj) *…* P(An| Bj)
樸素貝葉斯算法考慮事件的相互獨立性,有:多項式樸素貝葉斯( multinomial naive Bayes )和伯努利樸素貝葉斯( Bernoulli naive Bayes)。MultinomialNB這個分類器以出現次數作為特征值,使用的TF-IDF也能符合這類分布。其他的樸素貝葉斯分類器如GaussianNB適用于高斯分布(正態分布)的特征,而BernoulliNB適用于伯努利分布(二值分布)的特征。
2、案例說明:
1)輸入數據:天氣情況和每天是否踢足球的記錄表
日期 踢足球 天氣 溫度 濕度風速
1號 否(0) 晴天(0) 熱(0) 高(0) 低(0)
2號 否(0) 晴天(0) 熱(0) 高(0) 高(1)
3號 是(1) 多云(1) 熱(0) 高(0) 低(0)
4號 是(1) 下雨(2) 舒適(1) 高(0) 低(0)
5號 是(1) 下雨(2) 涼爽(2) 正常(1) 低(0)
6號 否(0) 下雨(2) 涼爽(2) 正常(1) 高(1)
7號 是(1) 多云(1) 涼爽(2) 正常(1) 高(1)
8號 否(0) 晴天(0) 舒適(1) 高(0) 低(0)
9號 是(1) 晴天(0) 涼爽(2) 正常(1) 低(0)
10號 是(1) 下雨(2) 舒適(1) 正常(1) 低(0)
11號 是(1) 晴天(0) 舒適(1) 正常(1) 高(1)
12號 是(1) 多云(1) 舒適(1) 高(0) 高(1)
13號 是(1) 多云(1) 熱(0) 正常(1) 低(0)
14號 否(0) 下雨(2) 舒適(1) 高(0) 高(1)
15號 ? 晴天(0)涼爽(2) 高(0)高(1)
抽象為:
0,0 0 0 0
0,0 0 0 1
1,1 0 0 0
1,2 1 0 0
1,2 2 1 0
0,2 2 1 1
1,1 2 1 1
0,0 1 0 0
1,0 2 1 0
1,2 1 1 0
1,0 1 1 1
1,1 1 0 1
1,1 0 1 0
0,2 1 0 1
2)輸出:如果15號的天氣為(晴天,涼爽,濕度高,風速高,預測是否去踢球的概率)
3)計算過程:
假設15號去踢球,踢球概率為:
P(踢)=9/14
P(晴天|踢)=2/9
P(涼爽|踢)=3/9
P(濕度高|踢)=3/9
P(風速高|踢)=3/9
P(踢)由踢的天數除以總天數得到,P(晴天|踢)為踢球的同事是晴天除以踢的天數得到,其他以此類推。
P(踢|晴天,涼爽,濕度高,風速高)=P(踢)* P(晴天|踢)* P(涼爽|踢)* P(濕度高|踢) *P(風速高|踢)=9/14*2/9*3/9*3/9*3/9=0.00529
假設15號不去踢球,概率為:
P(不踢)=5/14
P(晴天|不踢)=3/5
P(涼爽|不踢)=1/5
P(濕度高|不踢)=4/5
P(風速高|不踢)=3/5
P(不踢|晴天,涼爽,濕度高,風速高)=
P(不踢)* P(晴天|不踢)* P(涼爽|不踢)* P(濕度高|不踢) *P(風速高|不踢)=5/14*3/5*1/5*4/5*3/5=0.02057
說明不去踢足球的概率比去踢足球的概率高。
3、Spark平臺MLib庫樸素貝葉斯處理流程如下圖:
??
代碼和執行結果如下:
package sk.mlib;import scala.Tuple2; import org.apache.spark.api.java.function.Function; import org.apache.spark.api.java.function.PairFunction; 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.linalg.Vectors; import org.apache.spark.mllib.regression.LabeledPoint; import org.apache.spark.SparkConf;public class NaiveBayesDemo {public static void main(String[] args) {SparkConf sparkConf = new SparkConf().setAppName("NaiveBayesDemo");JavaSparkContext jsc = new JavaSparkContext(sparkConf);//加載數據String path = "/tmp/NaiveBayesdata.txt";JavaRDD<String> lines =jsc.textFile(path);JavaRDD<LabeledPoint> parsedData = lines.map(new Function<String, LabeledPoint>() {public LabeledPoint call(String s) {String[] sarray = s.split(",");Double dLabel=Double.valueOf(sarray[0]);String[] sFeatures=sarray[1].split(" ");double[] values = new double[sFeatures.length];for (int i = 0; i < sFeatures.length; i++) {values[i] = Double.parseDouble(sFeatures[i]);}System.out.println(dLabel+":"+Vectors.dense(values));LabeledPoint lp=new LabeledPoint(dLabel,Vectors.dense(values));return lp; }});parsedData.cache();//JavaRDD<LabeledPoint> inputData = MLUtils.loadLibSVMFile(jsc.sc(), path).toJavaRDD();// 把數據的60%作為訓練集,40%作為測試集.JavaRDD<LabeledPoint>[] tmp = parsedData.randomSplit(new double[]{0.6, 0.4});JavaRDD<LabeledPoint> training = tmp[0]; // training setJavaRDD<LabeledPoint> test = tmp[1]; // test set//獲得訓練模型,第一個參數為數據,第二個參數為平滑參數,默認為1,可改final NaiveBayesModel model = NaiveBayes.train(training.rdd(), 1.0);//對模型進行準確度分析JavaPairRDD<Double, Double> predictionAndLabel =test.mapToPair(new PairFunction<LabeledPoint, Double, Double>() {@Overridepublic Tuple2<Double, Double> call(LabeledPoint p) {return new Tuple2<>(model.predict(p.features()), p.label());}});double accuracy = predictionAndLabel.filter(new Function<Tuple2<Double, Double>, Boolean>() {@Overridepublic Boolean call(Tuple2<Double, Double> pl) {return pl._1().equals(pl._2());}}).count() / (double) test.count();System.out.println("accuracy-->"+accuracy);//保存和加載訓練模型model.save(jsc.sc(), "/tmp/myNaiveBayesModel");NaiveBayesModel sameModel = NaiveBayesModel.load(jsc.sc(), "/tmp/myNaiveBayesModel");//對新的事件進行概率預測System.out.println("Prediction of (0.0, 2.0, 0.0, 1.0):"+sameModel.predict(Vectors.dense(0.0,2.0,0.0,1.0)));jsc.stop();} } /*執行結果:0.0:[0.0,0.0,0.0,0.0] 0.0:[0.0,0.0,0.0,1.0] 1.0:[1.0,0.0,0.0,0.0] 1.0:[2.0,1.0,0.0,0.0] 1.0:[2.0,2.0,1.0,0.0] 0.0:[2.0,2.0,1.0,1.0] 1.0:[1.0,2.0,1.0,1.0] 0.0:[0.0,1.0,0.0,0.0] 1.0:[0.0,2.0,1.0,0.0] 1.0:[2.0,1.0,1.0,0.0] 1.0:[0.0,1.0,1.0,1.0] 1.0:[1.0,1.0,0.0,1.0] 1.0:[1.0,0.0,1.0,0.0] 0.0:[2.0,1.0,0.0,1.0] accuracy-->0.75,執行結果不一致,和模型訓練本身有關系 Prediction of (0.0, 2.0, 0.0, 1.0):0.0 accuracy低于0.5時是1.0*/總結
以上是生活随笔為你收集整理的离线轻量级大数据平台Spark之MLib机器学习库朴素贝叶斯实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法导论之排序网络
- 下一篇: 离线轻量级大数据平台Spark之MLib