适用于大型交易数据集的python市场购物篮分析

时间:2018-10-31 05:56:00

标签: python sparse-matrix apriori market-basket-analysis mlxtend

在对4.2L +行交易数据(以稀疏矩阵的形式)上使用python的mlxtend包应用apriori(支持> = 0.01)和association_rules函数时,频繁项集和关联规则的生成会花费大量时间。

样本交易稀疏矩阵(熊猫数据框),MBA的输入数据:

发票编号/产品衬衫T恤牛仔裤鞋类

    1                  1        1         0        0
    2                  0        0         1        0  
    3                  0        1         0        1

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

b)是否有其他有效的交易数据表示形式?

2 个答案:

答案 0 :(得分:0)

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

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个半小时才能给出输出。

答案 1 :(得分:0)

使用fpgrowth算法,对于大型数据集,该算法比原始先验算法快将近5倍。

我尝试了140万笔交易和200个独特商品。 Apriori花了超过4个小时,而fpgrowth花了不到5分钟才能生成频繁的项目集,因为最低支持值最差。

mlxtend库版本> = 0.17提供了fpgrowth实现,并产生与apriori相同的结果,从而节省了时间和空间。 您的输入采用一站式编码格式,并且被接受为输入格式。 链接:http://rasbt.github.io/mlxtend/user_guide/frequent_patterns/fpgrowth/

<?php

add_action( 'wp_enqueue_scripts', 'enqueue_scripts' );

function enqueue_scripts() {
    // css
    wp_enqueue_style('parent-style', get_template_directory_uri().'/style.css');

    $handle = 'doc_script_handle';
    wp_enqueue_script( $handle, get_stylesheet_directory_uri() . '/js/docs.js', array('jquery'));
    wp_localize_script($handle, 'the_ajax_script', array('ajaxurl' =>admin_url('admin-ajax.php')));
}

//*********** getDOCS ***************//

add_action( 'wp_ajax_get_docs_from_id', 'getDocsFromCode' );
add_action( 'wp_ajax_nopriv_get_docs_from_id', 'getDocsFromCode' );
function getDocsFromCode() {
     ///un-needed code.......
}
?>