102 lines
3.1 KiB
Python
102 lines
3.1 KiB
Python
#!/usr/bin/env python3
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
from pathlib import Path
|
|
|
|
from scripts.grid_search_analytics.derived_analysis import derived_analysis
|
|
|
|
|
|
def parse_args() -> argparse.Namespace:
|
|
ap = argparse.ArgumentParser(
|
|
description="Generate derived grid-search analytics artifacts (fusion/error + param-performance)."
|
|
)
|
|
ap.add_argument("--analysis-dir", default="analysis_data/grid_search")
|
|
ap.add_argument("--mode", choices=["binary", "multiclass"], default="multiclass")
|
|
ap.add_argument("--method", choices=["pearson", "spearman"], default="spearman")
|
|
ap.add_argument(
|
|
"--x-metric",
|
|
choices=["fusion_corrections", "fusion_corrections_per_opportunity"],
|
|
default="fusion_corrections_per_opportunity",
|
|
help="Fusion-correlation x-axis metric for summary bar plot.",
|
|
)
|
|
ap.add_argument(
|
|
"--cat-method",
|
|
choices=["eta", "anova", "kruskal"],
|
|
default="kruskal",
|
|
help="Categorical-test method for param-performance correlations.",
|
|
)
|
|
ap.add_argument("--top-n", type=int, default=None, help="Optional cap for per-run plots.")
|
|
ap.add_argument(
|
|
"--recompute",
|
|
action="store_true",
|
|
help="Recompute from run artifacts instead of preferring cached CSVs.",
|
|
)
|
|
ap.add_argument(
|
|
"--deep-scan",
|
|
action="store_true",
|
|
help="Scan nested directories instead of direct children only.",
|
|
)
|
|
return ap.parse_args()
|
|
|
|
|
|
def main() -> int:
|
|
args = parse_args()
|
|
analysis = derived_analysis(
|
|
Path(args.analysis_dir),
|
|
classification_mode=args.mode,
|
|
)
|
|
|
|
shallow = not args.deep_scan
|
|
existing = not args.recompute
|
|
|
|
analysis.identify_fusion_corrections(shallow=shallow, existing=existing)
|
|
analysis.populate_primary_metrics(shallow=shallow, existing=existing)
|
|
|
|
analysis.write_fusion_corrections()
|
|
analysis.write_fusion_errors()
|
|
analysis.write_primary_metrics()
|
|
|
|
analysis.plot_fusion_corrections_errors(
|
|
shallow=shallow, existing=existing, top_n=args.top_n
|
|
)
|
|
analysis.plot_conf_delta_boxplot(
|
|
shallow=shallow, existing=existing, top_n=args.top_n
|
|
)
|
|
|
|
corr_df = analysis.param_performance_correlations(
|
|
shallow=shallow,
|
|
existing=existing,
|
|
method=args.method,
|
|
cat_method=args.cat_method,
|
|
)
|
|
analysis.plot_param_perf_corr_panels(corr_df)
|
|
|
|
corr_acc = analysis.fusion_corrections_correlation(
|
|
method=args.method, metric_type="acc"
|
|
)
|
|
corr_auc = analysis.fusion_corrections_correlation(
|
|
method=args.method, metric_type="auc"
|
|
)
|
|
try:
|
|
analysis.plot_fusion_perf_summary(
|
|
corr_acc,
|
|
corr_auc,
|
|
method=args.method,
|
|
x_metric=args.x_metric,
|
|
)
|
|
except RuntimeError:
|
|
analysis.plot_fusion_perf_summary(
|
|
corr_acc,
|
|
corr_auc,
|
|
method=args.method,
|
|
x_metric="fusion_corrections",
|
|
)
|
|
|
|
print(f"Done. Outputs written under: {Path(args.analysis_dir) / 'plots'}")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|