brandon-behring/eval-toolkit
GitHub: brandon-behring/eval-toolkit
一套方法论驱动的二元分类评估工具套件,提供指标计算、bootstrap 置信区间、校准、数据泄露检测和可复现性清单,帮助研究者和工程师以统计严谨的方式评估和比较分类器。
Stars: 0 | Forks: 1
# eval-toolkit
一个**支持方法论的二元分类评估工具套件**:
指标、bootstrap 置信区间、校准、数据泄露检测、数据集划分,
阈值选择、数据集加载、可复现性清单,以及
将它们紧密结合的切片感知编排器。纯
numpy/scipy/sklearn 核心;pandas/matplotlib/hypothesis 为可选
扩展;PyTorch / HuggingFace / `datasets` 属于*消费者端*(绝不需要)。
设计上达到库级别 —— 每个公共函数都带有类型注解,
每个数学核心都附有 LaTeX + 文献引用的文档,
内置了统计有效性(bootstrap 置信区间、MDE 估计、配对差异
检验),并且 JSON 输出(`results.json` /
`results_full.json` / `manifest.json`)附带版本化的 [JSON
Schemas](src/eval_toolkit/schemas/),以便下游解析器可以根据
格式变化进行拦截。
## 三层架构
```
┌─ Tier 3 ─ Reproducibility scaffolding ─────────────────┐
│ manifest.json + seeds + git_sha + data_hashes + │
│ gpu_info + leakage_report (NeurIPS-aligned) │
├─ Tier 2 ─ Protocol-based orchestration ────────────────┤
│ Scorer / SliceAwareScorer / LeakageCheck / Splitter │
│ ThresholdSelector / DatasetLoader / SimilarityStrategy│
│ Versioned (opt-in: per-object versions in manifest) │
├─ Tier 1 ─ Functional core ─────────────────────────────┤
│ pr_auc / roc_auc / ECE variants / Brier / bootstrap_ci│
│ paired_bootstrap_diff / cv_clt_ci / mde_from_ci │
│ reliability_curve / fit_temperature / fit_isotonic │
└────────────────────────────────────────────────────────┘
```
根据您的任务需求选择相应的层级。临时分析:只需调用
函数核心。完整评估管道:实现 Protocols。每次
运行:捕获清单。
## 文档
- **[入门指南](docs/getting-started.md)** — 面向新用户的端到端
演练:安装、定义 Scorer、构建切片、
运行 `evaluate()`、持久化结果、添加声明、渲染图表。
- **[方法论课程](docs/methodology/README.md)** — 关于划分、指标、校准、证据门控、
预测产物等内容的 16 章
教程。
- **[Schema 参考](docs/schemas.md)** — `results.v1.json`、`results_full.v1.json`、`manifest.v1.json` 的逐字段语义说明。
- **[迁移指南](docs/MIGRATION.md)** — v0.6→v0.7,v0.7→v0.8,
v0.8→v0.9。
- **[扩展](docs/extending.md)** — 逐 Protocol 指南,用于
自定义 Scorers、Splitters、LeakageChecks、ThresholdSelectors、
DatasetLoaders、EvidenceGates。
- **[仓库策略](docs/repo-strategy.md)** — 包的组织方式、
6 桶目标形态,以及决定何时将子包提取到
其独立仓库的检查清单。
## 方法论
优秀的二元分类评估应该是怎样的,以及每个
关注点如何映射到将其具体实现的工具套件原语。
- [`docs/methodology/`](docs/methodology/README.md) — 课程
(16 章)。推荐阅读顺序:
[`leakage`](docs/methodology/leakage.md) →
[`splits`](docs/methodology/splits.md) →
[`thresholds`](docs/methodology/thresholds.md) →
[`calibration`](docs/methodology/calibration.md) →
[`comparison`](docs/methodology/comparison.md) →
[`bootstrap`](docs/methodology/bootstrap.md) →
[`length_stratification`](docs/methodology/length_stratification.md) →
[`text_dedup`](docs/methodology/text_dedup.md) →
[`versioning`](docs/methodology/versioning.md) →
[`fairness`](docs/methodology/fairness.md) →
[`reproducibility`](docs/methodology/reproducibility.md) →
[`testing`](docs/methodology/testing.md) →
[`reading_list`](docs/methodology/reading_list.md)。
- [`docs/MIGRATION.md`](docs/MIGRATION.md) — 各版本迁移
指南(v0.6→v0.7,v0.7→v0.8)。
- [`docs/roadmap.md`](docs/roadmap.md) — 前瞻性跟踪器;
v1.0.0 路线图;消费者缺口文档交叉链接。
## 扩展 eval-toolkit
如何将您自己的 scorer / 数据泄露检测 / 数据集划分器 / 加载器 /
阈值选择器接入该工具套件。
- [`docs/extending.md`](docs/extending.md) — 逐 Protocol
指南,约 50 行的完整工具套件配方,项目布局指引。
## 实战示例
- [`docs/examples/prompt_injection_walkthrough.md`](docs/examples/prompt_injection_walkthrough.md)
— 在合成的 OWASP LLM01:2025 数据集上进行的端到端提示注入评估;交叉链接至
[展示仓库](https://github.com/brandon-behring/prompt_injection_classifier_showcase)
以获取真实的 Lakera PINT 演练。
- [`docs/examples/pytorch_scorer_example.md`](docs/examples/pytorch_scorer_example.md)
— HuggingFace transformer + LoRA `Scorer` 适配器(批量推理,
GPU/CPU 布局,确定性模式设置)。
## 安装
```
uv venv
uv pip install -e .[dev]
```
对于只需要数学核心功能(无绘图,无 pandas)的消费者:
```
pip install eval-toolkit # core only: numpy/scipy/sklearn
pip install "eval-toolkit[plotting]" # adds matplotlib + pillow
pip install "eval-toolkit[dataframe]" # adds pandas
pip install "eval-toolkit[all]" # everything
```
## 快速示例
### 指标
```
import numpy as np
from eval_toolkit import pr_auc, roc_auc, expected_calibration_error
rng = np.random.default_rng(42)
y = rng.integers(0, 2, size=200)
# 裁剪至 [0, 1] — ECE 仅对校准后的概率有意义。
s = np.clip(y + rng.normal(0, 0.3, size=200), 0, 1)
print(f"PR-AUC: {pr_auc(y, s):.3f}")
print(f"ROC-AUC: {roc_auc(y, s):.3f}")
print(f"ECE (10 bins): {expected_calibration_error(y, s, n_bins=10):.3f}")
```
### Bootstrap 置信区间
```
from eval_toolkit import bootstrap_ci, paired_bootstrap_diff, pr_auc
ci = bootstrap_ci(y, s, pr_auc, n_resamples=1000, seed=42)
print(f"PR-AUC: {ci.point_estimate:.3f} 95% CI: [{ci.ci_low:.3f}, {ci.ci_high:.3f}]")
# 对两个评分器之间的提升进行 Paired bootstrap(s_baseline 也必须在 [0, 1] 范围内)。
s_baseline = np.clip(rng.normal(0.5, 0.3, size=200), 0, 1)
diff = paired_bootstrap_diff(y, s_baseline, s, pr_auc, n_resamples=1000, seed=42)
print(f"Δ PR-AUC: {diff.delta:.3f} overlaps zero: {diff.overlaps_zero}")
```
### 温度缩放 (Guo et al. 2017)
```
from eval_toolkit import fit_temperature
logits = rng.normal(size=(500, 2))
labels = (logits[:, 1] > logits[:, 0]).astype(int)
result = fit_temperature(logits, labels)
print(f"Optimal T: {result['temperature']:.3f}")
print(f"NLL: {result['nll_pre']:.3f} -> {result['nll_post']:.3f}")
```
### 可复现性清单(NeurIPS 兼容)
```
import tempfile
from pathlib import Path
from eval_toolkit import build_manifest, write_manifest
with tempfile.TemporaryDirectory() as run_dir:
# data_files: {name: path} → eval_toolkit hashes the files for you;
# versioned: any object with a `version` attribute (e.g. a scorer or
# leakage check) is captured by name → version in the manifest.
manifest = build_manifest(
run_id="quickstart-demo",
config={"threshold_criterion": "max_f1", "seed": 42},
seeds={"global": 42, "bootstrap": 42},
)
write_manifest(manifest, Path(run_dir))
# → run_dir/manifest.json: schema_version, git_sha, dirty_flag, code_versions,
# env (python+platform), seeds, data_hashes, versioned_objects, gpu_info
```
## 模块
| 模块 | 用途 |
|---|---|
| `eval_toolkit.metrics` | PR-AUC、ROC-AUC、ECE 变体、Brier 分解、先验偏移投影 |
| `eval_toolkit.thresholds` | `ThresholdSelector` Protocol + 6 种参考实现(max-F1、target-recall/precision/FPR、Youden-J、成本敏感) |
| `eval_toolkit.operating_points` | 在混合类别的切片上拟合阈值,并将其应用于混合或单类别目标切片,带有来源追溯 |
| `eval_toolkit.bootstrap` | BCa + 配对 bootstrap、MDE 估计、两级操作点 bootstrap、K 折 CLT 校正的置信区间 |
| `eval_toolkit.calibration` | 可靠性曲线、贝叶斯最优阈值、保序/Platt/温度缩放 |
| `eval_toolkit.harness` | `Scorer` Protocol + `evaluate(...)` + `evaluate_folded(...)` 切片感知编排器 |
| `eval_toolkit.leakage` | `LeakageCheck` Protocol + 7 种参考实现(精确/近似/编码混淆/交叉划分/标签冲突/分组/时间序列);`Versioned` 可选 Protocol |
| `eval_toolkit.splits` | `Splitter` Protocol + 5 种参考实现(留出法/分层/分组/源不相交/时间序列) |
| `eval_toolkit.loaders` | `DatasetLoader` Protocol + 4 种参考实现(DataFrame / SingleSlice / ParquetGlob / HF datasets),带有 Croissant 兼容的 `describe()` |
| `eval_toolkit.manifest` | `RunManifest`(NeurIPS 兼容)+ 源角色 / 护栏元数据 + `build_manifest` / `write_manifest` |
| `eval_toolkit.claims` | 通用证据门控和 `ClaimReport`,用于声明模式与探索模式的检查 |
| `eval_toolkit.text_dedup` | `SimilarityStrategy` Protocol + 5 种策略(TF-IDF / hash / embedding / Jaccard / MinHash-LSH);`near_dedup` / `cross_dedup` 编排器 |
| `eval_toolkit.plotting` | PR 曲线、可靠性图、混淆矩阵、得分直方图、提升置信区间 |
| `eval_toolkit.provenance` | 文件哈希、运行目录布局、图表元数据附属文件 |
| `eval_toolkit/schemas/` | 内置 JSON Schemas(`results.v1.json`、`results_full.v1.json`、`manifest.v1.json`)— 通过 `importlib.resources.files("eval_toolkit") / "schemas"` 加载(非可导入的 Python 模块) |
| `eval_toolkit.paths` | 相对于仓库的路径规范化 |
| `eval_toolkit.seeds` | `set_global_seeds` (random + numpy + 可选 torch) |
| `eval_toolkit.config` | `frozen_config` 装饰器 + `from_yaml` 加载器 |
| `eval_toolkit.docs` | 带格式化器注册表的基于锚点的 markdown 渲染 |
## 快速迭代循环
在开发中,使用以下命令跳过慢速测试:
```
make fast # or: nox -s fast
# 底层运行:uv run pytest -m "not slow" -q
```
CI 会在每次推送时运行完整测试套件(包括 `slow`)。`slow`
标记应用于耗时超过约 2 秒的测试(主要是具有较大 `max_examples` 的 Hypothesis 属性测试,以及少量 `n_resamples >= 200` 的 bootstrap 测试)。`make fast` 可将开发者迭代循环保持在约 30 秒以内。
## 标准
有关完整协调一致的编码标准(格式化、
命名、错误、文档字符串、测试、打包),请参阅 [`STYLE.md`](STYLE.md) 。
## 版本控制
从 v0.1.0 开始采用 Semver。请参阅 [`CHANGELOG.md`](CHANGELOG.md)。
## 许可证
MIT — 请参阅 [`LICENSE`](LICENSE)。
标签:AI安全, Atomic Red Team, Brier分数, Chat Copilot, HuggingFace, Hypothesis, JSON Schema, Matplotlib, NumPy, PR AUC, PyTorch, ROC AUC, Scikit-learn, SciPy, 二分类, 二分类评估, 切片评估, 可复现性, 引导置信区间, 性能指标, 提示注入检测器, 数据泄露检测, 数据科学, 数据集加载, 期望校准误差, 机器学习工具包, 机器学习评估, 模型校准, 类型注解, 统计分析, 置信区间, 评估工具包, 评估框架, 资源验证, 逆向工具, 配对差异检验, 阈值选择