为啥我的 Apriori 函数返回的是字母而不是项目? (错误的输出)

Posted

技术标签:

【中文标题】为啥我的 Apriori 函数返回的是字母而不是项目? (错误的输出)【英文标题】:Why is my Apriori function returning letters instead of items?? (wrong output)为什么我的 Apriori 函数返回的是字母而不是项目? (错误的输出) 【发布时间】:2021-06-08 16:55:58 【问题描述】:

代码:

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from apyori import apriori

dataset = [['egg','bread'],['milk'],['apple','milk'],['diapers'],['orange','egg','milk']]
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
final_df = pd.DataFrame(te_ary, columns=te.columns_)
print(final_df)

frq_itemsets= apriori(final_df, min_support=0.5, use_colnames=True)  
association_results = list(frq_itemsets)
print(association_results)

输出:

apple  bread  china    egg  embroidery   milk
0  False   True  False   True       False  False
1  False  False  False  False       False   True
2   True  False  False  False       False   True
3  False  False  False  False        True  False
4  False  False   True   True       False   True
[RelationRecord(items=frozenset('a'), support=0.5, ordered_statistics=[OrderedStatistic(items_base=frozenset(), items_add=frozenset('a'), confidence=0.5, lift=1.0)]), RelationRecord(items=frozenset('e'), support=0.6666666666666666, ordered_statistics=[OrderedStatistic(items_base=frozenset(), items_add=frozenset('e'), confidence=0.6666666666666666, lift=1.0)]), RelationRecord(items=frozenset('i'), support=0.5, ordered_statistics=[OrderedStatistic(items_base=frozenset(), items_add=frozenset('i'), confidence=0.5, lift=1.0)])]

我做错了什么??我在 SO 上到处搜索,但似乎找不到这样的问题。

提前致谢。我希望这不是一个愚蠢的问题。有人可以帮忙吗?

【问题讨论】:

我对 mlxtendapyori 都不熟悉,但快速浏览似乎表明 [apriori 方法首先存在于 [mlxtend](rasbt.github.io/mlxtend/user_guide/frequent_patterns/apriori) 所以任何使用另一个包的理由?其次,您使用apyori 中的apriori 的方式看起来更像是使用mlxtend 包中的函数的方式(参数、数据帧传递),在apyori 中,尝试直接传递您的dataset 和也许不是转换后的数据框? 嗨@Ben.T 感谢您的回复!当我使用from mlxtend.frequent_patterns import apriori 并打印结果时,我得到输出['support', 'itemsets']。这些似乎是对象 apriori() 返回的列。这就是我尝试使用 apyori 的原因,因为我无法解决这个问题。 如果我将数据集直接输入 apriori() 我得到AttributeError: 'list' object has no attribute 'size' 【参考方案1】:

我相信apriori 存在误用,具体取决于您从哪个包中获得它。看看下面的区别

import pandas as pd
from mlxtend.preprocessing import TransactionEncoder

dataset = [['egg','bread'],['milk'],['apple','milk'],
           ['diapers'],['orange','egg','milk']]
te = TransactionEncoder()
te_ary = te.fit(dataset).transform(dataset)
final_df = pd.DataFrame(te_ary, columns=te.columns_)
print(final_df)

from mlxtend.frequent_patterns import apriori
# this method returns a dataframe, no need to use a list
df_freq = apriori(final_df, min_support=0.5, use_colnames=True)  
print(df_freq) 
#    support itemsets
# 0      0.6   (milk)

from apyori import apriori
# this method returns a generator hence the use of list to get the result
print(list(apriori(dataset, min_support=0.5, )))
# [RelationRecord(items=frozenset('milk'), support=0.6, 
#                 ordered_statistics=[OrderedStatistic(items_base=frozenset(), 
#                                     items_add=frozenset('milk'), 
#                                     confidence=0.6, lift=1.0)])]

【讨论】:

直到现在还没有得到它们输出中的包之间的区别谢谢!!但是,我仍然以这种形式获得OrderedStatistic(items_base=frozenset('b'), items_add=frozenset('.', 'u'), confidence=0.9511924998712203, lift=1.0), OrderedStatistic(items_base=frozenset('u'), items_add=frozenset('.', 'b'), confidence=1.0, lift=1.0), 的输出。我有一个更大的数据集,我正在努力获取规则,这真的是我的问题 @cat1234 没有数据集,很难说出为什么会得到这个结果。据说获得这种结果的可能是您的数据集不是字符串列表,而是简单的字符串列表。在您的实际情况中,type(dataset) 是什么,如果是列表,则为 type(dataset[0]),如果是列表,则为 type(dataset[0][0])

以上是关于为啥我的 Apriori 函数返回的是字母而不是项目? (错误的输出)的主要内容,如果未能解决你的问题,请参考以下文章

关联规则——Apriori算法

Apriori算法

为啥 Eunit 坚持我的函数返回 ok, value 而不是?

为啥我的 decipher.update 返回一个函数而不是解密的文本?节点JS

为啥我的异步函数返回 Promise <pending> 而不是一个值?

当我递归调用它时,为啥我的函数返回以前的值而不是新的值?