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(