mirror of
https://github.com/Doctorado-ML/benchmark.git
synced 2025-08-17 16:35:54 +00:00
Add tex result table option in benchmark
This commit is contained in:
@@ -6,6 +6,7 @@ import abc
|
|||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import xlsxwriter
|
import xlsxwriter
|
||||||
|
import numpy as np
|
||||||
from .Experiments import Datasets, BestResults
|
from .Experiments import Datasets, BestResults
|
||||||
from .Utils import Folders, Files, Symbols, BEST_ACCURACY_STREE, TextColor
|
from .Utils import Folders, Files, Symbols, BEST_ACCURACY_STREE, TextColor
|
||||||
|
|
||||||
@@ -689,20 +690,34 @@ class Benchmark:
|
|||||||
end_message("Benchmark Ok", Files.exreport_output(self._score))
|
end_message("Benchmark Ok", Files.exreport_output(self._score))
|
||||||
Files.open(Files.exreport_pdf)
|
Files.open(Files.exreport_pdf)
|
||||||
|
|
||||||
def report(self):
|
def report(self, tex_output):
|
||||||
|
# Report Header
|
||||||
print(f"{'Dataset':30s} ", end="")
|
print(f"{'Dataset':30s} ", end="")
|
||||||
lines = "=" * 30 + " "
|
lines = "=" * 30 + " "
|
||||||
for model in self._models:
|
for model in self._models:
|
||||||
print(f"{model:^13s} ", end="")
|
print(f"{model:^13s} ", end="")
|
||||||
lines += "=" * 13 + " "
|
lines += "=" * 13 + " "
|
||||||
print(f"\n{lines}")
|
print(f"\n{lines}")
|
||||||
for dataset in self._datasets:
|
if tex_output:
|
||||||
|
self.print_tex_header()
|
||||||
|
# Report Body
|
||||||
|
for num, dataset in enumerate(self._datasets):
|
||||||
print(f"{dataset:30s} ", end="")
|
print(f"{dataset:30s} ", end="")
|
||||||
|
scores = []
|
||||||
for model in self._models:
|
for model in self._models:
|
||||||
result = self._report[model][dataset]
|
result = self._report[model][dataset]
|
||||||
print(f"{float(result['score']):.5f}±", end="")
|
score = float(result["score"])
|
||||||
print(f"{float(result['score_std']):.3f} ", end="")
|
score_std = float(result["score_std"])
|
||||||
|
print(f"{score:.5f}±", end="")
|
||||||
|
print(f"{score_std:.3f} ", end="")
|
||||||
|
scores.append((score, score_std))
|
||||||
print("")
|
print("")
|
||||||
|
if tex_output:
|
||||||
|
self.print_tex_line(num, dataset, scores)
|
||||||
|
|
||||||
|
if tex_output:
|
||||||
|
self.print_tex_footer()
|
||||||
|
# Summary of result files used
|
||||||
d_name = next(iter(self._datasets))
|
d_name = next(iter(self._datasets))
|
||||||
print(f"\n{'Model':30s} {'File Name':75s} Score")
|
print(f"\n{'Model':30s} {'File Name':75s} Score")
|
||||||
print("=" * 30 + " " + "=" * 75 + " ========")
|
print("=" * 30 + " " + "=" * 75 + " ========")
|
||||||
@@ -712,6 +727,58 @@ class Benchmark:
|
|||||||
report.report()
|
report.report()
|
||||||
print(f"{model:^30s} {file_name:75s} {report.score:8.5f}")
|
print(f"{model:^30s} {file_name:75s} {report.score:8.5f}")
|
||||||
|
|
||||||
|
def get_tex_file(self):
|
||||||
|
return os.path.join(Folders.exreport, Files.tex_output(self._score))
|
||||||
|
|
||||||
|
def print_tex_header(self):
|
||||||
|
with open(self.get_tex_file(), "w") as f:
|
||||||
|
header_data = "# & Dataset & \\#S & \\#F & \\#L & " + " & ".join(
|
||||||
|
self._models
|
||||||
|
)
|
||||||
|
tabular = "{rlrrr" + "c" * len(self._models) + "}"
|
||||||
|
header = (
|
||||||
|
"\\begin{sidewaystable}[ht]\n"
|
||||||
|
"\\centering\n"
|
||||||
|
"\\renewcommand{\\arraystretch}{1.2}\n"
|
||||||
|
"\\renewcommand{\\tabcolsep}{0.07cm}\n"
|
||||||
|
"\\caption{Accuracy results (mean ± std) for all the "
|
||||||
|
"algorithms and datasets}\n"
|
||||||
|
"\\label{table:datasets}\n"
|
||||||
|
"\\resizebox{0.95\\textwidth}{!}{\n"
|
||||||
|
"\\begin {tabular} {" + tabular + "}\\hline\n"
|
||||||
|
"\\" + header_data + "\\\\\n"
|
||||||
|
"\\hline\n"
|
||||||
|
)
|
||||||
|
f.write(header)
|
||||||
|
|
||||||
|
def print_tex_line(self, num, dataset, scores):
|
||||||
|
dt = Datasets()
|
||||||
|
with open(self.get_tex_file(), "a") as f:
|
||||||
|
X, y = dt.load(dataset)
|
||||||
|
samples, features = X.shape
|
||||||
|
n_classes = len(np.unique(y))
|
||||||
|
dataset_name = dataset.replace("_", "\\_")
|
||||||
|
print_line = (
|
||||||
|
f"{num + 1} & {dataset_name} & {samples} & {features} "
|
||||||
|
f"& {n_classes}"
|
||||||
|
)
|
||||||
|
max_value = max(scores)[0]
|
||||||
|
for score, score_std in scores:
|
||||||
|
# Add score and score_std
|
||||||
|
value = f"{score:.4f}±{score_std:.3f}"
|
||||||
|
value_formated = (
|
||||||
|
"\\bfseries " + value + " "
|
||||||
|
if score == max_value
|
||||||
|
else value
|
||||||
|
)
|
||||||
|
print_line += " & " + value_formated
|
||||||
|
print_line += "\\\\"
|
||||||
|
f.write(f"{print_line}\n")
|
||||||
|
|
||||||
|
def print_tex_footer(self):
|
||||||
|
with open(self.get_tex_file(), "a") as f:
|
||||||
|
f.write("\\hline\n\\end{tabular}}\n\\end{sidewaystable}\n")
|
||||||
|
|
||||||
def get_excel_file_name(self):
|
def get_excel_file_name(self):
|
||||||
return os.path.join(
|
return os.path.join(
|
||||||
Folders.exreport, Files.exreport_excel(self._score)
|
Folders.exreport, Files.exreport_excel(self._score)
|
||||||
|
@@ -41,6 +41,10 @@ class Files:
|
|||||||
def exreport(score):
|
def exreport(score):
|
||||||
return f"exreport_{score.replace('_','-')}.csv"
|
return f"exreport_{score.replace('_','-')}.csv"
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def tex_output(score):
|
||||||
|
return f"exreport_{score.replace('_','-')}.tex"
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def best_results(score, model):
|
def best_results(score, model):
|
||||||
return f"best_results_{score.replace('_','-')}_{model}.json"
|
return f"best_results_{score.replace('_','-')}_{model}.json"
|
||||||
|
@@ -22,16 +22,25 @@ def parse_arguments():
|
|||||||
required=False,
|
required=False,
|
||||||
help="Generate Excel File",
|
help="Generate Excel File",
|
||||||
)
|
)
|
||||||
|
ap.add_argument(
|
||||||
|
"-t",
|
||||||
|
"--tex-output",
|
||||||
|
type=bool,
|
||||||
|
required=False,
|
||||||
|
default=False,
|
||||||
|
)
|
||||||
args = ap.parse_args()
|
args = ap.parse_args()
|
||||||
return (args.score, args.excel)
|
return (args.score, args.excel, args.tex_output)
|
||||||
|
|
||||||
|
|
||||||
(score, excel) = parse_arguments()
|
(score, excel, tex_output) = parse_arguments()
|
||||||
benchmark = Benchmark(score)
|
benchmark = Benchmark(score)
|
||||||
benchmark.compile_results()
|
benchmark.compile_results()
|
||||||
benchmark.save_results()
|
benchmark.save_results()
|
||||||
benchmark.report()
|
benchmark.report(tex_output)
|
||||||
benchmark.exreport()
|
benchmark.exreport()
|
||||||
if excel:
|
if excel:
|
||||||
benchmark.excel()
|
benchmark.excel()
|
||||||
Files.open(benchmark.get_excel_file_name())
|
Files.open(benchmark.get_excel_file_name())
|
||||||
|
if tex_output:
|
||||||
|
print(f"File {benchmark.get_tex_file()} generated")
|
||||||
|
Reference in New Issue
Block a user