我有一个包含600,000行和15列的csv文件,格式为"Col1, Col2 ... Col15"
。我想生成关联规则,其中只有右侧包含来自第15列的值。我使用的是这里的Apriori实现
它以如下方式计算每个项集的最小支持度:
oneCSet = returnItemsWithMinSupport(itemSet, transactionList, minSupport, freqSet) print "reached line 80" currentLSet = oneCSet k = 2 while(currentLSet != set([])): print k largeSet[k-1] = currentLSet currentLSet = joinSet(currentLSet, k) currentCSet = returnItemsWithMinSupport(currentLSet, transactionList, minSupport, freqSet) currentLSet = currentCSet k = k + 1def returnItemsWithMinSupport(itemSet, transactionList, minSupport, freqSet): """计算itemSet中项目的支持度,并返回满足最小支持度的itemSet的子集""" _itemSet = set() localSet = defaultdict(int) #print itemSet for item in itemSet: #print "I am here", list(item) for transaction in transactionList: if item.issubset(transaction): freqSet[item] += 1 localSet[item] += 1 print "Done half" for item, count in localSet.items(): support = float(count)/len(transactionList) if support >= minSupport: _itemSet.add(item) return _itemSet
但是,对于我拥有的众多行来说,这将花费很多时间。因为我希望右侧仅限于特定列(Col15)的值,我可以通过减少频繁项集的数量来加快实现速度吗?另一种方法是在最后过滤规则,但这将具有相同的时间复杂度。或者是否有其他实现/库可以帮助我加速这个过程?
回答:
-
根据第15列的值(将成为您的右侧RHS)拆分数据集。如果该列有5个不同的值,您现在将得到5个数据集。删除每个数据集的最后一列,因为现在它是常数。
-
仅对其他列计算频繁项集(不是关联规则),通过在每个子集上使用Apriori(更快!)。但您仍然需要比您链接的GitHub版本更好的实现。它只需要FIMs,不需要规则!
-
将频繁项集与分区键组合成关联规则,(FIS -> RHS),并使用您首选的度量标准进行评估,就像关联规则一样。
这种方法速度更快,因为它不会生成跨多个第15列键的频繁项集。在每个分区内,所有剩余数据对于您的目标都是相关的。此外,它适用于未修改的Apriori FIM生成。