From e9d44e928b29b07e87f235441de1c5e8d4411106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Montan=CC=83ana?= Date: Wed, 4 May 2022 02:07:41 +0200 Subject: [PATCH] Fix circular definition --- benchmark/Arguments.py | 134 ------------------------------ benchmark/Experiments.py | 3 +- benchmark/Models.py | 146 +++++++++++++++++++++++++++++++++ benchmark/Utils.py | 7 -- benchmark/__init__.py | 2 +- benchmark/scripts/be_benchmark | 2 +- benchmark/scripts/be_report | 6 +- 7 files changed, 153 insertions(+), 147 deletions(-) diff --git a/benchmark/Arguments.py b/benchmark/Arguments.py index 3c3e91b..8e1fa57 100644 --- a/benchmark/Arguments.py +++ b/benchmark/Arguments.py @@ -11,137 +11,3 @@ ALL_METRICS = ( ) -class EnvData: - @staticmethod - def load(): - args = {} - with open(Files.dot_env) as f: - for line in f.read().splitlines(): - if line == "" or line.startswith("#"): - continue - key, value = line.split("=") - args[key] = value - return args - - -class EnvDefault(argparse.Action): - # Thanks to https://stackoverflow.com/users/445507/russell-heilling - def __init__(self, envvar, required=True, default=None, **kwargs): - self._args = EnvData.load() - default = self._args[envvar] - required = False - super(EnvDefault, self).__init__( - default=default, required=required, **kwargs - ) - - def __call__(self, parser, namespace, values, option_string=None): - setattr(namespace, self.dest, values) - - -class Arguments: - def __init__(self): - self.ap = argparse.ArgumentParser() - models_data = Models.define_models(random_state=0) - models = "{" + ", ".join(models_data) + "}" - self.parameters = { - "best": [ - ("-b", "--best"), - { - "type": str, - "required": False, - "help": "best results of models", - }, - ], - "color": [], - "compare": [ - ("-c", "--compare"), - { - "type": bool, - "required": False, - "help": "Compare accuracy with best results", - }, - ], - "dataset": [], - "excel": [ - ("-x", "--excel"), - { - "type": bool, - "required": False, - "default": False, - "help": "Generate Excel File", - }, - ], - "file": [ - ("-f", "--file"), - {"type": str, "required": False, "help": "Result file"}, - ], - "grid": [ - ("-g", "--grid"), - { - "type": str, - "required": False, - "help": "grid results of model", - }, - ], - "grid_paramfile": [], - "hidden": [], - "hyperparameters": [], - "key": [], - "lose": [], - "model": [ - ("-m", "--model"), - { - "type": str, - "required": True, - "choices": list(models_data), - "help": f"model name: {models}", - }, - ], - "model1": [], - "model2": [], - "nan": [], - "number": [], - "n_folds": [], - "paramfile": [], - "platform": [], - "quiet": [], - "report": [], - "score": [ - ("-s", "--score"), - { - "action": EnvDefault, - "envvar": "score", - "type": str, - "required": True, - "choices": ALL_METRICS, - }, - ], - "sql": [ - ("-q", "--sql"), - {"type": bool, "required": False, "help": "Generate SQL File"}, - ], - "stratified": [], - "tex_output": [ - ("-t", "--tex-output"), - { - "type": bool, - "required": False, - "default": False, - "help": "Generate Tex file with the table", - }, - ], - "title": [], - "win": [], - } - - def xset(self, *arg_name, **kwargs): - print("parameters", arg_name[0]) - names, default = self.parameters[arg_name[0]] - self.ap.add_argument( - *names, - **{**default, **kwargs}, - ) - return self - - def parse(self): - return self.ap.parse_args() diff --git a/benchmark/Experiments.py b/benchmark/Experiments.py index 2247602..d94a47b 100644 --- a/benchmark/Experiments.py +++ b/benchmark/Experiments.py @@ -14,8 +14,7 @@ from sklearn.model_selection import ( cross_validate, ) from .Utils import Folders, Files -from .Arguments import EnvData -from .Models import Models +from .Models import Models, EnvData class Randomized: diff --git a/benchmark/Models.py b/benchmark/Models.py index 9b363c3..70d0951 100644 --- a/benchmark/Models.py +++ b/benchmark/Models.py @@ -1,3 +1,4 @@ +import argparse from statistics import mean from sklearn.tree import DecisionTreeClassifier, ExtraTreeClassifier from sklearn.ensemble import ( @@ -11,6 +12,15 @@ from stree import Stree from wodt import Wodt from odte import Odte from xgboost import XGBClassifier +from .Utils import Files + +ALL_METRICS = ( + "accuracy", + "f1-macro", + "f1-micro", + "f1-weighted", + "roc-auc-ovr", +) class Models: @@ -89,3 +99,139 @@ class Models: nodes, leaves = result.nodes_leaves() depth = result.depth_ if hasattr(result, "depth_") else 0 return nodes, leaves, depth + + +class EnvData: + @staticmethod + def load(): + args = {} + with open(Files.dot_env) as f: + for line in f.read().splitlines(): + if line == "" or line.startswith("#"): + continue + key, value = line.split("=") + args[key] = value + return args + + +class EnvDefault(argparse.Action): + # Thanks to https://stackoverflow.com/users/445507/russell-heilling + def __init__(self, envvar, required=True, default=None, **kwargs): + self._args = EnvData.load() + default = self._args[envvar] + required = False + super(EnvDefault, self).__init__( + default=default, required=required, **kwargs + ) + + def __call__(self, parser, namespace, values, option_string=None): + setattr(namespace, self.dest, values) + + +class Arguments: + def __init__(self): + self.ap = argparse.ArgumentParser() + models_data = Models.define_models(random_state=0) + self.parameters = { + "best": [ + ("-b", "--best"), + { + "type": str, + "required": False, + "help": "best results of models", + }, + ], + "color": [], + "compare": [ + ("-c", "--compare"), + { + "type": bool, + "required": False, + "help": "Compare accuracy with best results", + }, + ], + "dataset": [], + "excel": [ + ("-x", "--excel"), + { + "type": bool, + "required": False, + "default": False, + "help": "Generate Excel File", + }, + ], + "file": [ + ("-f", "--file"), + {"type": str, "required": False, "help": "Result file"}, + ], + "grid": [ + ("-g", "--grid"), + { + "type": str, + "required": False, + "help": "grid results of model", + }, + ], + "grid_paramfile": [], + "hidden": [], + "hyperparameters": [], + "key": [], + "lose": [], + "model": [ + ("-m", "--model"), + { + "type": str, + "required": True, + "choices": list(models_data), + "action": EnvDefault, + "envvar": "model", + "help": f"model name", + }, + ], + "model1": [], + "model2": [], + "nan": [], + "number": [], + "n_folds": [], + "paramfile": [], + "platform": [], + "quiet": [], + "report": [], + "score": [ + ("-s", "--score"), + { + "action": EnvDefault, + "envvar": "score", + "type": str, + "required": True, + "choices": ALL_METRICS, + }, + ], + "sql": [ + ("-q", "--sql"), + {"type": bool, "required": False, "help": "Generate SQL File"}, + ], + "stratified": [], + "tex_output": [ + ("-t", "--tex-output"), + { + "type": bool, + "required": False, + "default": False, + "help": "Generate Tex file with the table", + }, + ], + "title": [], + "win": [], + } + + def xset(self, *arg_name, **kwargs): + names, default = self.parameters[arg_name[0]] + self.ap.add_argument( + *names, + **{**default, **kwargs}, + ) + return self + + def parse(self): + return self.ap.parse_args() diff --git a/benchmark/Utils.py b/benchmark/Utils.py index 3d202ba..7d860cf 100644 --- a/benchmark/Utils.py +++ b/benchmark/Utils.py @@ -2,13 +2,6 @@ import os import subprocess BEST_ACCURACY_STREE = 40.282203 -ALL_METRICS = ( - "accuracy", - "f1-macro", - "f1-micro", - "f1-weighted", - "roc-auc-ovr", -) class Folders: diff --git a/benchmark/__init__.py b/benchmark/__init__.py index 6d699da..f9034e9 100644 --- a/benchmark/__init__.py +++ b/benchmark/__init__.py @@ -1,6 +1,6 @@ from .Experiments import Experiment, Datasets, DatasetsSurcov, DatasetsTanveer from .Results import Report, Summary -from .Arguments import EnvDefault +from .Models import EnvDefault __author__ = "Ricardo Montañana Gómez" __copyright__ = "Copyright 2020-2022, Ricardo Montañana Gómez" diff --git a/benchmark/scripts/be_benchmark b/benchmark/scripts/be_benchmark index 219c7fa..14822a0 100755 --- a/benchmark/scripts/be_benchmark +++ b/benchmark/scripts/be_benchmark @@ -1,7 +1,7 @@ #!/usr/bin/env python from benchmark.Results import Benchmark from benchmark.Utils import Files -from benchmark.Arguments import Arguments +from benchmark.Models import Arguments arguments = Arguments() diff --git a/benchmark/scripts/be_report b/benchmark/scripts/be_report index dda69c6..6dffdcb 100755 --- a/benchmark/scripts/be_report +++ b/benchmark/scripts/be_report @@ -6,7 +6,7 @@ from benchmark.Utils import ( Files, TextColor, ) -from benchmark.Arguments import Arguments +from benchmark.Models import Arguments """Build report on screen of a result file, optionally generate excel and sql @@ -44,7 +44,9 @@ def default_report(): if __name__ == "__main__": arguments = Arguments() arguments.xset("file").xset("excel").xset("sql").xset("compare") - arguments.xset("best").xset("grid").xset("model").xset("score") + arguments.xset("best").xset("grid").xset("model", required=False).xset( + "score" + ) args = arguments.parse() if args.grid: