hadoop 之Mahout 數據挖掘

Mahout 僅提供一些java的算法包,通過Mahout執行這些算法包,並把hdfs上的文件作爲輸入可以在hadoop上做分佈式計算

提供的常用算法

Mahout
 
提供了常用算法的程序庫,可以基於分佈式做數據挖掘.
 
 
常見算法
 
迴歸算法:用於預測(日期交易量預測等等)。
比如身高和體重作爲x,y座標,給出一組人的身高體重,形成作爲圖上的一個個點(學習集),
計算出一條直線或者拋物曲線,能夠離所有點綜合距離最小。
那麼可以任意給出身高,根據給出的曲線預測出相應的體重。
-------------------------------------------------------------
分類器
 
依據以往的數據樣本,做出一個分類器(或者說分類函數),對現有的數據進行分類。
通常是二分函數
 
貝葉斯分類器 概率分類器
常用於垃圾郵件的分類,將郵件內容進行分詞,發現詞語高頻率屬於垃圾郵件的詞彙,
判斷出此郵件是否爲垃圾郵件的概率。
---------------------------------------------------------------
聚類(K-Means)
 
根據數據的共同特性,進行歸類。
 
比如動物的進化樹,通過分析DNA做聚類,可以計算出哪些生物是有親緣關係。
------------------------------------------------------------------
頻繁數據挖掘
 
依據以往數據樣本,計算出物品共同出現的概率。
可以做推薦系統
-------------------------------------------------------------------
傳統數據分析工具的困境
 
R,SAS,SPSS等典型應用場景爲實驗室工具
處理的數據需要先讀入內存,因此數據量受限於內存,無法處理海量數據。
使用Oracle數據等處理海量數據,但缺乏有效快速專業分析功能。
可以採用抽樣等方法,但有侷限性。比如聚類,推薦系統無法使用抽樣
解決方向:hadoop集羣和Map-Reduce並行計算
 
Mahout的主要目的是實現可伸縮的機器學習算法(就是算法的M-R化)。
目的是幫組開發人員建立具有機器智能的應用程序。
1.頻繁模式挖掘
2.聚類算法
3.分類器
4.推薦系統
5.頻繁子項挖掘

Mahout安裝與配置

Ubuntu下基於Hadoop 2.6.2的Mahout 0.12.1安裝和使用
環境:
Ubuntu Server 14.04.04 amd64 Hadoop 2.6.2 
參考:
http://itindex.net/detail/49323-mahout-%E5%AD%A6%E4%B9%A0-mahout
新版的配置有略微改動


1、下載
http://mirror.bit.edu.cn/apache/mahout/0.12.1/
apache-mahout-distribution-0.12.1.tar.gz


2、解壓
tar -zxvf mahout-distribution-0.12.1.tar.gz


3、環境變量
3.1、配置Mahout環境變量
# set mahout environment
export MAHOUT_HOME=/usr/local/mahout/mahout-distribution-0.12.1
export MAHOUT_CONF_DIR=$MAHOUT_HOME/conf
export PATH=$MAHOUT_HOME/conf:$MAHOUT_HOME/bin:$PATH
3.2、配置Mahout所需的Hadoop環境變量
 # set hadoop environment
export HADOOP_HOME=/usr/local/hadoop/hadoop-2.6.2 
export MAHOUT_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
export HADOOP_HOME_WARN_SUPPRESS=not_null


四、驗證Mahout是否安裝成功
$mahout,執行
若列出一些算法,則成功
root@spark:/usr/local/mahout/apache-mahout-distribution-0.12.1# mahout
MAHOUT_LOCAL is not set; adding HADOOP_CONF_DIR to classpath.
Running on hadoop, using /usr/local/hadoop/hadoop-2.6.2/bin/hadoop and HADOOP_CONF_DIR=/usr/local/hadoop/hadoop-2.6.2/conf
MAHOUT-JOB: /usr/local/mahout/apache-mahout-distribution-0.12.1/mahout-examples-0.12.1-job.jar
An example program must be given as the first argument.
Valid program names are:
  arff.vector: : Generate Vectors from an ARFF file or directory
  baumwelch: : Baum-Welch algorithm for unsupervised HMM training
  canopy: : Canopy clustering
  cat: : Print a file or resource as the logistic regression models would see it
  cleansvd: : Cleanup and verification of SVD output
  clusterdump: : Dump cluster output to text
  clusterpp: : Groups Clustering Output In Clusters
  cmdump: : Dump confusion matrix in HTML or text formats
。。。


