Improve the PR-curve's semantics

This commit is contained in:
Andras Schmelczer 2022-07-24 15:42:23 +02:00
parent e881bfbfbe
commit e8b07b4f5a
No known key found for this signature in database
GPG key ID: 0EA1BC97D0AB076E

View file

@ -4,7 +4,7 @@ from typing import Dict, List, Optional, TypeVar
import matplotlib import matplotlib
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import numpy as np import numpy as np
from sklearn.metrics import average_precision_score, precision_recall_curve from sklearn.metrics import average_precision_score
from ..unique import unique from ..unique import unique
from .draw_f1_iso_lines import draw_f1_iso_lines from .draw_f1_iso_lines import draw_f1_iso_lines
@ -67,15 +67,23 @@ def evaluate_ranking(
(v < classes[i]) if reverse_order else (v > classes[i]) (v < classes[i]) if reverse_order else (v > classes[i])
for v in expected for v in expected
] ]
precision, recall, _ = precision_recall_curve(
binarized_expected, actual_scores sorted_expected_actual = sorted(
zip(binarized_expected, actual_scores), key=lambda v: v[1], reverse=True
) )
precision = []
recall = []
correct = 0
for all, (e, score) in enumerate(sorted_expected_actual, start=1):
correct += int(e)
precision.append(correct / all)
recall.append(all / len(sorted_expected_actual))
if not disable_interpolation: if not disable_interpolation:
for j in range(1, len(precision)): for j in range(len(precision) - 2, -1, -1):
precision[j] = max(precision[j - 1], precision[j]) precision[j] = max(precision[j], precision[j + 1])
closest_recall_index = np.argmin(np.abs(recall - target_recall)) closest_recall_index = np.argmin(np.abs(np.array(recall) - target_recall))
precision_at_closest_recall = precision[closest_recall_index] precision_at_closest_recall = precision[closest_recall_index]
average_precision = average_precision_score( average_precision = average_precision_score(
binarized_expected, actual_scores binarized_expected, actual_scores