搭建環境
部署節點操作系統為CentOS,防火牆和SElinux禁用,創建了一個shiyanlou用戶並在系統根目錄下創建/app目錄,用於存放 Hadoop等組件運行包。因為該目錄用於安裝hadoop等組件程序,用戶對shiyanlou必須賦予rwx權限(一般做法是root用戶在根目錄下 創建/app目錄,並修改該目錄擁有者為shiyanlou(chown –R shiyanlou:shiyanlou /app)。
Hadoop搭建環境:
- 虛擬機操作系統: CentOS6.6 64位,單核,1G內存
- JDK:1.7.0_55 64位
- Hadoop:1.1.2
2 Mahout介紹
Mahout 是 Apache Software Foundation(ASF) 旗下的一個開源項目,提供一些可擴展的機器學習領域經典算法的實現,旨在幫助開發人員更加方便快捷地創建智能應用程序。AMahout包含許多實現,包括 聚類、分類、推薦過濾、頻繁子項挖掘。此外,通過使用 Apache Hadoop 庫,Mahout 可以有效地擴展到雲中。
Mahout的意思是大象的飼養者及驅趕者。Mahout 這個名稱來源於該項目(有時)使用 Apache Hadoop —其徽標上有一頭黃色的大象 —來實現可伸縮性和容錯性。
Mahout 項目是由 Apache Lucene(開源搜索)社區中對機器學習感興趣的一些成員發起的,他們希望建立一個可靠、文檔翔實、可伸縮的項目,在其中實現一些常見的用於集群和分類 的機器學習算法。該社區最初基於 Ng et al. 的文章 “Map-Reduce for Machine Learning on Multicore”(見 參考資料),但此后在發展中又並入了更多廣泛的機器學習方法。Mahout 的目標還包括:
- 建立一個用戶和貢獻者社區,使代碼不必依賴於特定貢獻者的參與或任何特定公司和大學的資金。
- 專注於實際用例,這與高新技術研究及未經驗證的技巧相反。
- 提供高質量文章和示例
3 搭建Mahout環境
3.1 部署過程
3.1.1 下載Mahout
在Apache下載最新的Mahout軟件包,點擊下載會推薦最快的鏡像站點,以下為下載地址:http://archive.apache.org/dist/mahout/0.6/
也可以在/home/shiyanlou/install-pack目錄中找到該安裝包,解壓該安裝包並把該安裝包復制到/app目錄中
- cd /home/shiyanlou/install-pack
- tar -xzf mahout-distribution-0.6.tar.gz
- mv mahout-distribution-0.6 /app/mahout-0.6
3.1.2 設置環境變量
使用如下命令編輯/etc/profile文件:
- sudo vi /etc/profile
聲明mahout的home路徑和在path加入bin的路徑:
- export MAHOUT_HOME=/app/mahout-0.6
- export MAHOUT_CONF_DIR=/app/mahout-0.6/conf
- export PATH=$PATH:$MAHOUT_HOME/bin
編譯配置文件/etc/profile,並確認生效
- source /etc/profile
- echo $PATH
3.1.3 驗證安裝完成
重新登錄終端,確保hadoop集群啟動,鍵入mahout --help命令,檢查Mahout是否安裝完好,看是否列出了一些算法:
- mahout --help
3.2 測試例子
3.2.1 下載測試數據
下載一個文件synthetic_control.data,下載地址:
http://labfile.oss.aliyuncs.com/courses/237/synthetic_control.data
把這個文件放在$MAHOUT_HOME/testdata目錄下
- cd /home/shiyanlou/install-pack/class9
- wget
- mkdir /app/mahout-0.6/testdata
- mv synthetic_control.data /app/mahout-0.6/testdata
3.2.2 啟動Hadoop
通過下面命令啟動hadoop並通過jps查看進程
- cd /app/hadoop-1.1.2/bin
- ./start-all.sh
- jps
3.2.3 使用kmeans算法
使用如下命令進行kmeans算法測試:
- cd /app/mahout-0.6/
- mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
這里需要說明下,當你看到下面的代碼時以為是錯的,其實不是,原因:MAHOUT_LOCAL:設置是否本地運行,如果設置該參數就不會在hadoop運行了,一旦設置這個參數那HADOOP_CONF_DIR 和HADOOP_HOME兩個參數就自動失效了。
MAHOUT_LOCAL is not set, so we don't add HADOOP_CONF_DIR to classpath. no HADOOP_HOME set , running locally
3.2.4 查看結果
結果會在根目錄建立output新文件夾,如果下圖結果表示mahout安裝正確且運行正常:
- cd /app/mahout-0.6/output
- ll
4 測試例子:運行20newsgroup
4.1 算法流程
朴素貝葉斯分類是一種十分簡單的分類算法,朴素貝葉斯的思想基礎是這樣的:對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率哪個最大,就認為此待分類項屬於哪個類別。
這二十個新聞組數據集合是收集大約20,000新聞組文檔,均勻的分布在20個不同的集合。這20個新聞組集合采集最近流行的數據集合到文本程序中 作為實驗,根據機器學習技術。例如文本分類,文本聚集。我們將使用Mahout的Bayes Classifier創造一個模型,它將一個新文檔分類到這20個新聞組集合范例演示
4.2 實現過程(mahout 0.6版本)
4.2.1 下載數據並解壓數據
下載20Newsgroups數據集,地址為 http://qwone.com/~jason/20Newsgroups/ ,下載20news-bydate.tar.gz數據包,也可以在/home/shiyanlou/install-pack/class9目錄中找到該測試數據文件:
解壓20news-bydate.tar.gz數據包,解壓后可以看到兩個文件夾,分別為訓練原始數據和測試原始數據:
- cd /home/shiyanlou/install-pack/class9
- tar -xzf 20news-bydate.tar.gz
在mahout根目錄下建data文件夾,然后把20news訓練原始數據和測試原始數據遷移到該文件夾下:
- mkdir /app/mahout-0.6/data
- mv 20news-bydate-t* /app/mahout-0.6/data
- ll /app/mahout-0.6/data
4.2.2 建立訓練集
通過如下命令建立訓練集,訓練的數據在20news-bydate-train目錄中,輸出的訓練集目錄為 bayes-train-input:
- cd /app/mahout-0.6
- mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups \
- -p /app/mahout-0.6/data/20news-bydate-train \
- -o /app/mahout-0.6/data/bayes-train-input \
- -a org.apache.mahout.vectorizer.DefaultAnalyzer \
- -c UTF-8
4.2.3 建立測試集
通過如下命令建立訓練集,訓練的數據在20news-bydate-test目錄中,輸出的訓練集目錄為 bayes-test-input:
- mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups \
- -p /app/mahout-0.6/data/20news-bydate-test \
- -o /app/mahout-0.6/data/bayes-test-input \
- -a org.apache.mahout.vectorizer.DefaultAnalyzer \
- -c UTF-8
4.2.4 上傳數據到HDFS
在HDFS中新建/class9/20news文件夾,把生成的訓練集和測試集上傳到HDFS的/class9/20news目錄中:
- hadoop fs -mkdir /class9/20news
- hadoop fs -put /app/mahout-0.6/data/bayes-train-input /class9/20news
- hadoop fs -put /app/mahout-0.6/data/bayes-test-input /class9/20news
- hadoop fs -ls /class9/20news
- hadoop fs -ls /class9/20news/bayes-test-input
4.2.5 訓練貝葉斯分類器
使用trainclassifier類訓練在HDFS中/class9/20news/bayes-train-input的數據,生成的模型放到/class9/ 20news/newsmodel 目錄中:
- mahout trainclassifier \
- -i /class9/20news/bayes-train-input \
- -o /class9/20news/newsmodel \
- -type cbayes \
- -ng 2 \
- -source hdfs
4.2.6 觀察訓練作業運行過程
注:實驗樓為命令行界面,無法觀測到該步驟界面,以下描述僅做參考 在訓練過程中在JobTracker頁面觀察運行情況,鏈接地址為http://**.***.**.***:50030/jobtracker.jsp,訓練任務四個作業,大概運行了15分鍾左右: 點擊查看具體作業信息
map運行情況
作業運行情況
4.2.7 查看生成模型
通過如下命令查看模型內容:
- hadoop fs -ls /class9/20news
- hadoop fs -ls /class9/20news/newsmodel
- hadoop fs -ls /class9/20news/newsmodel/trainer-tfIdf
4.2.8 測試貝葉斯分類器
使用testclassifier類訓練在HDFS中./20news/bayestest-input的數據,使用的模型路徑為./ 20news/newsmodel:
- mahout testclassifier \
- -m /class9/20news/newsmodel \
- -d /class9/20news/bayes-test-input \
- -type cbayes \
- -ng 2 \
- -source hdfs \
- -method mapreduce
4.2.9 觀察訓練作業運行過程
注:實驗樓為命令行界面,無法觀測到該步驟界面,以下描述僅做參考 在執行過程中在JobTracker頁面觀察運行情況,鏈接地址為http://hadoop:50030/jobtracker.jsp,訓練任務1個作業,大概運行了5分鍾左右: 作業的基本信息
map運行情況
reduce運行情況
4.2.10 查看結果
這個混合矩陣的意思說明:上述a到u分別是代表了有20類別,這就是我們之前給的20個輸入文件,列中的數據說明每個類別中被分配到的字節個數,classified說明應該被分配到的總數 381 0 0 0 0 9 1 0 0 0 1 0 0 2 0 1 0 0 3 0 0 | 398 a = rec.motorcycles 意思為rec.motorcycles 本來是屬於 a,有381篇文檔被划為了a類,這個是正確的數據,其它的分別表示划到 b~u類中的數目。我們可以看到其正確率為 381/398=0.9573 ,可見其正確率還是很高的了。
4.3 實現過程(mahout 0.7+版本)
在0.7版本的安裝目錄下$MAHOUT_HOME/examples/bin下有個腳本文件classifu-20newsgroups.sh, 這個腳本中執行過程是和前面分布執行結果是一致的,只不過將各個API用shell腳本封裝到一起了。從0.7版本開始,Mahout移除了命令行調用的 API:prepare20newsgroups、trainclassifier和testclassifier,只能通過shell腳本執行。 執行 $MAHOUT_HOME/examples/bin/classify-20newsgroups.sh 四個選項中選擇第一個選項, 執行結果如下:
5 問題解決
5.1 使用mahout0.7+版本對20Newsgroup數據建立訓練集時出錯
使用如下命令對20Newsgroupt數據建立訓練集時:
- mahout org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups \
- -p /app/mahout-0.9/data/20news-bydate-train \
- -o /app/mahout-0.9/data/bayes-train-input \
- -a org.apache.mahout.vectorizer.DefaultAnalyzer\
- -c UTF-8
出現如下錯誤,原因在於從0.7版本開始,Mahout移除了命令行調用的prepare20newsgroups、 trainclassifier和testclassifier API,只能通過shell腳本執行$MAHOUT_HOME/examples/bin/classify-20newsgroups.sh進行
14/12/7 21:31:35 WARN driver.MahoutDriver: Unable to add class: org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups
14/12/7 21:31:35 WARN driver.MahoutDriver: No org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups.props found on classpath, will use command-line arguments onlyUnknown program 'org.apache.mahout.classifier.bayes.PrepareTwentyNewsgroups' chosen. Valid program names are: arff.vector: : Generate Vectors from an ARFF file or directory baumwelch: : Baum-Welch algorithm for unsupervised HMM training .......