最近我试图通过Apache Spark实现FP-Growth来评估数据。手头的数据基本上是购物车数据,包括客户和产品。 由于数据集非常复杂,frequencyItemsets的计算需要很长时间。所以我决定尝试通过放置最大值来过滤结果。 frequencyItemsets的长度如下:
//To do run FPGrowthTest
FPGrowth fpg = new FPGrowth().setMinSupport(minSupport).setNumPartitions(12);
// run the model on the values which are the products for each custome
JavaRDD<Iterable<String>> groupByValues = groupsForProduct.values();
FPGrowthModel<String> model = fpg.run(groupByValues);
double minConfidence = 0.3;
JavaRDD<FreqItemset<String>> filteredmodel = model.freqItemsets().toJavaRDD()
.filter(new Function<FreqItemset<String>, Boolean>(){
public Boolean call(FreqItemset<String> fi){
if (fi.javaItems().size() <= 5){
return true;}
else {
return false;
}
}
});
filteredmodel.map(new Function<FPGrowth.FreqItemset<String>, String>() {
@Override public String call(FPGrowth.FreqItemset<String> fi) {
return fi.javaItems() + " -> " + fi.freq();
}
}).saveAsTextFile(
<path>);
AssociationRules ar = new AssociationRules();
ar.setMinConfidence(minConfidence);
ar.run(filteredmodel).saveAsTextFile(<path>);
我试图逐个浏览数据产品,逐步减少FP-Growth算法的树大小。仍然是第一个产品,我的算法现在运行了一个小时,但仍然没有完成,我只是在一小部分数据样本上运行它。该程序甚至没有完成创建所有的frequencyItemsets的第一步,所以我甚至不会看到,如果AssociationRules结果看起来像我希望它们看起来那样。
有没有办法减少计算的树木化而不必过滤()整个数据?我做错了什么,我怎样才能提高速度?似乎没有限制frequencyItemset结果的函数。也许还有其他解决方案可以处理这些复杂的数据集吗?
TL / DR:有没有办法通过限制frequencyItemset结果来改进FP-Growth算法而不过滤所有数据?
答案 0 :(得分:0)
是的,问题出在更麻烦的交易上(您提到的有很多项目)。所以我建议您删除那些,我遇到了同样的问题。平均入场券有5件物品,而我只有2笔交易有52或46件物品,使交易过程爆炸式增长。一旦删除它们,我就可以毫无问题地运行它。所以是的,删除异常值交易,您应该会很好。