Frequent Pattern Mining
挖掘频繁项目,项目集,子序列或其他子结构通常是分析大规模数据集的第一步,这是数据挖掘多年来一直活跃的研究课题。这也是关联规则挖掘的常用算法之一。
关联规则:用于表示数据内隐含的关联性,一般用X表示先决条件,Y表示关联结果。
支持度(Support):所有项集中{X,Y}出现的可能性。
置信度(Confidence):先决条件X发生的条件下,关联结果Y发生的概率。
Apriori算法是常用的关联规则挖掘算法,基本思想是:
(1) 先搜索出1项集及其对应的支持度,删除低于支持度的项集,得到频繁1项集L1;
(2) 对L1中的项集进行连接,得到一个候选集,删除其中低于支持度的项集,得到频繁1项集L2;
…
迭代下去,一直到无法找到L(k+1)为止,对应的频繁k项集集合就是最后的结果。
Apriori算法的缺点是对于候选项集里面的每一项都要扫描一次数据,从而需要多次扫描数据,I/O操作多,效率低。为了提高效率,提出了一些基于Apriori的算法,比如FPGrowth算法。
FPGrowth算法为了减少I/O操作,提高效率,引入了一些数据结构存储数据,主要包括项头表、FP-Tree和节点链表。
在spark.ml的FP-growth算法主要有以下参数:
而输出的模型则包含:
DataFrame(“items”[Array], “freq”[Long])
DataFrame(“antecedent”[Array], “consequent”[Array], “confidence”[Double])
.Spark mllib中的AssociationRules
方法产生的规则的consequent只含有一个item
以下为一个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]| []|
+------------+----------+