八、Frequent pattern mining
挖掘频繁项,项集,子序列或其他子结构通常是分析大规模数据集的第一步,而这是多年来数据挖掘中的活跃研究主题。我们建议用户参考Wikipedia的关联规则学习以获取更多信息。 spark.mllib提供了FP-growth的并行实现,这是一种用于挖掘频繁项集的流行算法。
FP-growth
FP增长算法在Han等人的论文中进行了描述,该算法在不生成候选者的情况下挖掘频繁模式,其中“ FP”代表频繁模式。给定交易数据集,FP增长的第一步是计算项目频率并识别频繁项目。与为相同目的设计的类似Apriori的算法不同,FP-growth的第二步使用后缀树(FP-tree)结构对交易进行编码,而无需显式生成候选集,这通常成本较高。第二步之后,可以从FP树中提取频繁项集。在spark.mllib中,我们实现了称为PFP的FP-growth的并行版本,如Li et al。,PFP:并行FP-growth用于查询推荐中所述。 PFP根据事务的后缀分配增长的FP树的工作,因此比单机实现更具可伸缩性。我们为用户提供了更多信息,请参考这些论文。
spark.mllib的FP-growth实现采用以下(超)参数:
- minSupport: 对一个项目集的最低支持,该项目集被确定为频繁。例如,如果某项出现在5个事务中的3个,则其支持率为3/5 = 0.6。
- numPartitions:用于分发作品的分区数。
示例代码
import org.apache.spark.mllib.fpm.FPGrowth
import org.apache.spark.rdd.RDD
val data = sc.textFile("data/mllib/sample_fpgrowth.txt")
val transactions: RDD[Array[String]] = data.map(s => s.trim.split(' '))
val fpg = new FPGrowth()
.setMinSupport(0.2)
.setNumPartitions(10)
val model = fpg.run(transactions)
model.freqItemsets.collect().foreach { itemset =>
println(s"${itemset.items.mkString("[", ",", "]")},${itemset.freq}")
}
val minConfidence = 0.8
model.generateAssociationRules(minConfidence).collect().foreach { rule =>
println(s"${rule.antecedent.mkString("[", ",", "]")}=> " +
s"${rule.consequent .mkString("[", ",", "]")},${rule.confidence}")
}
association rules
AssociationRules实现了并行规则生成算法,用于构造具有单个结果的规则。
示例代码
import org.apache.spark.mllib.fpm.AssociationRules
import org.apache.spark.mllib.fpm.FPGrowth.FreqItemset
val freqItemsets = sc.parallelize(Seq(
new FreqItemset(Array("a"), 15L),
new FreqItemset(Array("b"), 35L),
new FreqItemset(Array("a", "b"), 12L)
))
val ar = new AssociationRules()
.setMinConfidence(0.8)
val results = ar.run(freqItemsets)
results.collect().foreach { rule =>
println(s"[${rule.antecedent.mkString(",")}=>${rule.consequent.mkString(",")} ]" +
s" ${rule.confidence}")
}
PrefixSpan
PrefixSpan是Pei等人在“通过模式增长来挖掘顺序模式:PrefixSpan方法”中描述的顺序模式挖掘算法。我们为读者提供参考文献,以规范化顺序模式挖掘问题。
spark.mllib的PrefixSpan实现采用以下参数:
- minSupport: 被视为频繁顺序模式所需的最低支持。
- maxPatternLength: 频繁顺序模式的最大长度。任何超出此长度的频繁模式都不会包含在结果中。
- maxLocalProjDBSize: 在开始对投影数据库进行本地迭代处理之前,前缀投影数据库中允许的最大项目数。此参数应根据执行程序的大小进行调整。
Examples
以下示例说明了在序列上运行的PrefixSpan(使用与Pei等人相同的表示法):
<(12)3>
<1(32)(12)>
<(12)5>
<6>
示例代码
import org.apache.spark.mllib.fpm.PrefixSpan
val sequences = sc.parallelize(Seq(
Array(Array(1, 2), Array(3)),
Array(Array(1), Array(3, 2), Array(1, 2)),
Array(Array(1, 2), Array(5)),
Array(Array(6))
), 2).cache()
val prefixSpan = new PrefixSpan()
.setMinSupport(0.5)
.setMaxPatternLength(5)
val model = prefixSpan.run(sequences)
model.freqSequences.collect().foreach { freqSequence =>
println(
s"${freqSequence.sequence.map(_.mkString("[", ", ", "]")).mkString("[", ", ", "]")}," +
s" ${freqSequence.freq}")
}
十、PMML model export(PMML模型导出)
spark.mllib supported models
spark.mllib支持将模型导出到预测模型标记语言(PMML)。
下表概述了可以导出到PMML的spark.mllib模型及其等效的PMML模型。
示例
要将支持的模型(请参见上表)导出到PMML,只需调用model.toPMML。
除了将PMML模型导出为字符串(如上例中的model.toPMML)之外,您还可以将PMML模型导出为其他格式。
有关API的详细信息,请参阅KMeans Scala文档和Vectors Scala文档。
这里是构建KMeansModel并以PMML格式打印出来的完整示例:
import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors
// Load and parse the data
val data = sc.textFile("data/mllib/kmeans_data.txt")
val parsedData = data.map(s => Vectors.dense(s.split(' ').map(_.toDouble))).cache()
// Cluster the data into two classes using KMeans
val numClusters = 2
val numIterations = 20
val clusters = KMeans.train(parsedData, numClusters, numIterations)
// Export to PMML to a String in PMML format
println(s"PMML Model:\n ${clusters.toPMML}")
// Export the model to a local file in PMML format
clusters.toPMML("/tmp/kmeans.xml")
// Export the model to a directory on a distributed file system in PMML format
clusters.toPMML(sc, "/tmp/kmeans")
// Export the model to the OutputStream in PMML format
clusters.toPMML(System.out)