2016-07-04 59 views
1

我有一个尺寸为(878049, 6)的数据集。使用Orange提取关联规则时的问题?

它看起来像这样:

enter image description here

我想提取与其他列链接类别列关联规则。因此,从文档我试图用Orange-Associate如下:

In: 

import Orange 
data = Orange.data.Table("data.csv") 

In: 

data.domain.attributes 

Out: 

    (DiscreteVariable('Category', values=['ARSON', 'ASSAULT', 'BAD CHECKS', 'BRIBERY', 'BURGLARY', ...]), 
DiscreteVariable('Descript', values=['ABANDONMENT OF CHILD', 'ABORTION', 'ACCESS CARD INFORMATION, PUBLICATION OF', 'ACCESS CARD INFORMATION, THEFT OF', 'ACCIDENTAL BURNS', ...]), 
DiscreteVariable('DayOfWeek', values=['Friday', 'Monday', 'Saturday', 'Sunday', 'Thursday', ...]), 
DiscreteVariable('PdDistrict', values=['BAYVIEW', 'CENTRAL', 'INGLESIDE', 'MISSION', 'NORTHERN', ...]), 
DiscreteVariable('Resolution', values=['ARREST, BOOKED', 'ARREST, CITED', 'CLEARED-CONTACT JUVENILE FOR MORE INFO', 'COMPLAINANT REFUSES TO PROSECUTE', 'DISTRICT ATTORNEY REFUSES TO PROSECUTE', ...])) 

In: 

from orangecontrib.associate.fpgrowth import * 

X, mapping = OneHot.encode(data, include_class=True) 

X 

Out: 
array([[False, False, False, ..., False, False, False], 
     [False, False, False, ..., False, False, False], 
     [False, False, False, ..., False, False, False], 
     ..., 
     [False, False, False, ..., False, False, False], 
     [False, False, False, ..., False, False, False], 
     [False, False, False, ..., False, False, False]], dtype=bool) 

In: 

sorted(mapping.items()) 

Out: 

[(0, (0, 0)), 
(1, (0, 1)), 
(2, (0, 2)), 
(3, (0, 3)), 
(4, (0, 4)), 
(5, (0, 5)), 
(6, (0, 6)), 
(7, (0, 7)), 
.... 
(950, (4, 15)), 
(951, (4, 16))] 

然后:

In: 

itemsets = dict(frequent_itemsets(X, .4)) 

len(itemsets) 

Out: 

1 

In: 

class_items = {item 

       for item, var, _ in OneHot.decode(mapping, data, mapping) 

       if var is data.domain.class_var} 
In: 
sorted(class_items) 

Out: 

[] 

我认为,问题是我没有正确的Orange table屈服。因此,我应该如何使用橙色加载数据集才能生成关联规则?

更新

通过@ K3 --- RNC答案,我想这:

itemsets = dict(frequent_itemsets(X, .1)) 

print (len(itemsets)) 

print(itemsets) 

for itemset, _support in itemsets: 

    print(' '.join('{}={}'.format(var.name, val) 

        for _, var, val in OneHot.decode(itemset, data, mapping))) 

18 
{frozenset({935}): 206403, frozenset({20}): 92304, frozenset({928}): 119908, frozenset({924}): 129211, frozenset({946}): 526790, frozenset({921}): 116707, frozenset({946, 932}): 93924, frozenset({919}): 121584, frozenset({932}): 157182, frozenset({21}): 126182, frozenset({922}): 125038, frozenset({16}): 174900, frozenset({929}): 105296, frozenset({918}): 133734, frozenset({16, 946}): 156586, frozenset({925}): 89431, frozenset({923}): 124965, frozenset({920}): 126810} 

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-83-83a24c082126> in <module>() 
     2 print (len(itemsets)) 
     3 print(itemsets) 
----> 4 for itemset, _support in itemsets: 
     5  print(' '.join('{}={}'.format(var.name, val) 
     6     for _, var, val in OneHot.decode(itemset, data, mapping))) 

ValueError: not enough values to unpack (expected 2, got 1) 

不过,我还是有同样的问题...我不能提取关联规则。

回答

0

您试图在您的数据域中没有任何类变量的情况下引发分类规则。如果您打印data.domain,您会看到您只有常规属性和元数据。

[Category, DayOfWeek, PdDistrict, Resolution] {Descript, Address} 

要解决此问题,您需要将其中一个属性设置为类变量。

new_domain = Orange.data.Domain(list(data.domain.attributes[1:]), 
      data.domain.attributes[0], 
      metas=data.domain.metas) 

这将设置'Category'属性作为类变量。当然,你可以通过上面的例子设置自己的类变量。如果现在打印NEW_DOMAIN,你会看到这样的事情:

[DayOfWeek, PdDistrict, Resolution | Category] {Descript, Address} 
+1

您不会将任何数据传递到新表,只有域。相反,你应该这样做: '表= Orange.data.Table(new_domain,data)' – vijolica

+0

再次感谢您的帮助。这实际上是有用的。不过,目前我只提取了一个关联规则:'Resolution = NONE - > Category = LARCENY/THEFT(supp:156586,conf:0.2972455817308605)''。任何想法为什么发生这种情况? –

1

你可以看到你的发现项集包含有:

# Minimum 20% support. Decrease for more results 
itemsets = dict(frequent_itemsets(X, .2)) 

for itemset, _support in itemsets.items(): 
    print(' '.join('{}={}'.format(var.name, val) 
        for _, var, val in OneHot.decode(itemset, data, mapping))) 

会打印:

Category=ASSAULT DayOfWeek=Friday ... 

或任何具有40%支持的项目组是。

+0

感谢您的支持,能否提供更详细的示例?...迄今为止,我尝试了您的方法,但它不打印任何关联规则! –

+1

奇怪。如果你打印(itemsets),你会看到什么?那会很奇怪。请参阅上面的修改示例。 –

+0

当我印刷(商品)'我得到:'{frozenset({946}):526790}'。任何想法我做错了什么?谢谢您的帮助! –