fraud-detection-mlops-api / tests /test_evaluate.py
github-actions[bot]
deploy: sync snapshot from github
4937cba
from __future__ import annotations
import numpy as np
from src.evaluate import (
calculate_metrics_at_threshold,
evaluate_thresholds,
select_best_threshold,
)
def test_calculate_metrics_at_threshold_contains_threshold() -> None:
y_true = np.array([0, 0, 1, 1])
y_prob = np.array([0.1, 0.4, 0.6, 0.9])
metrics = calculate_metrics_at_threshold(y_true, y_prob, threshold=0.5)
assert metrics["threshold"] == 0.5
assert 0.0 <= metrics["recall"] <= 1.0
assert 0.0 <= metrics["precision"] <= 1.0
def test_evaluate_thresholds_returns_expected_grid_size() -> None:
y_true = np.array([0, 0, 1, 1])
y_prob = np.array([0.1, 0.4, 0.6, 0.9])
evaluated = evaluate_thresholds(y_true, y_prob, min_threshold=0.1, max_threshold=0.9, grid_size=9)
assert len(evaluated) == 9
assert evaluated[0]["threshold"] == 0.1
def test_select_best_threshold_prefers_precision_under_recall_constraint() -> None:
y_true = np.array([0, 0, 0, 0, 1, 1, 1, 1])
y_prob = np.array([0.02, 0.15, 0.20, 0.30, 0.55, 0.65, 0.80, 0.95])
selected = select_best_threshold(
y_true,
y_prob,
min_recall=0.75,
min_threshold=0.1,
max_threshold=0.9,
grid_size=17,
)
assert selected["selected_metrics"]["recall"] >= 0.75
assert 0.1 <= selected["selected_threshold"] <= 0.9
assert selected["selection_reason"] in {"meets_min_recall", "fallback_max_recall"}