Skip to content

Commit

Permalink
Fix Auroc metric when max_fpr is set and a class is missing (#1895)
Browse files Browse the repository at this point in the history
Co-authored-by: Jirka Borovec <6035284+Borda@users.noreply.github.com>
Co-authored-by: Justus Schock <12886177+justusschock@users.noreply.github.com>
  • Loading branch information
3 people authored Jul 11, 2023
1 parent bf642fe commit 3fed40f
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 1 deletion.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Fixed

- Fixed the use of `max_fpr` in `AUROC` metric when only one class is present ([#1895](https://github.com/Lightning-AI/torchmetrics/pull/1895))


- Fixed bug related to empty predictions for `IntersectionOverUnion` metric ([#1892](https://github.com/Lightning-AI/torchmetrics/pull/1892))


Expand Down
2 changes: 1 addition & 1 deletion src/torchmetrics/functional/classification/auroc.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ def _binary_auroc_compute(
pos_label: int = 1,
) -> Tensor:
fpr, tpr, _ = _binary_roc_compute(state, thresholds, pos_label)
if max_fpr is None or max_fpr == 1:
if max_fpr is None or max_fpr == 1 or fpr.sum() == 0 or tpr.sum() == 0:
return _auc_compute_without_check(fpr, tpr, 1.0)

_device = fpr.device if isinstance(fpr, Tensor) else fpr[0].device
Expand Down
14 changes: 14 additions & 0 deletions tests/unittests/classification/test_auroc.py
Original file line number Diff line number Diff line change
Expand Up @@ -393,3 +393,17 @@ def test_valid_input_thresholds(metric, thresholds):
with pytest.warns(None) as record:
metric(thresholds=thresholds)
assert len(record) == 0


@pytest.mark.parametrize("max_fpr", [None, 0.8, 0.5])
def test_corner_case_max_fpr(max_fpr):
"""Check that metric returns 0 when one class is missing and `max_fpr` is set."""
preds = torch.tensor([0.1, 0.2, 0.3, 0.4])
target = torch.tensor([0, 0, 0, 0])
metric = BinaryAUROC(max_fpr=max_fpr)
assert metric(preds, target) == 0.0

preds = torch.tensor([0.5, 0.6, 0.7, 0.8])
target = torch.tensor([1, 1, 1, 1])
metric = BinaryAUROC(max_fpr=max_fpr)
assert metric(preds, target) == 0.0

0 comments on commit 3fed40f

Please sign in to comment.