【问题标题】:Problems while extractiong association rules with Orange?使用 Orange 提取关联规则时出现问题?
【发布时间】:2023-03-21 01:00:01
【问题描述】:

我有一个维度为 (878049, 6) 的数据集。

看起来像这样:

我想提取将类别列与其他列链接的关联规则。因此,从文档中我尝试了以下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)

但是,我仍然遇到同样的问题...我无法提取关联规则。

【问题讨论】:

    标签: python pandas machine-learning data-mining orange


    【解决方案1】:

    您正在尝试在数据域中没有任何类变量的情况下引入分类规则。如果您打印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}
    

    【讨论】:

    • 您没有将任何数据传递到新表,只有域。相反,您应该这样做:Table = Orange.data.Table(new_domain, data)
    • 再次感谢您的帮助。这实际上很有用。尽管如此,目前我只提取了一条关联规则:Resolution=NONE --&gt; Category=LARCENY/THEFT (supp: 156586, conf: 0.2972455817308605)。知道为什么会这样吗?。
    【解决方案2】:

    您可以通过以下方式查看找到的项集包含的内容:

    # 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% 支持的项集。

    【讨论】:

    • 感谢您的支持,您能否提供一个更详细的示例?...到目前为止,我尝试了您的方法,但它没有打印任何关联规则!
    • 很奇怪。如果您打印(项目集),您会看到什么?那会很奇怪。请参阅上面修改后的示例。
    • 你只得到一个包含单个项目并且支持大约 500k 的频繁项集。降低最低支持要求(例如,降低到 10%、5%、1% 和更低),直到你得到你喜欢的东西。 800k 是很多条目。如果您将最小支持指定为0.1,您将获得包含在至少~8k 记录中的所有项集。无论如何,您应该能够使用上面的代码打印特定项目的值。
    • 确实,对不起。遍历字典只是遍历它们的键。如果我们还需要访问支持,我们应该遍历 dict 的items()。请参阅上面的更新答案。
    • 有趣。它看起来像错误或 PEBKAC 问题。对于前者,您可以向他们提交错误报告:github.com/biolab/orange3-associate/issues
    猜你喜欢
    • 2017-02-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2020-12-16
    相关资源
    最近更新 更多