五、Mahout使用(一)
5.1、啓動Hadoop
(Hadoop安裝可參考本人其他博文的鏈接)
/usr/local/hadoop/hadoop-2.6.2/sbin/start-dfs.sh
/usr/local/hadoop/hadoop-2.6.2/sbin/start-yarn.sh
./mr-jobhistory-daemon.sh start historyserver
5.2、下載測試數據
http://archive.ics.uci.edu/ml/databases/synthetic_control/,鏈接中的synthetic_control.data
5.3、上傳測試數據
root@spark:~# hadoop fs -put /home/alex/pcshare/XData/synthetic_control.data /user/root/testdata
5.4  使用Mahout中的kmeans聚類算法

執行命令:

mahout -core  org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
等待幾分鐘。。。 
出現類似下邊的說明成功了。。。結果自動打印出來了
1.0 : [distance=65.25867095278808]: [30.573,41.074,44.979,44.922,43.272,39.713,33.097,31.012,26.03,22.191,16.82,21.089,29.101,27.763,41.43,42.245,35.947,44.868,35.821,24.775,29.244,20.686,12.381,25.885,18.873,26.381,39.696,40.666,40.693,35.249,31.458,28.821,24.015,19.608,13.017,13.592,26.841,26.265,26.931,41.894,38.723,42.73,39.036,30.817,24.18,25.618,14.164,16.674,14.107,24.789,29.088,31.482,36.327,46.833,46.544,38.817,32.532,24.353,19.72,12.751]
16/06/04 13:58:22 INFO ClusterDumper: Wrote 6 clusters
16/06/04 13:58:22 INFO MahoutDriver: Program took 770182 ms (Minutes: 12.836483333333334)
root@spark:~# 
5.5 查看聚類結果
$hadoop fs -ls /user/root/output,查看聚類結果。 
root@spark:~# hadoop fs -ls /user/root/output
Found 15 items
-rw-r--r--   1 root supergroup        194 2016-06-04 13:57 /user/root/output/_policy
drwxr-xr-x   - root supergroup          0 2016-06-04 13:58 /user/root/output/clusteredPoints
drwxr-xr-x   - root supergroup          0 2016-06-04 13:47 /user/root/output/clusters-0
drwxr-xr-x   - root supergroup          0 2016-06-04 13:49 /user/root/output/clusters-1
drwxr-xr-x   - root supergroup          0 2016-06-04 13:57 /user/root/output/clusters-10-final
drwxr-xr-x   - root supergroup          0 2016-06-04 13:50 /user/root/output/clusters-2
drwxr-xr-x   - root supergroup          0 2016-06-04 13:51 /user/root/output/clusters-3
drwxr-xr-x   - root supergroup          0 2016-06-04 13:52 /user/root/output/clusters-4
drwxr-xr-x   - root supergroup          0 2016-06-04 13:53 /user/root/output/clusters-5
drwxr-xr-x   - root supergroup          0 2016-06-04 13:54 /user/root/output/clusters-6
drwxr-xr-x   - root supergroup          0 2016-06-04 13:55 /user/root/output/clusters-7
drwxr-xr-x   - root supergroup          0 2016-06-04 13:56 /user/root/output/clusters-8
drwxr-xr-x   - root supergroup          0 2016-06-04 13:57 /user/root/output/clusters-9
drwxr-xr-x   - root supergroup          0 2016-06-04 13:47 /user/root/output/data
drwxr-xr-x   - root supergroup          0 2016-06-04 13:47 /user/root/output/random-seeds
root@spark:~# 


