| """ |
| compare_results.py – So sánh kết quả PhoBERT vs GPT OSS 20B |
| -------------------------------------------------------------- |
| Dùng: |
| python scripts/compare_results.py \ |
| --phobert_dir outputs/phobert \ |
| --gpt_dir outputs/gpt20b |
| """ |
|
|
| import argparse |
| import json |
| import os |
|
|
|
|
| def load_results(directory: str) -> dict: |
| path = os.path.join(directory, "test_results.json") |
| if not os.path.exists(path): |
| return {} |
| with open(path, "r", encoding="utf-8") as f: |
| return json.load(f) |
|
|
|
|
| def fmt(val, pct=True): |
| if isinstance(val, float): |
| return f"{val*100:.2f}%" if pct else f"{val:.4f}" |
| return str(val) |
|
|
|
|
| def main() -> None: |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--phobert_dir", default="outputs/phobert") |
| parser.add_argument("--gpt_dir", default="outputs/gpt20b") |
| args = parser.parse_args() |
|
|
| pb = load_results(args.phobert_dir) |
| gpt = load_results(args.gpt_dir) |
|
|
| if not pb and not gpt: |
| print("Chưa có kết quả nào. Hãy chạy train trước.") |
| return |
|
|
| metrics = ["accuracy", "f1_binary", "f1_macro", "precision", "recall"] |
| labels = ["Accuracy", "F1 Binary", "F1 Macro", "Precision", "Recall"] |
|
|
| col_w = 16 |
| header = f"{'Metric':<16} {'PhoBERT':>{col_w}} {'GPT-OSS-20B':>{col_w}} {'Δ (GPT - PB)':>{col_w}}" |
| print("\n" + "=" * len(header)) |
| print(" SO SÁNH KẾT QUẢ: PhoBERT vs GPT OSS 20B") |
| print("=" * len(header)) |
| print(header) |
| print("-" * len(header)) |
|
|
| for m, lbl in zip(metrics, labels): |
| pb_val = pb.get(m) |
| gpt_val = gpt.get(m) |
| if pb_val is None and gpt_val is None: |
| continue |
| pb_str = fmt(pb_val) if pb_val is not None else "—" |
| gpt_str = fmt(gpt_val) if gpt_val is not None else "—" |
| if pb_val is not None and gpt_val is not None: |
| delta = gpt_val - pb_val |
| sign = "+" if delta >= 0 else "" |
| d_str = f"{sign}{delta*100:.2f}%" |
| else: |
| d_str = "—" |
| print(f"{lbl:<16} {pb_str:>{col_w}} {gpt_str:>{col_w}} {d_str:>{col_w}}") |
|
|
| print("=" * len(header)) |
|
|
| |
| print(f"\nPhoBERT model : {pb.get('model', '—')}") |
| print(f"GPT OSS model : {gpt.get('model', '—')}") |
|
|
| |
| split = pb.get("split_sizes") or gpt.get("split_sizes") or {} |
| if split: |
| total = sum(split.values()) |
| print(f"\nDataset splits: train={split.get('train')} " |
| f"val={split.get('val')} test={split.get('test')} " |
| f"(total={total})") |
|
|
| |
| if pb.get("classification_report"): |
| print("\n── PhoBERT Classification Report ────────────────────────") |
| print(pb["classification_report"]) |
| if gpt.get("classification_report"): |
| print("── GPT OSS 20B Classification Report ────────────────────") |
| print(gpt["classification_report"]) |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|