Source code for caliber.binary_classification.minimizing.linear_scaling.performance.recall_fixed_precision_linear_scaling

from functools import partial
from typing import Optional

import numpy as np

from caliber.binary_classification.minimizing.linear_scaling.performance.base import (
    PerformanceLinearScalingBinaryClassificationModel,
)


[docs] class RecallFixedPrecisionLinearScalingBinaryClassificationModel( PerformanceLinearScalingBinaryClassificationModel ): def __init__( self, threshold: float, lam: float = 0.01, minimize_options: Optional[dict] = None, has_intercept: bool = True, min_precision: float = 0.8, ): super().__init__( loss_fn=partial(_recall_fixed_precision, min_precision=min_precision), threshold=threshold, minimize_options=minimize_options, has_intercept=has_intercept, ) self._lam = lam
def _recall_fixed_precision( targets: np.ndarray, preds: np.ndarray, min_precision: float ) -> float: n_pos_targets = np.sum(targets) n_pos_preds = np.sum(preds) joint = np.sum(targets * preds) recall = joint / n_pos_targets if n_pos_targets > 0 else 0.0 precision = joint / n_pos_preds if n_pos_preds > 0 else 0.0 cond = precision >= min_precision return -recall * cond