We are currently using XGBoost model with Tweedie loss for solving a regression problem which works very good, now I wanted to move our model to Keras and experience with neural networks, do anybody know how I can implement Tweedie loss for Keras? I only care about the instance when p=1.5 which gives us the best result in XGBoost.



I end up implementing something like this:

def tweedieloss(y_true, y_pred):
    dev = 2 * (K.pow(y_true, 2-p)/((1-p) * (2-p)) -
                   y_true * K.pow(y_pred, 1-p)/(1-p) +
                   K.pow(y_pred, 2-p)/(2-p))
    return K.mean(dev)

which I don't know how right it is, for now it seems to be working.


Hey thanks for sharing your solution, I was looking for this too! Quite frankly, I'm surprised that the Tweedie distribution isn't that popular since zero-inflated data is fairly common.

Just wanted to add a few comments on that, I'm submitting an "answer" because there is a strict character limit on the comments:

  1. Your solution is the Tweedie deviance which is the same as $-2LL$, which means that you can safely drop the multiplier 2 and minimize the negative log-likelihood instead (shouldn't affect your results)

  2. Technically there is a minor omission in your formula: in the first ratio instead of $\frac{y^{2-p}}{(1-p)(2-p)}$, it should be $\frac{\max(y,0)^{2-p}}{(1-p)(2-p)}$ although I think in practice you'd be working with non-negative values only, so it shouldn't matter

  3. Lastly, I'd also like to note that this definition is only suitable for variance power values $p \notin \{0,1,2\}$, for those special cases see the aforementioned link on Tweedie deviance


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.