六、Mahout使用(二)
KMeans聚類
主要參考,http://www.coder4.com/archives/4181,不過更新了一點新版的命令
http://my.oschina.net/endeavour/blog/491518?p={{totalPage}}
數據下載:
http://www.daviddlewis.com/resources/testcollections/reuters21578/
http://www.daviddlewis.com/resources/testcollections/reuters21578/reuters21578.tar.gz
6.1解壓
先用tar =xvzf reuters21578.tar.gz,(在windows下也可以用winrar解壓)
root@spark:/home/alex# ls
pcshare  reuters21578  seed.txt  t1.log  test.log  xdata  xsetups
6.2用mahout ExtractReuters抽取數據
root@spark:/home/alex# mahout org.apache.lucene.benchmark.utils.ExtractReuters ./reuters21578/ ./reuters-out
MAHOUT_LOCAL is not set; adding HADOOP_CONF_DIR to classpath.
Running on hadoop, using /usr/local/hadoop/hadoop-2.6.2/bin/hadoop and HADOOP_CONF_DIR=/usr/local/hadoop/hadoop-2.6.2/etc/hadoop
MAHOUT-JOB: /usr/local/mahout/apache-mahout-distribution-0.12.1/mahout-examples-0.12.1-job.jar
16/06/05 22:23:50 WARN MahoutDriver: No org.apache.lucene.benchmark.utils.ExtractReuters.props found on classpath, will use command-line arguments only
Deleting all files in /home/alex/./reuters-out-tmp
16/06/05 22:24:06 INFO MahoutDriver: Program took 15945 ms (Minutes: 0.26575)
root@spark:/home/alex# ls
pcshare  reuters21578  reuters-out  seed.txt  t1.log  test.log  xdata  xsetups
6.3轉爲序列化文件
6.3.1 local mode
mahout seqdirectory -i file://$(pwd)/reuters-out/ -o file://$(pwd)/reuters-seq/ -c UTF-8 -chunk 64 -xm sequential
上述命令蘊含了2個大坑,在其他文檔中均沒有仔細說明:
(1) -xm sequential,表示在本地執行,而不是用MapReduce執行。如果是後者,我們勢必要將這些小文件上傳到HDFS上,那樣的話,還要SequenceFile做甚……
(2) 然而seqdirectory在執行的時候,並不因爲十本地模式,就在本地文件系統上尋找。而是根據-i -o的文件系統前綴來判斷文件位置。也就是說,默認情況,依然十在HDFS上查找的……所以,這個file://的前綴是非常有必要的。
結果:
root@spark:/home/alex# mahout seqdirectory -i file://$(pwd)/reuters-out/ -o file://$(pwd)/reuters-seq/ -c UTF-8 -chunk 64 -xm sequential
MAHOUT_LOCAL is not set; adding HADOOP_CONF_DIR to classpath.
Running on hadoop, using /usr/local/hadoop/hadoop-2.6.2/bin/hadoop and HADOOP_CONF_DIR=/usr/local/hadoop/hadoop-2.6.2/etc/hadoop
MAHOUT-JOB: /usr/local/mahout/apache-mahout-distribution-0.12.1/mahout-examples-0.12.1-job.jar
16/06/05 22:30:51 INFO AbstractJob: Command line arguments: {--charset=[UTF-8], --chunkSize=[64], --endPhase=[2147483647], --fileFilterClass=[org.apache.mahout.text.PrefixAdditionFilter], --input=[file:///home/alex/reuters-out/], --keyPrefix=[], --method=[sequential], --output=[file:///home/alex/reuters-seq/], --startPhase=[0], --tempDir=[temp]}
16/06/05 22:37:32 INFO MahoutDriver: Program took 401032 ms (Minutes: 6.683883333333333
root@spark:/home/alex# ls
pcshare       reuters-out  seed.txt  test.log  xsetups
reuters21578  reuters-seq  t1.log    xdata
6.3.2 hdfs mode
先把6.2的文件用hadoop fs -put ./reuters-out /reuters-out傳到hdfs上,然後
mahout seqdirectory -c UTF-8
-i /reuters-out
-o reuters-seq
6.4向量化
先上傳到hdfs
root@spark:/home/alex# hadoop fs -put reuters-seq /reuters-seq
root@spark:/home/alex# hadoop fs -ls /
Found 17 items
drwxr-xr-x   - root supergroup          0 2016-06-05 22:41 /reuters-seq
向量化
mahout seq2sparse -i /reuters-seq -o /reuters-sparse -ow --weight tfidf --maxDFPercent 85 --namedVector
輸入和輸出不解釋了。在Mahout中的向量類型可以稱爲sparse。
參數說明如下:
-ow( 或 –overwrite):即使輸出目錄存在,依然覆蓋。
–weight(或 -wt) tfidf:權重公式,大家都懂的。其他可選的有tf (當LDA時建議使用)。
–maxDFPercent(或 -x) 85:過濾高頻詞,當DF大於85%時,將不在作爲詞特徵輸出到向量中。
–namedVector (或-nv):向量會輸出附加信息。
其他可能有用的選項:
–analyzerName(或-a):指定其他分詞器。
–minDF:最小DF閾值。
–minSupport:最小的支持度閾值,默認爲2。
–maxNGramSize(或-ng):是否創建ngram,默認爲1。建議一般設定到2就夠了。
–minLLR(或 -ml):The minimum Log Likelihood Ratio。默認爲1.0。當設定了-ng > 1後,建議設置爲較大的值,只過濾有意義的N-Gram。
–logNormalize(或 -lnorm):是否對輸出向量做Log變換。
–norm(或 -n):是否對輸出向量做p-norm變換,默認不變換。
結果:
16/06/05 22:56:43 INFO HadoopUtil: Deleting /reuters-sparse/partial-vectors-0
16/06/05 22:56:43 INFO MahoutDriver: Program took 774045 ms (Minutes: 12.90075)
root@spark:/home/alex# hadoop fs -ls /reuters-sparse
Found 7 items
drwxr-xr-x   - root supergroup          0 2016-06-05 22:51 /reuters-sparse/df-count
-rw-r--r--   1 root supergroup     824086 2016-06-05 22:48 /reuters-sparse/dictionary.file-0
-rw-r--r--   1 root supergroup     844593 2016-06-05 22:52 /reuters-sparse/frequency.file-0
drwxr-xr-x   - root supergroup          0 2016-06-05 22:54 /reuters-sparse/tf-vectors
drwxr-xr-x   - root supergroup          0 2016-06-05 22:56 /reuters-sparse/tfidf-vectors
drwxr-xr-x   - root supergroup          0 2016-06-05 22:45 /reuters-sparse/tokenized-documents
drwxr-xr-x   - root supergroup          0 2016-06-05 22:47 /reuters-sparse/wordcount
6.5 KMeans聚類
mahout kmeans -i /reuters-sparse/tfidf-vectors -c /reuters-kmeans-clusters -o /reuters-kmeans -k 20 -dm org.apache.mahout.common.distance.CosineDistanceMeasure -x 200 -ow --clustering
參數說明如下:
-i:輸入爲上面產出的tfidf向量。
-o:每一輪迭代的結果將輸出在這裏。
-k:幾個簇。
-c:這是一個神奇的變量。若不設定k,則用這個目錄裏面的點,作爲聚類中心點。否則,隨機選擇k個點,作爲中心點。
-dm:距離公式,文本類型推薦用cosine距離。
-x :最大迭代次數。
–clustering:在mapreduce模式運行。
–convergenceDelta:迭代收斂閾值,默認0.5,對於Cosine來說略大。
結果:
16/06/05 23:06:06 INFO MahoutDriver: Program took 282166 ms (Minutes: 4.70285)
輸出1,初始隨機選擇的中心點:
root@spark:/home/alex# hadoop fs -ls /reuters-kmeans-clusters
Found 1 items
-rw-r--r--   1 root supergroup      20692 2016-06-05 23:01 /reuters-kmeans-clusters/part-randomSeed
輸出2,聚類過程、結果:
root@spark:/home/alex# hadoop fs -ls /reuters-kmeans
Found 5 items
-rw-r--r--   1 root supergroup        194 2016-06-05 23:05 /reuters-kmeans/_policy
drwxr-xr-x   - root supergroup          0 2016-06-05 23:06 /reuters-kmeans/clusteredPoints
drwxrwxrwx   - root supergroup          0 2016-06-05 23:01 /reuters-kmeans/clusters-0
drwxr-xr-x   - root supergroup          0 2016-06-05 23:03 /reuters-kmeans/clusters-1
drwxr-xr-x   - root supergroup          0 2016-06-05 23:05 /reuters-kmeans/clusters-2-final
查看簇結果
首先,用clusterdump,來查看k(20)個簇的信息。
root@spark:/home/alex# hadoop fs -get /reuters-kmeans/ ./
查看簇信息
root@spark:/home/alex# mahout clusterdump -i /reuters-kmeans/clusters-2-final -d /reuters-sparse/dictionary.file-0 -dt sequencefile -o ./reuters-kmeans-cluster-dump/ -n 20
要說明的是,clusterdump似乎只能在本地執行……所以先把數據下載到本地吧。上邊那個-o是本地路徑,前邊兩個是hdfs路徑。
參數說明:
-i :我們只看最終迭代生成的簇結果。
-d :使用 詞 -> 詞id 映射,使得我們輸出結果中,可以直接顯示每個簇,權重最高的詞文本,而不是詞id。
-dt:上面映射類型,由於我們是seqdictionary生成的,so。。
-o:最終產出目錄
-n:每個簇,只輸出20個權重最高的詞。
看看dump結果吧:
一共有20行,表示20個簇。每行形如:
結果:
root@spark:/home/alex# ls
pcshare       reuters-kmeans               reuters-out  seed.txt  test.log  xsetups
reuters21578  reuters-kmeans-cluster-dump  reuters-seq  t1.log    xdata
root@spark:/home/alex# vi reuters-kmeans-cluster-dump 


{"identifier":"VL-3240","r":[{"0":1.072},{"0.01":0.409},{"0.02":0.313},{"0.07":0.491},{"0.1":0.699},{"0.10":0.923},{"0.11":0.796},{"0.12":0.715},{"0.125":0.313},{"0.13":0.738},{"0.15":0.652},{"0.16":0.433},{"0.17":0.433},{"0.18":0.301},{"0.19":0.452},{"0.2":0.613},{"0.20":0.405},{"0.21":0.466},{"0.22":0.796},{"0.23":0.685},{"0.24":0.452},{"0.25":0.662},{"0.28":0.571},{"0.29":0.466},{"0.3":0.373},{"0.30":0.675},{"0.31":0.485},{"0.32":0.485},{"0.33":0.602},{"0.34":0.32},{"0.35":0.886},{"0.375":0.33},{"0.38":0.433},{"0.39":0.81},{"0.4":0.309},{"0.40":0.633},{"0.41":0.33},{"0.43":0.466},{"0.44":0.659},{"0.45":0.409},{"0.46":0.32},{"0.49":0.659},{"0.5":0.353},{"0.50":0.755},{"0.51":0.433},{"0.52":1.042},{"0.53":0.639},{"0.55":0.613},{"0.59":0.32},{"0.6":0.32},{"0.60":0.501},{"0.61":0.715},{"0.63":0.466},{"0.65":0.613},{"0.66":0.659},{"0.7":0.492},{"0.72":0.466},{"0.73":0.466},{"0.75":0.384},{"0.76":0.715},{"0.77":0.53},{"0.78":0.442},{"0.79":0.466},{"0.8":0.4
。。。
root@spark:/home/alex# vi reuters-kmeans-cluster-dump 


        Top Terms:
                tonnes                                  =>   4.616685099484926
                wheat                                   =>  2.4975221396023555
                said                                    =>   1.823860074602947
                u.s                                     =>  1.7899877993194988
                corn                                    =>  1.7751955093944525
                agriculture                             =>  1.7748332692679425
                crop                                    =>  1.7612196082261729
                usda                                    =>  1.7265009986265731
                87                                      =>  1.7197907841816247
                grain                                   =>  1.6382993807505923
                1986                                    =>  1.6183747005356446
                department                              =>  1.4992590311640885


其中前面的3240是簇的ID,n即簇中有這麼多個文檔。c向量是簇中心點向量,格式爲 詞文本:權重(點座標),r是簇的半徑向量,格式爲 詞文本:半徑。


下面的Top Terms是簇中選取出來的特徵詞。


查看聚類結果


其實,聚類結果中,更重要的是,文檔被聚到了哪個類。


遺憾的是,在很多資料中,都沒有說明這一點。前文我們已經提到了,簇id -> 文檔id的結果,保存在了clusteredPoints下面。這也是mahout內置類型存儲的。我們可以用seqdumper命令查看。


mahout seqdumper -i /reuters-kmeans/clusteredPoints/


其中,-d和-dt的原因同clusterdump。


如果不指定-o,默認輸出到屏幕,輸出結果爲形如:
Key: 3533: Value: wt: 1.0 distance: 0.5482928103119538  vec: [{"834":8.677},{"1555":7.453},{"2689":3.135},{"3730":3.051},{"4397":2.9},{"4747":4.021},{"7711":4.54},{"10344":4.808},{"12157":4.993},{"19031":4.827},{"20362":1.988},{"23135":4.284},{"25508":6.227},{"26109":4.315},{"29802":4.378},{"29996":4.846},{"30234":4.959},{"30377":3.82},{"30567":3.545},{"30839":3.567},{"33426":3.249},{"33834":9.624},{"34837":5.249},{"36387":4.446},{"39389":11.363},{"39463":9.881},{"39538":4.789},{"40723":7.031}]
Count: 21578
16/06/05 23:26:36 INFO MahoutDriver: Program took 37830 ms (Minutes: 0.6305)


其實,這個輸出是一個SequenceFile,大家自己寫程序也可以讀出來的。


Key是ClusterID,上面clusterdump的時候,已經說了。


Value是文檔的聚類結果:wt是文檔屬於簇的概率,對於kmeans總是1.0,/reut2-000.sgm-0.txt就是文檔標誌啦,前面seqdirectionary的-nv起作用了,再後面的就是這個點的各個詞id和權重了。


七、Mahout使用(三):
數據如下,代碼待續。。。
http://qwone.com/~jason/20Newsgroups/
http://qwone.com/~jason/20Newsgroups/20news-bydate.tar.gz
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章