在对4.2L +行交易数据(以稀疏矩阵的形式)上使用python的mlxtend包应用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)交易数据的任何其他有效表示形式?
最佳答案
先验算法接收列表列表,其中每个列表都是一个事务。您是否通过交易清单?例如:
transactions = [['milk', 'bread', 'water'],['coffe', 'sugar' ],['burgers', 'eggs']]
在这里,您有一个交易清单(清单)。然后,您可以将其传递给apriori。
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值较小,我们将有很多关联规则。因此,要计算它们,算法需要时间。这是该算法的众所周知的局限之一。
您可以找到here关于apriori算法如何工作的整体说明,其中一些要点是:
Apriori使用“自下而上”的方法,其中频繁的子集是
一次扩展一项(称为候选生成)。然后
根据数据测试候选组。算法
当找不到进一步成功的扩展时终止。
Apriori使用广度优先搜索和哈希树结构进行计数
候选项目有效地设置。它生成的候选项目集
长度为k-1的项集的长度k。然后修剪候选人
子模式很少的人。根据向下关闭
引理,候选集包含所有频繁的k长度项集。
之后,它将扫描事务数据库以确定是否频繁
候选人中的项目集。
如我们所见,对于具有大量频繁项或支持值较低的数据集,候选项集将始终非常大。
这些大型数据集需要存储大量内存。此外,先验算法还多次查看数据库的所有部分,以计算k-项目集中项目集的频率。因此,先验算法可能非常缓慢且效率低下,主要是在内存容量有限且事务数量很大时。
例如,我尝试了apriori算法,其中包含25900个事务和min_support值为0.004的事务列表。该算法花了大约2.5个小时才给出输出。
有关代码的更多详细说明,请访问-mlxtend apriori
关于python - 适用于大型交易数据集的python中的购物篮分析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53077133/