zoukankan      html  css  js  c++  java
  • hadoop 之Mahout 数据挖掘

    转载:https://blog.csdn.net/u013378306/article/details/87179289

    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
    ————————————————
    版权声明:本文为CSDN博主「u013378306」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u013378306/article/details/87179289

  • 相关阅读:
    js 格式为2018-08-25 11:46:29 的日期比较方法
    ssh linux免密登录。。。。生产共钥到另一台主机
    linux shell脚本调用java main方法 代码传值
    linux shell脚本调用java main方法 代码
    java FTP各种操作
    java通过http服务执行shell命令
    linux ssh 应用
    java通过反射调用有参数的方法
    TranslucentTB汉化版安装教程及资源
    几行Python代码生成动态二维码 myqr的使用教程
  • 原文地址:https://www.cnblogs.com/ceshi2016/p/12124793.html
Copyright © 2011-2022 走看看