From bec8fe4850bf30b5159952776bbbf281da028067 Mon Sep 17 00:00:00 2001 From: amirmoghi3 Date: Fri, 25 Dec 2020 17:44:44 +0330 Subject: [PATCH] entopy done --- .gitignore | 2 ++ Train.xlsx | Bin 23668 -> 24032 bytes entropy.py | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 .gitignore create mode 100644 entropy.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1c36090 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.history +.vscode \ No newline at end of file diff --git a/Train.xlsx b/Train.xlsx index 87b7d9821f201b1b18cbd67ef4c316f5d4c49b79..02158b79a9b7ba98d0d7c74eba3d12387de4c46e 100644 GIT binary patch delta 18880 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 b7GuVDh%s!s855bM0k+)iG$pSwyzKu2O`>Qd diff --git a/entropy.py b/entropy.py new file mode 100644 index 0000000..d3da65d --- /dev/null +++ b/entropy.py @@ -0,0 +1,98 @@ +import pandas as pd +from math import log2 +def test_split(index, value, dataset): + left, right = list(), list() + for row in dataset: + if row[index] < value: + left.append(row) + else: + right.append(row) + return left, right + +# Calculate the Gini index for a split dataset +def entropy(groups, classes): + # count all samples at split point + n_instances = float(sum([len(group) for group in groups])) + # sum weighted Gini index for each group + e = 0.0 + for group in groups: + size = float(len(group)) + # avoid divide by zero + if size == 0: + continue + score = 0.0 + # score the group based on the score for each class + for class_val in classes: + p = [row[-1] for row in group].count(class_val) / size + try: + score +=(p*log2(p)) + except ValueError: + continue + + # weight the group score by its relative size + e += (- score) * (size/n_instances) + return e + +# Select the best split point for a dataset +def get_split(dataset): + class_values = list(set(row[-1] for row in dataset)) + b_index, b_value, b_score, b_groups = 999, 999, 999, None + for index in range(len(dataset[0])-1): + for row in dataset: + groups = test_split(index, row[index], dataset) + e = entropy(groups, class_values) + if e < b_score: + b_index, b_value, b_score, b_groups = index, row[index], e, groups + return {'index':b_index, 'value':b_value, 'groups':b_groups} + +# Create a terminal node value +def to_terminal(group): + outcomes = [row[-1] for row in group] + return max(set(outcomes), key=outcomes.count) + +# Create child splits for a node or make terminal +def split(node, max_depth, min_size, depth): + left, right = node['groups'] + del(node['groups']) + # check for a no split + if not left or not right: + node['left'] = node['right'] = to_terminal(left + right) + return + # check for max depth + if depth >= max_depth: + node['left'], node['right'] = to_terminal(left), to_terminal(right) + return + # process left child + if len(left) <= min_size: + node['left'] = to_terminal(left) + else: + node['left'] = get_split(left) + split(node['left'], max_depth, min_size, depth+1) + # process right child + if len(right) <= min_size: + node['right'] = to_terminal(right) + else: + node['right'] = get_split(right) + split(node['right'], max_depth, min_size, depth+1) + +# Build a decision tree +def build_tree(train, max_depth, min_size): + root = get_split(train) + split(root, max_depth, min_size, 1) + return root + +# Print a decision tree +def print_tree(node, depth=0): + if isinstance(node, dict): + print('%s[X%d < %.3f]' % ((depth*' ', (node['index']+1), node['value']))) + print_tree(node['left'], depth+1) + print_tree(node['right'], depth+1) + else: + print('%s[%s]' % ((depth*' ', node))) + + +if __name__ == "__main__": + dataset = pd.read_excel('Train.xlsx', sheet_name="Sheet1").to_numpy() + mxdp = input("max depth") + tree = build_tree(dataset, int(mxdp), 1) + print_tree(tree)