1
2
3
4
5 """ Defines the class _DecTreeNode_, used to represent decision trees
6
7 _DecTreeNode_ is derived from _Tree.TreeNode_
8
9 """
10 from rdkit.ML.DecTree import Tree
11
12
14 """ This is used to represent decision trees
15
16 _DecTreeNode_s are simultaneously the roots and branches of decision trees.
17 Everything is nice and recursive.
18
19 _DecTreeNode_s can save the following pieces of internal state, accessible via
20 standard setter/getter functions:
21
22 1) _Examples_: a list of examples which have been classified
23
24 2) _BadExamples_: a list of examples which have been misclassified
25
26 3) _TrainingExamples_: the list of examples used to train the tree
27
28 4) _TestExamples_: the list of examples used to test the tree
29
30 """
31
33
34 Tree.TreeNode.__init__(self, *args, **kwargs)
35 self.examples = []
36 self.badExamples = []
37 self.trainingExamples = []
38 self.testExamples = []
39
41 """ Recursively classify an example by running it through the tree
42
43 **Arguments**
44
45 - example: the example to be classified
46
47 - appendExamples: if this is nonzero then this node (and all children)
48 will store the example
49
50 **Returns**
51
52 the classification of _example_
53
54 **NOTE:**
55 In the interest of speed, I don't use accessor functions
56 here. So if you subclass DecTreeNode for your own trees, you'll
57 have to either include ClassifyExample or avoid changing the names
58 of the instance variables this needs.
59
60 """
61 if appendExamples:
62 self.examples.append(example)
63 if self.terminalNode:
64 return self.label
65 else:
66 val = example[self.label]
67 return self.children[val].ClassifyExample(example, appendExamples)
68
69 - def AddChild(self, name, label=None, data=None, isTerminal=0):
70 """ Constructs and adds a child with the specified data to our list
71
72 **Arguments**
73
74 - name: the name of the new node
75
76 - label: the label of the new node (should be an integer)
77
78 - data: the data to be stored in the new node
79
80 - isTerminal: a toggle to indicate whether or not the new node is
81 a terminal (leaf) node.
82
83 **Returns*
84
85 the _DecTreeNode_ which is constructed
86
87 """
88 child = DecTreeNode(self, name, label, data, level=self.level + 1, isTerminal=isTerminal)
89 self.children.append(child)
90 return child
91
94
96 self.examples = examples
97
99 return self.badExamples
100
102 self.badExamples = examples
103
105 return self.trainingExamples
106
108 self.trainingExamples = examples
109
111 return self.testExamples
112
114 self.testExamples = examples
115
117 self.examples = []
118 self.badExamples = []
119 self.trainingExamples = []
120 self.testExamples = []
121 for child in self.GetChildren():
122 child.ClearExamples()
123