1

在使用python的mlxtend包对4.2L+行事务数据(以稀疏矩阵的形式)应用apriori(支持> = 0.01)和association_rules函数时,频繁项集和关联规则的生成需要太多时间。

示例事务稀疏矩阵(pandas DataFrame),MBA 的输入数据:

Invoice no./ Products  Shirt  T-shirt  Jeans  Footwear
                    1      1        1      0         0
                    2      0        0      1         0
                    3      0        1      0         1

a) 在申请 MBA 之前,有什么方法可以优化交易数据稀疏矩阵的表示?

b) 交易数据的任何替代有效表示?

4

2 回答 2

4

apriori 算法接收一个列表列表,其中每个列表是一个事务。您是否通过了交易清单?例如:

transactions = [['milk', 'bread', 'water'],['coffe', 'sugar' ],['burgers', 'eggs']]

在这里,您有一个交易列表(列表)。然后你可以将它传递给先验。

from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
import time

support_threshold = 0.004

te = TransactionEncoder()
te_ary = te.fit(transactions).transform(transactions)
df = pd.DataFrame(te_ary, columns=te.columns_)
logging.debug("Calculating itemset according to support...")
# time 
start_time = time.clock()
# apriori
frequent_itemsets = apriori(df, min_support=support_threshold, use_colnames=True)
# end time to calculation
end_time = time.clock()
time_apriori = (end_time-start_time)/60
apriori_decimals = "%.2f" % round(time_apriori,2)
print("\n\nCompleted in %s minutes\n" % apriori_decimals)

print(frequent_itemsets) #dataframe with the itemsets

lift = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
print(lift) #dataframe with confidence, lift, conviction and leverage metrics calculated

关于最小支持阈值,以及先验算法为我们提供结果所花费的时间,对于较小的 min_support 值,我们将有很多关联规则。因此,要计算它们,算法需要时间。这是该算法众所周知的限制之一。

你可以在这里找到关于先验算法如何工作的总体解释,一些亮点是:

Apriori 使用“自下而上”的方法,其中频繁子集一次扩展一项(称为候选生成)。然后根据数据对候选人组进行测试。当没有找到进一步的成功扩展时,算法终止。

Apriori 使用广度优先搜索和哈希树结构来有效地计算候选项目集。它从长度为 k-1 的项目集生成长度为 k 的候选项目集。然后它会修剪具有不常见子模式的候选者。根据向下闭合引理,候选集包含所有频繁的 k 长度项集。之后,它扫描事务数据库以确定候选中的频繁项集。

我们可以看到,对于频繁项较多或支持度较低的数据集,候选项集总是很大。

这些大型数据集需要大量内存来存储。此外,先验算法还会多次查看数据库的所有部分,以计算 k-itemset 中项集的频率。因此,先验算法可能会非常缓慢且效率低下,主要是在内存容量有限且事务数量很大的情况下。

例如,我尝试了具有 25900 个事务和 min_support 值为 0.004 的事务列表的先验算法。该算法需要大约 2.5 小时才能给出输出。

有关代码的更详细说明,请访问 - mlxtend apriori

于 2018-11-20T11:39:23.277 回答
1

使用 fpgrowth 算法,对于大型数据集,该算法的速度几乎是原始先验算法的 5 倍。

我已经尝试了 140 万笔交易和 200 件独特的物品。Apriori 花费了超过 4 小时,而 fpgrowth 花费了不到 5 分钟来生成频繁项集,给定最差的最小支持值。

mlxtend 库版本 >= 0.17 提供 fpgrowth 实现并生成与 apriori 相同的结果,从而节省您的时间和空间。您的输入是 one-hot 编码格式,并且是可接受的输入格式。链接:http ://rasbt.github.io/mlxtend/user_guide/frequent_patterns/fpgrowth/

from mlxtend.frequent_patterns import fpgrowth
from mlxtend.frequent_patterns import association_rules

frequent_itemsets = fpgrowth(df, min_support=0.6)
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.7)
于 2020-04-20T19:37:24.600 回答