Put Sumary class in Results

Add criterion summary and add different scores
This commit is contained in:
2021-12-01 13:01:26 +01:00
parent 1fa4916672
commit 577ccb9c5a
3 changed files with 86 additions and 38 deletions

View File

@@ -6,7 +6,7 @@ import subprocess
import xlsxwriter
from tqdm import tqdm
from Experiments import Datasets, BestResults
from Utils import Folders, Files, Symbols
from Utils import Folders, Files, Symbols, BEST_ACCURACY_STREE
class BaseReport(abc.ABC):
@@ -165,7 +165,7 @@ class Report(BaseReport):
)
self.header_line(
f" Accuracy compared to stree_default (liblinear-ovr) .: "
f"{accuracy/40.282203:7.4f}"
f"{accuracy/BEST_ACCURACY_STREE:7.4f}"
)
self.header_line("*")
@@ -231,7 +231,7 @@ class ReportBest(BaseReport):
)
self.header_line(
f" Scores compared to stree_default accuracy (liblinear-ovr) .: "
f"{accuracy/40.282203:7.4f}"
f"{accuracy/BEST_ACCURACY_STREE:7.4f}"
)
self.header_line("*")
@@ -354,7 +354,7 @@ class Excel(BaseReport):
self.row += 1
message = (
f"** Accuracy compared to stree_default (liblinear-ovr) .: "
f"{accuracy/40.282203:7.4f}"
f"{accuracy/BEST_ACCURACY_STREE:7.4f}"
)
bold = self.book.add_format({"bold": True, "font_size": 14})
self.sheet.write(self.row + 1, 0, message, bold)
@@ -626,3 +626,72 @@ class Benchmark:
footer()
book.close()
class StubReport(BaseReport):
def __init__(self, file_name):
super().__init__(file_name=file_name, best_file=False)
def print_line(self, line) -> None:
pass
def header(self) -> None:
pass
def footer(self, accuracy: float) -> None:
self.accuracy = accuracy
class Summary:
def __init__(self) -> None:
self.results = Files().get_all_results()
self.data = []
def acquire(self) -> None:
"""Get all results"""
for result in self.results:
(
score,
model,
platform,
date,
time,
stratified,
) = Files().split_file_name(result)
report = StubReport(os.path.join(Folders.results, result))
report.report()
entry = dict(
score=score,
model=model,
platform=platform,
date=date,
time=time,
stratified=stratified,
file=result,
metric=report.accuracy / BEST_ACCURACY_STREE,
)
self.data.append(entry)
def list(self) -> None:
"""Print the list of results"""
max_length = max(len(x["file"]) for x in self.data)
print(
"\n".join(
[
f"{x['file']:{max_length}s} {x['metric']:7.3f}"
for x in self.data
]
)
)
def best_result(
self, criterion=None, value=None, score="accuracy"
) -> dict:
# First filter the same score results (accuracy, f1, ...)
haystack = [x for x in self.data if x["score"] == score]
haystack = (
haystack
if criterion is None or value is None
else [x for x in haystack if x[criterion] == value]
)
return sorted(haystack, key=lambda x: x["metric"], reverse=True)[0]

View File

@@ -1,35 +1,7 @@
import os
from Utils import Folders, Files
from Results import BaseReport
from Results import Summary
class StubReport(BaseReport):
def __init__(self, file_name):
super().__init__(file_name=file_name, best_file=False)
def print_line(self, line) -> None:
pass
def header(self) -> None:
pass
def footer(self, accuracy: float) -> None:
self.accuracy = accuracy
class Summary:
def __init__(self) -> None:
self.results = Files().get_all_results()
def list(self) -> None:
"""List all results"""
max_length = max([len(x) for x in self.results])
for result in self.results:
report = StubReport(os.path.join(Folders.results, result))
report.report()
print(f"{result:{max_length}s} {report.accuracy:7.3f}")
print("\n".join(self.results))
if __name__ == "__main__":
Summary().list()
summary = Summary()
summary.acquire()
print(summary.best_result())
print(summary.best_result(criterion="model", value="ODTE"))
summary.list()

View File

@@ -2,6 +2,8 @@ import os
import subprocess
import argparse
BEST_ACCURACY_STREE = 40.282203
class Folders:
data = "data"
@@ -47,6 +49,11 @@ class Files:
f"{stratified}.json"
)
def split_file_name(self, name):
_, score, model, platform, date, time, stratified = name.split("_")
stratified = stratified.replace(self.report_ext, "")
return score, model, platform, date, time, stratified
def results_suffixes(self, score="", model=""):
suffix = self.report_ext
if model == "" and score == "":