| 1234567891011121314151617181920212223242526272829303132333435363738 |
- #!/usr/bin/env python3
- """Evaluate the fixed vibration model against the sealed test directory."""
- from __future__ import annotations
- import argparse
- import json
- import sys
- from pathlib import Path
- sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
- from models.common import modeling, paths
- from models.vibration import features_vibration
- def main() -> None:
- parser = argparse.ArgumentParser(description="仅对封存振动测试集做最终模型评估")
- parser.add_argument("--datasets-dir", default=str(paths.VIBRATION_DATAS))
- parser.add_argument("--models-dir", default=str(paths.VIBRATION_MODELS))
- parser.add_argument("--output-dir", default=str(paths.VIBRATION_RESULTS))
- args = parser.parse_args()
- report = modeling.evaluate("vibration", features_vibration, Path(args.datasets_dir), Path(args.models_dir), Path(args.output_dir))
- summary = report["window_metrics"]
- print(f"测试集:{summary['samples']} 窗口(正常 {summary['normal_samples']}、异常 {summary['anomaly_samples']}),阈值 {report['threshold']:.6f}")
- print(f"{'类别':<6}{'查准率':>10}{'召回率':>10}{'F1':>10}{'样本数':>10}")
- for name, label in (("正常", "normal"), ("异常", "anomaly")):
- item = summary["class_metrics"][label]
- print(f"{name:<6}{item['precision']:>10.4f}{item['recall']:>10.4f}{item['f1']:>10.4f}{item['support']:>10}")
- print(
- f"准确率 {summary['accuracy']:.4f} 平衡准确率 {summary['balanced_accuracy']:.4f} "
- f"macro-F1 {summary['macro_f1']:.4f} 加权F1 {summary['weighted_f1']:.4f} "
- f"特异度 {summary['specificity']:.4f} PR-AUC {summary['pr_auc']:.4f}"
- )
- print(json.dumps(report, ensure_ascii=False, indent=2))
- if __name__ == "__main__":
- main()
|