记一个FPGrowth的简单例子

前言

Frequent Pattern Mining
挖掘频繁项目,项目集,子序列或其他子结构通常是分析大规模数据集的第一步,这是数据挖掘多年来一直活跃的研究课题。这也是关联规则挖掘的常用算法之一。

关联规则中的一些基本概念

  • 关联规则:用于表示数据内隐含的关联性,一般用X表示先决条件,Y表示关联结果。

  • 支持度(Support):所有项集中{X,Y}出现的可能性。

  • 置信度(Confidence):先决条件X发生的条件下,关联结果Y发生的概率。

Apriori算法

Apriori算法是常用的关联规则挖掘算法,基本思想是:

(1) 先搜索出1项集及其对应的支持度,删除低于支持度的项集,得到频繁1项集L1;

(2) 对L1中的项集进行连接,得到一个候选集,删除其中低于支持度的项集,得到频繁1项集L2;

迭代下去,一直到无法找到L(k+1)为止,对应的频繁k项集集合就是最后的结果。

Apriori算法的缺点是对于候选项集里面的每一项都要扫描一次数据,从而需要多次扫描数据,I/O操作多,效率低。为了提高效率,提出了一些基于Apriori的算法,比如FPGrowth算法。

FP-Growth

FPGrowth算法为了减少I/O操作,提高效率,引入了一些数据结构存储数据,主要包括项头表、FP-Tree和节点链表。
在spark.ml的FP-growth算法主要有以下参数:

  • minSupport:对项目集进行频繁识别的最低支持。 例如,如果一个项目出现在5个交易中的3个中,则它具有3/5 = 0.6的支持。
  • minConfidence:生成关联规则的最小置信度。 置信度表明关联规则经常被发现的频率。 例如,如果在交易项目集X中出现4次,X和Y仅出现2次,则规则X => Y的置信度则为2/4 = 0.5。 该参数不会影响频繁项集的挖掘,但会指定从频繁项集生成关联规则的最小置信度。
  • numPartitions:用于分发工作的分区数。 默认情况下,不设置参数,并使用输入数据集的分区数。

而输出的模型则包含:

  • freqItemsets:频繁项集,格式为DataFrame(“items”[Array], “freq”[Long])
  • associationRules:以高于minConfidence的置信度生成的关联规则,格式为DataFrame(“antecedent”[Array], “consequent”[Array], “confidence”[Double]).
  • transform:对于itemsCol中的每个事务,transform方法将其项目与每个关联规则的前提进行比较。 如果记录包含特定关联规则的所有前提(规则中的前项),则该规则将被视为适用,并且其结果将被添加到预测结果中。 transform方法将所有适用规则的结果总结为预测。 预测列与itemsCol具有相同的数据类型,并且不包含itemsCol中的现有项

Spark mllib中的AssociationRules方法产生的规则的consequent只含有一个item

Spark使用示例

以下为一个spark中FPGrowth使用的简单示例:

import org.apache.spark.ml.fpm.FPGrowth

val dataset = spark.createDataset(Seq(
"D E",
"A B C",
"A B C E",
"B E",
"C D E",
"A B C",
"A B C E",
"B E",
"F G",
"D F")
).map(t => t.split(" ")).toDF("items")


val fpgrowth = new FPGrowth().setItemsCol("items").setMinSupport(0.3) 
//val fpgrowth = new FPGrowth().setItemsCol("items").setMinSupport(0.3) .setMinConfidence(0.6)
val model = fpgrowth.fit(dataset)

// Display frequent itemsets.
model.freqItemsets.show()

// Display generated association rules.
model.associationRules.show()

// transform examines the input items against all the association rules and summarize the
// consequents as prediction
model.transform(dataset).show()

//save model
model.save("/tmp/fp.ml")

//load saved model
import org.apache.spark.ml.fpm.FPGrowthModel
val savedModel = FPGrowthModel.load("/tmp/fp.ml")

结果如下:

scala> model.freqItemsets.show()
+---------+----+
|    items|freq|
+---------+----+
|      [B]|   6|
|      [E]|   6|
|   [E, B]|   4|
|      [C]|   5|
|   [C, E]|   3|
|   [C, B]|   4|
|      [A]|   4|
|   [A, C]|   4|
|[A, C, B]|   4|
|   [A, B]|   4|
|      [D]|   3|
+---------+----+
scala> model.associationRules.show()
+----------+----------+----------+------------------+
|antecedent|consequent|confidence|              lift|
+----------+----------+----------+------------------+
|    [A, C]|       [B]|       1.0|1.6666666666666667|
|    [C, B]|       [A]|       1.0|               2.5|
|       [C]|       [B]|       0.8|1.3333333333333335|
|       [C]|       [A]|       0.8|               2.0|
|    [A, B]|       [C]|       1.0|               2.0|
|       [A]|       [C]|       1.0|               2.0|
|       [A]|       [B]|       1.0|1.6666666666666667|
+----------+----------+----------+------------------+
scala>model.transform(dataset).show()
+------------+----------+
|       items|prediction|
+------------+----------+
|      [D, E]|        []|
|   [A, B, C]|        []|
|[A, B, C, E]|        []|
|      [B, E]|        []|
|   [C, D, E]|    [B, A]|
|   [A, B, C]|        []|
|[A, B, C, E]|        []|
|      [B, E]|        []|
|      [F, G]|        []|
|      [D, F]|        []|
+------------+----------+

你可能感兴趣的:(Spark,Spark学习随笔)