2016-07-04 10 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 --- СРН Ответ Я попытался это:

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) 

В качестве переменной класса будет установлен атрибут «Категория». Конечно, вы можете установить свою собственную переменную класса в приведенном выше примере. Если теперь напечатать new_domain, вы должны увидеть что-то вроде этого:

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

Вы не передаёте какие-либо данные в новую таблицу, а только в домен. Вместо этого вы должны сделать: 'Table = 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

Странно. Если вы печатаете (предметы), вы видите что-нибудь? Это было бы странно. См. Пересмотренный пример выше. –

+0

Когда я 'print (itemsts)' Я получаю: '{frozenset ({946}): 526790}'. Любая идея, что я делаю неправильно? Спасибо за помощь! –

 Смежные вопросы

  • Нет связанных вопросов^_^