def update_classifier(self, instance): """Update the classifier with the given instance. Args: instance (Instance): The new instance to be used to train the classifier. """ if instance.class_is_missing(): return if self._root is None: self._root = self.new_learning_node() l = self._root.leaf_for_instance(instance, None, None) actual_node = l.the_node if actual_node is None: actual_node = ActiveHNode() l.parent_node.set_child(l.parent_branch, actual_node) # ActiveHNode should be changed to a LearningNode interface if Naive Bayes nodes are used if isinstance(actual_node, InactiveHNode): actual_node.update_node(instance) if isinstance(actual_node, ActiveHNode): actual_node.update_node(instance) total_weight = actual_node.total_weight() if total_weight - actual_node.weight_seen_at_last_split_eval > self._grace_period: self.try_split(actual_node, l.parent_node, l.parent_branch) actual_node.weight_seen_at_last_split_eval = total_weight
def activate_node(self, to_activate, parent, parent_branch): """Allow supplied node to grow. Args: to_activate (InactiveHNode): The node to be activated. parent (SplitNode): The parent of the node. parent_branch (str): The branch leading from the parent to the node. """ leaf = ActiveHNode() leaf.class_distribution = to_activate.class_distribution if parent is None: self._root = leaf else: parent.set_child(parent_branch, leaf) self._active_leaf_count += 1 self._inactive_leaf_count -= 1
def new_learning_node(self): """Create a new learning node. Will always be an ActiveHNode while Naive Bayes nodes are not implemented. Returns: ActiveHNode: The new learning node. """ # Leaf strategy should be handled here if/when the Naive Bayes approach is implemented return ActiveHNode()