анализ рыночной корзины в Python для большого набора данных транзакций - PullRequest
0 голосов
/ 31 октября 2018

При применении функций apriori (support> = 0.01) и association_rules с использованием пакета python mlxtend для данных транзакций строк 4.2L + (в виде разреженной матрицы) генерация наборов частых элементов и правил связывания занимает слишком много времени.

Пример разреженной матрицы транзакций (кадр данных pandas), входные данные для MBA:

Счет №. / Продукция Рубашка Футболка Джинсовая обувь

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

a) Есть ли способ оптимизировать представление разреженной матрицы данных транзакции перед применением MBA?

б) какие-либо альтернативные эффективные представления данных транзакции?

1 Ответ

0 голосов
/ 20 ноября 2018

Алгоритм 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

Что касается минимального порога поддержки и времени, которое потребовался алгоритму apriori для получения результата, при небольших значениях min_support у нас будет много правил ассоциации. Таким образом, для их вычисления алгоритму требуется время. Это одно из известных ограничений алгоритма.

Вы можете найти здесь общее объяснение того, как работает алгоритм apriori, некоторые основные моменты:

Apriori использует подход «снизу вверх», где частые подмножества продлен один элемент за один раз (известный как поколение кандидата). затем группы кандидатов проверяются по данным. Алгоритм завершается, когда дальнейшие успешные расширения не найдены.

Apriori использует поиск в ширину и структуру хеш-дерева для подсчета Кандидатный набор эффективно. Он генерирует наборы кандидатов длина k из наборов длины k-1. Тогда это сокращает кандидатов у кого есть нечастый подшаблон. Согласно закрытию вниз Лемма, набор кандидатов содержит все частые наборы элементов длины k. После этого он сканирует базу данных транзакций, чтобы определить частые наборы предметов среди кандидатов.

Как мы видим, для набора данных с большим количеством частых элементов или с низким значением поддержки наборы-кандидаты всегда будут очень большими.

Эти большие наборы данных требуют много памяти для хранения. Кроме того, алгоритм apriori также просматривает все части базы данных несколько раз, чтобы вычислить частоту наборов элементов в k-itemset. Таким образом, алгоритм apriori может быть очень медленным и неэффективным, в основном, когда объем памяти ограничен, а количество транзакций велико.

Например, я попробовал алгоритм apriori со списком транзакций с 25900 транзакциями и значением min_support 0,004. Алгоритм потребовал около 2,5 часов, чтобы выдать результат.

Для более подробного объяснения кода, посетите - mlxtend apriori

...