Example #1
0
def BuildTree(DF, Splitter, Parent):
    flag = 0  ## To Store if Current Node is a Leaf
    if (len(DF.keys()) == 1):  ## No Attribute Left to Split on
        flag = 1
    if ((Parent != None)
            and (Parent.depth == Max_Depth)):  ## Maximum Depth Reached
        flag = 2
    if (CalcNode(DF,
                 Splitter)[-1] == 0):  ## Current Node is Perfectly Classified
        flag = 3

    if (flag == 0):
        Split_Attr = BestAttr(DF, Splitter)
        Parent.split = Split_Attr
        Attr_Val = np.unique(DF[Split_Attr])
        for val in Attr_Val:
            Decision_Node = Node(Split_Attr,
                                 parent=Parent,
                                 value=val,
                                 split=None,
                                 child={},
                                 outcome=None)
            Parent.child[val] = Decision_Node
            Leaf, Outcome = BuildTree(
                DF[DF[Split_Attr] == val].reset_index(drop=True), Splitter,
                Decision_Node)
            if (Leaf == None):
                Decision_Node.outcome = Outcome
    else:
        Val, Count = np.unique(DF[Class], return_counts=True)
        Outcome = Val[np.argmax(Count)]
        return None, Outcome

    return Parent, None
Example #2
0
def BuildTree(Parent, Splitter, Max_Depth):

    if not Parent.is_leaf:
        for subtree in Parent.children:
            BuildTree(subtree, Splitter, Max_Depth)
        return Parent, None

    flag = 0  ## To Store if Current Node is a Leaf
    if (len(Parent.df.keys()) == 1):  ## No Attribute Left to Split on
        flag = 1
    if (not (Parent.is_root)
            and (Parent.depth == Max_Depth)):  ## Maximum Depth Reached
        flag = 2
    if (CalcNode(Parent.df[Class].values,
                 Splitter)[-1] == 0):  ## Current Node is Perfectly Classified
        flag = 3

    if (flag == 0):
        Split_Attr = BestAttr(Parent.df, Splitter)
        Parent.split = Split_Attr
        Attr_Val, Inv_Index = np.unique(Parent.df[Split_Attr],
                                        return_inverse=True)

        Hash = np.zeros(shape=(len(Attr_Val), len(Parent.df)), dtype=bool)
        for i in range(len(Parent.df)):
            Hash[Inv_Index[i], i] = True

        for i in range(len(Attr_Val)):
            Decision_Node = Node(Split_Attr,
                                 parent=Parent,
                                 df=Parent.df[Hash[i]],
                                 value=Attr_Val[i],
                                 split=None,
                                 child={},
                                 outcome=None)
            Parent.child[Attr_Val[i]] = Decision_Node
            Leaf, Outcome = BuildTree(Decision_Node, Splitter, Max_Depth)
            if (Leaf == None):
                Decision_Node.outcome = Outcome

    else:
        Val, Count = np.unique(Parent.df[Class], return_counts=True)
        Outcome = Val[np.argmax(Count)]
        return None, Outcome

    return Parent, None