深入淺出-Mahout分類器-NaiveBayes (Part 1)

Mahout學習一陣子後,我們發現線上教學還沒有很多,尤其在分類器的部分,範例比較缺乏。

我們看到了由chimpler所寫的-

Using the Mahout Naive Bayes Classifier to automatically classify Twitter messages(http://chimpler.wordpress.com/2013/03/13/using-the-mahout-naive-bayes-classifier-to-automatically-classify-twitter-messages/),這篇文章說明如何對於Twitter的訊息,進行自動分類,算是挺新的一篇文章,目標是將Twitter的文章透過Mahout的NaiveBayes分類器,在Hadoop上面進行分類,其類別分為下述幾類。

  1. apparel (clothes, shoes, watches, …)
  2. art (Book, DVD, Music, …)
  3. camera
  4. event (travel, concert, …)
  5. health (beauty, spa, …)
  6. home (kitchen, furniture, garden, …)
  7. tech (computer, laptop, tablet, …)

在執行這個範例前,所有的環境是在Ubuntu 12.04上面進行,需要有幾個基本的環境設定:(1) Hadoop (2) GIT (3) Maven。

1. 我們可以從GitHub取得範例程式以及相關的資料。

git clone https://github.com/fredang/mahout-naive-bayes-example.git

我在是在家目錄 $HOME下執行。

完成後,執行下一行程式,進行編譯:

mvn clean package assembly:single

(注意,maven安裝若碰到問題,請參考:http://stackoverflow.com/questions/15630055/how-to-install-maven-3-on-ubuntu-12-04-12-10-13-04-by-using-apt-get)

2. 取得資料後,我們在資料夾中可以看到以下幾個資料夾:
           data  pom.xml  README.md  scripts  src  target 
data裡面放著已經抓好的twitter訊息資料集,而target則存放一些分析轉換程式。

我們必須先將存放於data資料夾中的tweets-train.tsv轉換為tweets-seq序列檔,在build中已經寫好了程式,直接執行java即可。

$ java -cp target/twitter-naive-bayes-example-1.0-jar-with-dependencies.jar com.chimpler.example.bayes.TweetTSVToSeq data/tweets-train.tsv tweets-seq

接著把轉換後的tweets-seq複製到HDFS裡,透過以下的指令:

$ hadoop fs -put tweets-seq tweets-seq

(注意,這邊請將hadoop的bin設定在$PATH中)

接著我們可以透過mahout的一些工具程式,seq2sparse,這會轉換訓練集的向量資料為tf-idf權重表達的方式,指令如下:

$ mahout seq2sparse -i tweets-seq -o tweets-vectors

(注意,這邊請將mahout的bin設定在$PATH中)

-i 是input輸入的資料夾位置,-o則是輸出的資料夾位置,在輸出的資料夾內,又包含了以下子資料夾,這裡面最重要的就是tfidf-vectors資料夾。

  • df-count: sequence file with association word id => number of document containing this word
  • dictionary.file-0: sequence file with association word => word id
  • frequency.file-0: sequence file with association word id => word count
  • tf-vectors: sequence file with the term frequency for each document
  • tfidf-vectors: sequence file with association document id => tfidf weight for each word in the document
  • tokenized-documents: sequence file with association document id => list of words
  • wordcount: sequence file with association word => word count

3. 取得了序列化tf-idf的向量後,我們要把原本的資料集切成40%的資料作訓練Naive Bayes之用,另外60%的資料作為測試學習後的NaiveBayes分類器。

$ mahout split -i tweets-vectors/tfidf-vectors –trainingOutput train-vectors –testOutput test-vectors –randomSelectionPct 40 –overwrite –sequenceFiles -xm sequential

這邊用的是mahout裡面有一個功能- split,它會將input (-i)的tfidf-vecotrs,依照給予的隨機比率(–randomSelectionPct),決定的是否覆寫(–overwrite)以及決定是否已序列檔案存的方式(–sequenceFiles),決定是否已序列(sequential)或是平行(mapreduce) (–xm)進行分析,最後,將給定輸出的學習資料集位置(–trainingOutput)與測試資料集輸出位置(–testOutput)。

4. 開始學習NaiveBayes

mahout trainnb -i train-vectors -el -li labelindex -o model -ow -c

其中,-el的目的是要萃取原本的模型, -li 會把標記的索引列出來,-o就是輸出學習模型的位置,-ow會可以覆蓋掉原本的model。

最後最後來個測試

mahout testnb -i train-vectors -m model -l labelindex -ow -o tweets-testing -c

如果看到下面的資料~那就大功告成了。

mahout testnb -i train-vectors -m model -l labelindex -ow -o tweets-testing -c

[...]Summary-------------------------------------------------------Correctly Classified Instances          :        314	   97.2136%Incorrectly Classified Instances        :          9	    2.7864%Total Classified Instances              :        323=======================================================Confusion Matrix-------------------------------------------------------a    	b    	c    	d    	e    	f    	g    	但是但是重點是,我們怎麼應用這個模型到實際運作上?請看Part 2。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s