diff --git a/docs/losses.html.md b/docs/losses.html.md index 937226b..2c0a0d9 100644 --- a/docs/losses.html.md +++ b/docs/losses.html.md @@ -436,7 +436,7 @@ d_{p}(y,\mu) y\,\ln\!\frac{y}{\mu}\;-\;(y-\mu), & p = 1\quad(\text{Poisson deviance}),\\[0.5em] \displaystyle --2\Bigl[\ln\!\frac{y}{\mu}\;-\;\frac{y-\mu}{\mu}\Bigr], +-\Bigl[\ln\!\frac{y}{\mu}\;-\;\frac{y-\mu}{\mu}\Bigr], & p = 2\quad(\text{Gamma deviance}). \end{cases} ``` diff --git a/tests/test_losses.py b/tests/test_losses.py index e04432b..8a6867a 100644 --- a/tests/test_losses.py +++ b/tests/test_losses.py @@ -176,7 +176,7 @@ def tweedie_deviance_single(y_true, y_pred, power, **kwargs): elif power == 1: return np.mean(2 * (y_true * np.log(y_true / y_pred) - (y_true - y_pred))) elif power == 2: - return np.mean(2 * (np.log(y_pred) - np.log(y_true)) + y_true / y_pred - 1) + return np.mean(2 * ((np.log(y_pred) - np.log(y_true)) + y_true / y_pred - 1)) else: return np.mean( 2 @@ -235,6 +235,14 @@ def linex_single(y_true, y_pred, a=1.0, **kwargs): partial(ufl.tweedie_deviance, power=2), partial(tweedie_deviance_single, power=2), ), + ( + partial(ufl.tweedie_deviance, power=1.5), + partial(tweedie_deviance_single, power=1.5), + ), + ( + partial(ufl.tweedie_deviance, power=2.5), + partial(tweedie_deviance_single, power=2.5), + ), ], ) def test_loss(engine, utils_fn, single_fn): diff --git a/utilsforecast/losses.py b/utilsforecast/losses.py index 62a9430..230d164 100644 --- a/utilsforecast/losses.py +++ b/utilsforecast/losses.py @@ -1232,9 +1232,12 @@ def gen_expr(model): def gen_expr(model): return ( - 2 * (nw.col(model).log() - nw.col(target_col).log()) - + (nw.col(target_col) / nw.col(model)) - - 1 + 2 + * ( + (nw.col(model).log() - nw.col(target_col).log()) + + (nw.col(target_col) / nw.col(model)) + - 1 + ) ).alias(model) else: @@ -1245,9 +1248,13 @@ def gen_expr(model): * ( nw.col(target_col).clip(0) ** (2 - power) / ((1 - power) * (2 - power)) + - ( + nw.col(target_col) + * (nw.col(model) ** (1 - power)) + / (1 - power) + ) + + (nw.col(model) ** (2 - power) / (2 - power)) ) - - (nw.col(target_col) * (nw.col(model) ** (1 - power)) / (1 - power)) - + (nw.col(model) ** (2 - power) / (2 - power)) ).alias(model) return _nw_agg_expr(