天天看點

Spark樸素貝葉斯(naiveBayes)

樸素貝葉斯(Naïve Bayes)

介紹

 Byesian算法是統計學的分類方法,它是一種利用機率統計知識進行分類的算法。在許多場合,樸素貝葉斯分類算法可以與決策樹和神經網絡分類算法想媲美,該算法能運用到大型資料庫中,且方法簡單,分類準确率高,速度快,這個算法是從貝葉斯定理的基礎上發展而來的,貝葉斯定理假設不同屬性值之間是不相關聯的。但是現實說中的很多時候,這種假設是不成立的,進而導緻該算法的準确性會有所下降。

運用場景

         1.醫生對病人進行診斷就是一個典型的分類過程,任何一個醫生都無法直接看到病人的病情,隻能觀察病人表現出的症狀和各種化驗檢測資料來推斷病情,這時醫生就好比一個分類器,而這個醫生診斷的準确率,與他當初受到的教育方式(構造方法)、病人的症狀是否突出(待分類資料的特性)以及醫生的經驗多少(訓練樣本數量)都有密切關系。

         2.根據各種天氣狀況判斷一個人是否會去踢球,下面的例子就是。

         3.各種分類場景

貝葉斯定理

已知某條件機率,如何得到兩個事件交換後的機率,也就是在已知P(A|B)的情況下如何求得P(B|A)。這裡先解釋什麼是條件機率:

      表示事件B已經發生的前提下,事件A發生的機率,叫做事件B發生下事件A的條件機率。其基本求解公式為:

Spark樸素貝葉斯(naiveBayes)

     貝葉斯定理之是以有用,是因為我們在生活中經常遇到這種情況:我們可以很容易直接得出P(A|B),P(B|A)則很難直接得出,但我們更關心P(B|A),貝葉斯定理就為我們打通從P(A|B)獲得P(B|A)的道路。

     下面直接給出貝葉斯定理:

Spark樸素貝葉斯(naiveBayes)

輸入資料說明

資料:天氣情況和每天是否踢足球的記錄表

日期

踢足球

天氣

溫度

濕度

風速

1号

否(0)

晴天(0)

熱(0)

高(0)

低(0)

2号

高(1)

3号

是(1)

多雲(1)

4号

下雨(2)

舒适(1)

5号

涼爽(2)

正常(1)

6号

7号

8号

9号

10号

11号

12号

13号

14号

15号

資料抽象為如下,含義為是否會去踢球,天氣,溫度,濕度,風速

Spark樸素貝葉斯(naiveBayes)

如果15号的天氣為(晴天,涼爽,濕度高,風速高,預測他是否會踢足球)

計算過程

假設小明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

可以看到小明不去踢足球的機率比去踢足球的機率高。

Spark樸素貝葉斯(naiveBayes)

測試代碼

importorg.apache.spark.mllib.classification.NaiveBayes

import org.apache.spark.mllib.linalg.Vectors

import org.apache.spark.mllib.regression.LabeledPoint

import org.apache.spark.{SparkContext,SparkConf}

object naiveBayes {

  def main(args: Array[String]) {

    val conf =new

SparkConf()

    val sc =new

SparkContext(conf)

    //讀入資料

    val data = sc.textFile(args(0))

    val parsedData =data.map { line =>

      val parts =line.split(',')

      LabeledPoint(parts(0).toDouble,Vectors.dense(parts(1).split('

').map(_.toDouble)))

    }

    // 把資料的60%作為訓練集,40%作為測試集.

    val splits = parsedData.randomSplit(Array(0.6,0.4),seed

= 11L)

    val training =splits(0)

    val test =splits(1)

    //獲得訓練模型,第一個參數為資料,第二個參數為平滑參數,預設為1,可改

    val model =NaiveBayes.train(training,lambda =

1.0)

    //對模型進行準确度分析

    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()

    println("accuracy-->"+accuracy)

    println("Predictionof (0.0, 2.0, 0.0, 1.0):"+model.predict(Vectors.dense(0.0,2.0,0.0,1.0)))

  }

}

送出代碼腳本(standalone模式):

./bin/spark-submit

--name nb                            (項目名)

--class naiveBayes                       (主類名)

--master spark://master:7077            (使用叢集管理器)

~/Desktop/naiveBayes.jar                       (代碼包位置)

Hdfs://master:9000/NB.data             (args(0)的參數值)

輸出結果說明

Spark樸素貝葉斯(naiveBayes)

準确度為75%,這裡是因為測試集資料量比較小的原因,是以偏差較大。

Spark樸素貝葉斯(naiveBayes)

可以從結果看到對15号的預測為不會踢球,和我們數學計算的結果一緻。

繼續閱讀