source: orange/orange/OrangeWidgets/Associate/OWAssociationRules.py @ 9546:2b6cc6f397fe

Revision 9546:2b6cc6f397fe, 5.6 KB checked in by ales_erjavec <ales.erjavec@…>, 2 years ago (diff)

Renamed widget channel names in line with the new naming rules/convention.
Added backwards compatibility in orngDoc loadDocument to enable loading of schemas saved before the change.

Line 
1"""
2<name>Association Rules</name>
3<description>Induces association rules from data.</description>
4<icon>icons/AssociationRules.png</icon>
5<contact>Janez Demsar (janez.demsar(@at@)fri.uni-lj.si)</contact>
6<priority>100</priority>
7"""
8import orange
9from OWWidget import *
10import OWGUI
11
12
13def table_sparsness(table):
14    """ Return the table sparseness (the ratio of unknown values in the table)
15    for both the regular part (attributes) and meta attributes (basket format).
16   
17    :param table: Data table.
18    :type table: :class:`Orange.data.Table`
19   
20    """
21    unknown_count = 0
22    all_count = 0
23   
24    for ex in table:
25        for val in ex:
26            if val.isSpecial():
27                unknown_count += 1
28            all_count += 1
29    regular_sparseness = float(unknown_count) / (all_count or 1)
30   
31    metas = table.domain.getmetas().values()
32    unknown_count = 0
33    all_count = 0
34   
35    for ex in table:
36        for meta in metas:
37            val = ex[meta]
38            if val.isSpecial():
39                unknown_count += 1
40            all_count += 1
41    meta_sparseness = float(unknown_count) / (all_count or 1)
42    return regular_sparseness, meta_sparseness
43
44   
45class OWAssociationRules(OWWidget):
46    settingsList = ["useSparseAlgorithm", "classificationRules", "minSupport", "minConfidence", "maxRules"]
47   
48    def __init__(self,parent=None, signalManager = None):
49        OWWidget.__init__(self, parent, signalManager, "AssociationRules", wantMainArea = 0)
50
51        self.inputs = [("Data", ExampleTable, self.setData)]
52        self.outputs = [("Association Rules", orange.AssociationRules)]
53
54        self.useSparseAlgorithm = 0
55        self.classificationRules = 0
56        self.minSupport = 40
57        self.minConfidence = 20
58        self.maxRules = 10000
59        self.loadSettings()
60
61        self.dataset = None
62
63        box = OWGUI.widgetBox(self.space, "Algorithm", addSpace = True)
64        self.cbSparseAlgorithm = OWGUI.checkBox(box, self, 'useSparseAlgorithm',
65                                        'Use algorithm for sparse data',
66                                        tooltip="Use original Agrawal's algorithm",
67                                        callback=self.checkSparse)
68       
69        self.cbClassificationRules = OWGUI.checkBox(box, self, 'classificationRules',
70                                        'Induce classification rules',
71                                        tooltip="Induce classification rules")
72        self.checkSparse()
73
74        box = OWGUI.widgetBox(self.space, "Pruning", addSpace = True)
75        OWGUI.widgetLabel(box, "Minimal support [%]")
76        OWGUI.hSlider(box, self, 'minSupport', minValue=1, maxValue=100, ticks=10, step = 1)
77        OWGUI.separator(box, 0, 0)
78        OWGUI.widgetLabel(box, 'Minimal confidence [%]')
79        OWGUI.hSlider(box, self, 'minConfidence', minValue=1, maxValue=100, ticks=10, step = 1)
80        OWGUI.separator(box, 0, 0)
81        OWGUI.widgetLabel(box, 'Maximal number of rules')
82        OWGUI.hSlider(box, self, 'maxRules', minValue=10000, maxValue=100000, step=10000, ticks=10000, debuggingEnabled = 0)
83
84        OWGUI.button(self.space, self, "&Build rules", self.generateRules, default=True)
85
86        OWGUI.rubber(self.controlArea)
87       
88        self.adjustSize()
89
90    def sendReport(self):
91        self.reportSettings("Settings",
92                            [("Algorithm", ["attribute data", "sparse data"][self.useSparseAlgorithm]),
93                             ("Induction of classification rules", OWGUI.YesNo[self.classificationRules]),
94                             ("Minimal support", self.minSupport),
95                             ("Minimal confidence", self.minConfidence),
96                             ("Maximal number of rules", self.maxRules)])
97
98    def generateRules(self):
99        self.error()
100        self.warning(0)
101        if self.dataset:
102            if self.dataset and self.useSparseAlgorithm and not self.datasetIsSparse:
103                self.warning(0, "Using algorithm for sparse data, but data does not appear to be sparse!")
104            try:
105                num_steps = 20
106                for i in range(num_steps):
107                    build_support = (i == num_steps-1) and self.minSupport/100. or (1 - float(i) / num_steps * (1 - self.minSupport/100.0))
108                    if self.useSparseAlgorithm:
109                        rules = orange.AssociationRulesSparseInducer(self.dataset, support = build_support, confidence = self.minConfidence/100., storeExamples = True)
110                    else:
111                        rules = orange.AssociationRulesInducer(self.dataset, support = build_support, confidence = self.minConfidence/100., classificationRules = self.classificationRules, storeExamples = True)
112                    if len(rules) >= self.maxRules:
113                        break
114                self.send("Association Rules", rules)
115            except orange.KernelException, (errValue):
116                self.error(str(errValue))
117                self.send("Association Rules", None)
118        else:
119            self.send("Association Rules", None)
120
121    def checkSparse(self):
122        self.cbClassificationRules.setEnabled(not self.useSparseAlgorithm)
123        if self.useSparseAlgorithm:
124            self.cbClassificationRules.setChecked(0)
125
126    def setData(self, dataset):
127        self.dataset = dataset
128        if dataset is not None:
129            regular, meta = table_sparsness(dataset)
130            self.datasetIsSparse = regular > 0.4 or meta > 0.4
131           
132        self.generateRules()
133       
134
135if __name__=="__main__":
136    a=QApplication(sys.argv)
137    ow=OWAssociationRules()
138    a.setMainWidget(ow)
139##    data = orange.ExampleTable("car")
140##    ow.setData(data)
141    ow.show()
142    a.exec_()
143    ow.saveSettings()
144
Note: See TracBrowser for help on using the repository browser.