Source code for caliber.binary_classification.minimizing.linear_scaling.performance.f1_linear_scaling
from typing import Optional
import numpy as np
from caliber.binary_classification.minimizing.linear_scaling.performance.base import (
PerformanceLinearScalingBinaryClassificationModel,
)
[docs]
class PositiveF1LinearScalingBinaryClassificationModel(
PerformanceLinearScalingBinaryClassificationModel
):
def __init__(
self,
threshold: float,
lam: float = 0.01,
minimize_options: Optional[dict] = None,
has_intercept: bool = True,
):
super().__init__(
loss_fn=_pos_f1_loss_fn,
threshold=threshold,
minimize_options=minimize_options,
has_intercept=has_intercept,
)
self._lam = lam
[docs]
class NegativeF1LinearScalingBinaryClassificationModel(
PerformanceLinearScalingBinaryClassificationModel
):
def __init__(
self,
threshold: float,
lam: float = 0.01,
minimize_options: Optional[dict] = None,
has_intercept: bool = True,
):
super().__init__(
loss_fn=_neg_f1_loss_fn,
threshold=threshold,
minimize_options=minimize_options,
has_intercept=has_intercept,
)
self._lam = lam
def _pos_f1_loss_fn(targets: np.ndarray, preds: np.ndarray) -> float:
p1_ = np.mean(targets)
p_1 = np.mean(preds)
p11 = np.mean(targets * preds)
p1sum = p1_ + p_1
return -p11 / p1sum if p1sum != 0 else np.nan
def _neg_f1_loss_fn(targets: np.ndarray, preds: np.ndarray) -> float:
p0_ = 1 - np.mean(targets)
p_0 = 1 - np.mean(preds)
p00 = np.mean((1 - targets) * (1 - preds))
p0sum = p0_ + p_0
return -p00 / p0sum if p0sum != 0 else np.nan