def decision_tree(examples, attributes, bin_targets): all_same = check_all_same(bin_targets) if all_same: return TreeNode(None, True, bin_targets.iloc[0].iloc[0]) elif not attributes: # Majority Value return TreeNode(None, True, majority_value(bin_targets)) else: best_attribute = choose_best_decision_attr(examples, attributes, bin_targets) tree = TreeNode(best_attribute) for vi in range(0, 2): examples_i = examples.loc[examples[best_attribute] == vi] indices = examples_i.index.values bin_targets_i = bin_targets.ix[indices] if examples_i.empty: # Majority Value return TreeNode(None, True, majority_value(bin_targets)) else: attr = set(attributes) attr.remove(best_attribute) tree.set_child(vi, decision_tree(examples_i, attr, bin_targets_i)) return tree