Source code for empulse.metrics.lift

import numpy as np

from .._types import FloatArrayLike, FloatNDArray
from ._validation import _check_binary, _check_fraction, _check_shape, _check_variance, _check_y_pred, _check_y_true


def _validate_input(
    y_true: FloatArrayLike, y_score: FloatArrayLike, fraction: float
) -> tuple[FloatNDArray, FloatNDArray]:
    y_true: FloatNDArray = _check_y_true(y_true)
    y_score: FloatNDArray = _check_y_pred(y_score)
    _check_shape(y_true, y_score)
    _check_binary(y_true)
    _check_variance(y_true)
    _check_shape(y_true, y_score)
    _check_fraction(fraction, 'fraction')

    return y_true, y_score


[docs] def lift_score( y_true: FloatArrayLike, y_score: FloatArrayLike, *, fraction: float = 0.1, check_input: bool = True ) -> float: """ Compute the lift score for the top fraction of predictions. Parameters ---------- y_true : 1D array-like, shape=(n_samples,) Binary target values ('positive': 1, 'negative': 0). y_score : 1D array-like, shape=(n_samples,) Target scores, can either be probability estimates or non-thresholded decision values. fraction : float, optional, default: 0.1 Fraction of data to consider. Must be between 0 and 1. check_input : bool, default=True Perform input validation. Turning off improves performance, useful when using this metric as a loss function. Returns ------- lift_score : float Lift score for the top fraction of the data. """ if check_input: y_true, y_score = _validate_input(y_true, y_score, fraction) else: y_true = np.asarray(y_true) y_score = np.asarray(y_score) # Sort the predictions in descending order sorted_indices = np.argsort(y_score)[::-1] sorted_labels = y_true[sorted_indices] top_fraction = int(round(len(sorted_labels) * fraction, 0)) n_positives_top_fraction: int = int(np.sum(sorted_labels[:top_fraction])) prop_positives_top_fraction = n_positives_top_fraction / top_fraction return prop_positives_top_fraction / float(np.mean(y_true))