From 353b5f017432c90805a28a3e4303487c1793adf9 Mon Sep 17 00:00:00 2001 From: xVulpeSx Date: Sat, 14 May 2022 15:03:29 +0200 Subject: [PATCH] separate decisionTree from main() --- main.py | 87 ++++++++------------------------------------ tree/DecisionTree.py | 86 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 71 deletions(-) create mode 100644 tree/DecisionTree.py diff --git a/main.py b/main.py index 5cd0fa9..b46e274 100644 --- a/main.py +++ b/main.py @@ -17,6 +17,7 @@ from PatchType import PatchType from data.enum.CompanySize import CompanySize from data.enum.Direction import Direction from data.enum.Priority import Priority +from tree.DecisionTree import DecisionTree colors = [ 'blue', 'cyan', 'orange', 'yellow', 'magenta', 'purple', '#103d3e', '#9fc86c', @@ -60,80 +61,24 @@ def agent_portrayal(agent): if __name__ == '__main__': - test = ClientParamsFactory() - header = ['DELAY', - 'PAYED', - 'NET-WORTH', - 'INFLUENCE', - 'SKARBOWKA', - 'MEMBER', - 'HAT', - 'SIZE'] + base = 512 + gridWidth = 10 + gridHeight = 10 + scale = base / gridWidth - with open("data/TEST/generatedData.csv", 'w', newline='') as file: - writer = csv.writer(file) + diagram4 = GridWithWeights(gridWidth, gridHeight) + diagram4.walls = [(6, 5), (6, 6), (6, 7), (6, 8), (2, 3), (2, 4), (3, 4), (4, 4), (6, 4)] - writer.writerow(header) + diagram5 = GridWithWeights(gridWidth, gridHeight) + diagram5.puddles = [(2, 2), (2, 5), (2, 6), (5, 4)] - for i in range(200): - data = test.get_client_params() + grid = CanvasGrid(agent_portrayal, gridWidth, gridHeight, scale * gridWidth, scale * gridHeight) - writer.writerow([data.payment_delay, - data.payed, - data.net_worth, - data.infuence_rate, - data.is_skarbowka, - data.membership, - data.is_hat, - data.company_size]) + server = ModularServer(GameModel, + [grid], + "Automatyczny Wózek Widłowy", + {"width": gridHeight, "height": gridWidth, "graph": diagram4, "graph2": diagram5},) - file.close() - - data_input = pandas.read_csv('data/TEST/importedData.csv', delimiter=",") - - X_headers = ['DELAY','PAYED','NET-WORTH','INFLUENCE','SKARBOWKA','MEMBER','HAT','SIZE'] - - X = data_input[X_headers].values - Y = data_input["PRIORITY"] - - label_BP = preprocessing.LabelEncoder() - label_BP.fit(['CompanySize.NO', 'CompanySize.SMALL', 'CompanySize.NORMAL', 'CompanySize.BIG', 'CompanySize.HUGE', 'CompanySize.GIGANTISHE']) - X[:, 7] = label_BP.transform(X[:, 7]) - - X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, train_size=0.8) - - drugTree = DecisionTreeClassifier(criterion="entropy", max_depth=4) - - clf = drugTree.fit(X_train, y_train) - predicted = drugTree.predict(X_test) - - y_test = y_test.to_list() - - for i in range(len(predicted)): - print("{}. {} \n predicted: {}, actual: {}".format(i, X_test[i,:], predicted[i], y_test[i])) - - print("\nDecisionTrees's Accuracy: ", metrics.accuracy_score(y_test, predicted)) - - print(sklearn.tree.export_text(clf, feature_names=X_headers)) - - # base = 512 - # gridWidth = 10 - # gridHeight = 10 - # scale = base / gridWidth - # - # diagram4 = GridWithWeights(gridWidth, gridHeight) - # diagram4.walls = [(6, 5), (6, 6), (6, 7), (6, 8), (2, 3), (2, 4), (3, 4), (4, 4), (6, 4)] - # - # diagram5 = GridWithWeights(gridWidth, gridHeight) - # diagram5.puddles = [(2, 2), (2, 5), (2, 6), (5, 4)] - # - # grid = CanvasGrid(agent_portrayal, gridWidth, gridHeight, scale * gridWidth, scale * gridHeight) - # - # server = ModularServer(GameModel, - # [grid], - # "Automatyczny Wózek Widłowy", - # {"width": gridHeight, "height": gridWidth, "graph": diagram4, "graph2": diagram5},) - # - # server.port = 8888 - # server.launch() + server.port = 8888 + server.launch() diff --git a/tree/DecisionTree.py b/tree/DecisionTree.py new file mode 100644 index 0000000..e975abc --- /dev/null +++ b/tree/DecisionTree.py @@ -0,0 +1,86 @@ +import csv + +import pandas +import sklearn +from sklearn import metrics, preprocessing +from sklearn.model_selection import train_test_split +from sklearn.tree import DecisionTreeClassifier + +from ClientParamsFactory import ClientParamsFactory + + +class DecisionTree: + def __init__(self) -> None: + super().__init__() + + def generate_data(self, generator: ClientParamsFactory, n:int): + header = ['DELAY', + 'PAYED', + 'NET-WORTH', + 'INFLUENCE', + 'SKARBOWKA', + 'MEMBER', + 'HAT', + 'SIZE'] + + with open("data/TEST/generatedData.csv", 'w', newline='') as file: + writer = csv.writer(file) + + writer.writerow(header) + + for i in range(n): + data = generator.get_client_params() + + writer.writerow([data.payment_delay, + data.payed, + data.net_worth, + data.infuence_rate, + data.is_skarbowka, + data.membership, + data.is_hat, + data.company_size]) + + file.close() + + def get_normalized_data(self, X): + label_BP = preprocessing.LabelEncoder() + label_BP.fit( + ['CompanySize.NO', 'CompanySize.SMALL', 'CompanySize.NORMAL', 'CompanySize.BIG', 'CompanySize.HUGE', + 'CompanySize.GIGANTISHE']) + X[:, 7] = label_BP.transform(X[:, 7]) + + return X + + def print_logs(self, x, y, prediction): + for i in range(len(prediction)): + print("{}. {} \n predicted: {}, actual: {}".format(i, x[i, :], prediction[i], y[i])) + + print("\nDecisionTrees's Accuracy: ", metrics.accuracy_score(y, prediction)) + + + + + def get_decision_tree(self) -> DecisionTreeClassifier: + data_input = pandas.read_csv('data/TEST/importedData.csv', delimiter=",") + + X_headers = ['DELAY', 'PAYED', 'NET-WORTH', 'INFLUENCE', 'SKARBOWKA', 'MEMBER', 'HAT', 'SIZE'] + + X = data_input[X_headers].values + Y = data_input["PRIORITY"] + + X = self.get_normalized_data(X) + + X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, train_size=0.8) + + drugTree = DecisionTreeClassifier(criterion="entropy", max_depth=4) + + clf = drugTree.fit(X_train, y_train) + predicted = drugTree.predict(X_test) + + y_test = y_test.to_list() + + self.print_logs(X_test, y_test, predicted) + + print(sklearn.tree.export_text(clf, feature_names=X_headers)) + + return drugTree \ No newline at end of file