我已经在Spark中用FpGrowth算法生成了关联规则。代码源码如下:
val dataset = spark.createDataset(Seq("aaa bbbb eee","bbbb ccc eee","aaa bbbb")).map(t => t.split(" ")).toDF("items")
val fpgrowth = new FPGrowth().setItemsCol("items").setMinSupport(0.5).setMinConfidence(0.6)
val model = fpgrowth.fit(dataset)
model.freqItemsets.show()
model.associationRules.show()但是,我如何使用生成的规则进行预测呢?
发布于 2018-02-02 22:11:47
我自己仍然在努力处理非类型化的Dataframe-Rows,所以我不能告诉你应该如何使用这些规则。所以我只会告诉你如何使用它们。这个解决方案可能不是很惯用。
不管怎样..。下面是看起来不错的代码:
import org.apache.spark.ml.fpm._
val dataset = spark.createDataset(Seq(
"a b e","b c e", "a b", "a b e", "a b d e",
"a e c f", "a b f e", "a f c e",
"c d w x", "c x p d", "p q c d", "c p d r a",
"a c b d", "c d p q", "c r p d"
)).map(t => t.split(" ")).toDF("items")
val fpgrowth = new FPGrowth().setItemsCol("items").
setMinSupport(0.3).setMinConfidence(0.5)
val model = fpgrowth.fit(dataset)
val rules = model.associationRules
val exampleShoppingCart = Array("a", "b", "c", "d")
val proposals = rules.rdd.map{ rule =>
val antecedent = rule.getAs[Seq[String]]("antecedent")
val consequent = rule.getAs[Seq[String]]("consequent")
if (antecedent.forall(exampleShoppingCart.contains)) {
consequent.toSet
} else {
Set.empty[String]
}
}.reduce(_ ++ _)
val nonTrivialProposals = proposals.filterNot(exampleShoppingCart.contains)
println(
"Your shopping cart: " + exampleShoppingCart.mkString(",") +
"; You might also be interested in: " + nonTrivialProposals
)
// Output:
// Your shopping cart: a,b,c,d; You might also be interested in: Set(e, p)简要说明:model.associationRules为您提供了一个包含三列的Dataframe:antecedent、consequent和confidence。如果您想使用这样的规则来为给定事务exampleShoppingCart的扩展提出建议,那么您必须检查antecedent中的所有项是否都出现在事务exampleShoppingCart中。如果是这种情况,您可以将consequent的所有元素添加到提案中。如果antecedent中的某些项没有出现在事务中,那么规则就不匹配,您就不需要提出任何东西(Set.empty)。一旦你计算了所有规则中的所有建议,只需将它们简化为一个单一的建议。最后,您可能希望删除事务中已经包含的项(这正是filter的优势所在)。
了解如何将规则集缩减为更小的等效规则集将是一件很有趣的事情,例如,如果包含{x} => {y},则不会重复{x, z} => {y}。
发布于 2018-02-03 00:15:24
但是我如何使用生成的规则进行预测呢?
它就像这样简单:
model.transform(dataset).show()
// +----------------+----------+
// | items|prediction|
// +----------------+----------+
// |[aaa, bbbb, eee]| []|
// |[bbbb, ccc, eee]| [aaa]|
// | [aaa, bbbb]| [eee]|
// +----------------+----------+https://stackoverflow.com/questions/48580819
复制相似问题