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所示。

13.4.2 Mahout中的频繁模式挖掘 - 图1

更多参数大家可以通过输入“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版本中该示例数据。