1

目标:在二进制值数据集上运行关联规则

d = {'col1': [0, 0,1], 'col2': [1, 0,0], 'col3': [0,1,1]}
df = pd.DataFrame(data=d)

这会为相应的列值生成一个带有 0 和 1 的数据框。

问题是当我使用如下代码时:

from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
frequent_itemsets = apriori(pattern_dataset, min_support=0.50,use_colnames=True)
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
rules

通常这运行得很好,但是这次运行它时遇到了错误。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-61-46ec6f572255> in <module>()
      4 frequent_itemsets = apriori(pattern_dataset, min_support=0.50,use_colnames=True)
      5 frequent_itemsets
----> 6 rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
      7 rules

D:\AnaConda\lib\site-packages\mlxtend\frequent_patterns\association_rules.py in association_rules(df, metric, min_threshold, support_only)
    127     values = df['support'].values
    128     frozenset_vect = np.vectorize(lambda x: frozenset(x))
--> 129     frequent_items_dict = dict(zip(frozenset_vect(keys), values))
    130 
    131     # prepare buckets to collect frequent rules

D:\AnaConda\lib\site-packages\numpy\lib\function_base.py in __call__(self, *args, **kwargs)
   1970             vargs.extend([kwargs[_n] for _n in names])
   1971 
-> 1972         return self._vectorize_call(func=func, args=vargs)
   1973 
   1974     def _get_ufunc_and_otypes(self, func, args):

D:\AnaConda\lib\site-packages\numpy\lib\function_base.py in _vectorize_call(self, func, args)
   2040             res = func()
   2041         else:
-> 2042             ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
   2043 
   2044             # Convert args to object arrays first

D:\AnaConda\lib\site-packages\numpy\lib\function_base.py in _get_ufunc_and_otypes(self, func, args)
   1996             args = [asarray(arg) for arg in args]
   1997             if builtins.any(arg.size == 0 for arg in args):
-> 1998                 raise ValueError('cannot call `vectorize` on size 0 inputs '
   1999                                  'unless `otypes` is set')
   2000 

ValueError: cannot call `vectorize` on size 0 inputs unless `otypes` is set

这就是我在 Pandas 中的 dtypes,任何帮助将不胜感激。

col1    int64
col2    int64
col3    int64
dtype: object
4

2 回答 2

3
    128     frozenset_vect = np.vectorize(lambda x: frozenset(x))
--> 129     frequent_items_dict = dict(zip(frozenset_vect(keys), values))

这里将函数np.vectorize包装在frozenset(x)可以接受数组或列表 ( keys) 的代码中,并传递每个元素进行评估。它是一种numpy迭代(方便,但不快)。但要确定dtype它返回的数组类型 (),它会使用 的第一个元素执行测试运行keys。进行此测试运行的另一种方法是使用otypes参数。

无论如何,在这个特定的运行中,keys显然是空的,一个 0 大小的数组或列表。它可以返回一个等效的形状结果数组,但它仍然必须设置一个dtype. 因此错误。

显然,代码编写者从未预料到keys空的情况。所以你需要解决为什么它是空的这个问题?

我们需要看一下association_rules代码,看看keys是如何设置的。它在第 129 行中的使用表明它具有与 相同数量的元素values,这是从dfwith 派生的:

values = df['support'].values

如果keys有 0 个元素,那么values也可以,并且df有 0 个“行”。

尺寸是frequent_itemsets多少?

我添加了一个mlxtend标签,因为在使用它的代码的过程中会出现错误。您/我们需要检查该代码或其文档以确定此数据框为何为空。

于 2018-10-27T21:39:34.503 回答
2

解决方法:

def encode_units(x):
    if x <= 0:
        return 0
    if x >= 1:
        return 1

yourdataset_sets = yourdataset.applymap(encode_units)

frequent_itemsets = apriori(yourdataset_sets, min_support=0.001, use_colnames=True)
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)

学分: saeedesmaili

于 2019-02-28T16:58:47.707 回答