首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该如何在Scala中使用FPGrowth提供的规则?

我应该如何在Scala中使用FPGrowth提供的规则?
EN

Stack Overflow用户
提问于 2018-02-02 18:35:51
回答 2查看 381关注 0票数 0

我已经在Spark中用FpGrowth算法生成了关联规则。代码源码如下:

代码语言:javascript
复制
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()

但是,我如何使用生成的规则进行预测呢?

EN

回答 2

Stack Overflow用户

发布于 2018-02-02 22:11:47

我自己仍然在努力处理非类型化的Dataframe-Rows,所以我不能告诉你应该如何使用这些规则。所以我只会告诉你如何使用它们。这个解决方案可能不是很惯用。

不管怎样..。下面是看起来不错的代码:

代码语言:javascript
复制
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为您提供了一个包含三列的Dataframeantecedentconsequentconfidence。如果您想使用这样的规则来为给定事务exampleShoppingCart的扩展提出建议,那么您必须检查antecedent中的所有项是否都出现在事务exampleShoppingCart中。如果是这种情况,您可以将consequent的所有元素添加到提案中。如果antecedent中的某些项没有出现在事务中,那么规则就不匹配,您就不需要提出任何东西(Set.empty)。一旦你计算了所有规则中的所有建议,只需将它们简化为一个单一的建议。最后,您可能希望删除事务中已经包含的项(这正是filter的优势所在)。

了解如何将规则集缩减为更小的等效规则集将是一件很有趣的事情,例如,如果包含{x} => {y},则不会重复{x, z} => {y}

票数 1
EN

Stack Overflow用户

发布于 2018-02-03 00:15:24

但是我如何使用生成的规则进行预测呢?

它就像这样简单:

代码语言:javascript
复制
model.transform(dataset).show()
// +----------------+----------+
// |           items|prediction|
// +----------------+----------+
// |[aaa, bbbb, eee]|        []|
// |[bbbb, ccc, eee]|     [aaa]|
// |     [aaa, bbbb]|     [eee]|
// +----------------+----------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48580819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档