13.4.2 Mahout中的频繁模式挖掘
Mahout中实现了FPGrowth算法,FPGrowth算法英文全称为“Frequent Pattern Growth Algorithm”,即“频繁模式增长算法”。关于算法具体内容可参看Mining frequent patterns without candidate generation论文[1]。该算法包括如下两个主要步骤:
1)构建一棵频繁模式树,即FP树;
2)挖掘FP树,找出频繁项。
我们可以通过Mahout Shell的“$MAHOUT_HOME/bin/mahout fpg”命令来使用FPGrowth进行频繁模式挖掘,首先我们对该命令的可选参数进行简要介绍,如表13-4所示。
更多参数大家可以通过输入“mahout fgp-h”来查看。下面我们来介绍具体的操作。
1.数据获取
在执行算法之前我们首先需要获取算法操作的数据[2]。在“$MAHOUT_HOME/core/src/test/resources/retail.dat”位置,Mahout为我们提供了一组零售商销售记录数据,该数据记录的项之间通过空格进行划分。该数据较小,共包含88162条记录,用于测试使用。如果想要使用更大的数据大家可以从下面的链接中下载:http://fimi.cs.helsinki.fi/data/。
2.执行算法
通过“-method”参数可以指定算法运行的模式,下面我们在不同模式下运行处理数据集来比较算法的效率。
首先,我们在sequential模式下执行算法,如下所示:
bin/mahout fpg\
-i core/src/test/resources/retail.dat\
-o patterns\
-k 50\
-method sequential\
-regex'[]'\
-s 2
可以看到该算法的执行时间为:
12/06/07 11:04:11 INFO driver.MahoutDriver:Program took 2193567 ms(Minutes:36.55945)
然后,我们在MapReduce模式下执行该算法。在执行算法之前我们首先需要将数据复制到HDFS中,然后运行算法。如下所示:
bin/mahout fpg\
-i/user/hadoop/retail.dat\
-o patterns2\
-k 50\
-method mapreduce\
-regex'[]'\
-s 2
可以看到该算法的执行时间为:
12/06/07 20:19:05 INFO driver.MahoutDriver:Program took 358158 ms(Minutes:5.9693)
相比于sequential模式,算法执行效率提高了数倍,这恰恰是分布式的优势。在数据量更大的情况下,该优势将更加明显。
3.查看结果
FPGrowth算法的执行结果会以SequenceFile的形式存储在frequentpatterns目录下,我们可以通过下面命令来查看运行的结果:
bin/mahout seqdumper\
-s patterns2/frequentpatterns/part-r-00000\
-c
上述命令中,-s指定的是输入文件路径,-c用于统计结果记录的个数,输出结果如下所示:
mahout seqdumper-s patterns2/frequentpatterns/part-r-00000-c
Input Path:patterns2/frequentpatterns/part-r-00000
Key class:class org.apache.hadoop.io.Text Value Class:class org.apache.mahout.
fpm.pfpgrowth.convertors.string.TopKStringPatterns
Count:14246
12/06/07 19:38:44 INFO driver.MahoutDriver:Program took 2576 ms(Minutes:
0.04293333333333333)
该结果与sequential模式下输出结果相同,大家可以对其进行验证。
[1]http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.40.4436&rep=rep1&type=pdf。
[2]以svn方式下载的Mahout版本中该示例数据。