News for hackers. Stuff that matters.
Re:Forecasting in Python with Prophet by minimaxir on Friday February 22, 2019 @11:53AM (#19226804)
It's been awhile since my undergrad stats classes, but doesn't using a boxcox-transform on a objective metric, fitting the dataset to the transformed metric, and then inverting it violate model assumptions? (or maybe that's just in the case of a linear regression and not Prophet's approach)
Re:Forecasting in Python with Prophet by wenc on Friday February 22, 2019 @02:27PM (#19228315)
I believe as long as the transformation function is invertible (no information is lost), it ought to be a valid approach. The Box-Cox function as far as I can tell is invertible.

If a transformation f has the property (f^-1 o f)(x) = x then (f^-1 o g o f)(x) should be valid -- though how to rigorously demonstrate this in all cases evades me for now. (there are some conditions that need to be satisfied)

Rob Hyndman, the author of the "forecast" package in R, also thinks it's ok (slide 17 [1])

[1] https://robjhyndman.com/talks/RevolutionR/7-Transformations....

Re:Forecasting in Python with Prophet by tfehring on Friday February 22, 2019 @03:54PM (#19229014)
It just establishes new model assumptions. In the linear regression case, fitting boxcox(y) = βX + ε and predicting with boxcox^(-1)(yhat) produces different predictions than fitting y = βX + ε (minimizing Σ(boxcox(y) - boxcox(yhat))^2 does not minimize Σ(y - yhat)^2 in general). Either model would be an approximation, of course, and it's possible for either to produce more accurate predictions than the other for a given set of observations.

I'm not familiar enough with Prophet to know whether the same logic applies here, though I'd hazard a guess that it does.

Re:Forecasting in Python with Prophet by yorwba on Friday February 22, 2019 @04:42PM (#19229389)
Right. In particular, using least squares is justified by the assumption that errors are normally distributed, in which case least squares yields the maximum-likelihood estimate. Because boxcox is intended to transform a random variable into one that is normally distributed, the model assumptions are actually more likely to be satisfied if you do regression on the transformed values. (Which was probably the reason boxcox was invented in the first place.)
Re:Forecasting in Python with Prophet by oarabbus_ on Friday February 22, 2019 @01:58PM (#19228031)
For those of us whom it's also been a while since our undergrad stats classes but clearly we retained much less of it than you did, could you elaborate a bit here?

Shit, I've forgotten everything, I'm googling model assumptions, boxcox transform, the works

Re:Forecasting in Python with Prophet by CapmCrackaWaka on Friday February 22, 2019 @05:33PM (#19229767)
Yes, it does. However, it can usually be offset by some adjustment measure. The same thing happens when you take the log of your target variable and run a regression with RMSE as your loss, then try to get your predictions by taking e^prediction. Going from a lognormal to a normal distribution requires an offset, in this case: exp(variance(log preds - log target)/2). Box-Cox (which is very similar to log) would require a similar offset, however I don't know how to calculate it.

https://en.wikipedia.org/wiki/Log-normal_distribution

Re:Forecasting in Python with Prophet by wenc on Friday February 22, 2019 @06:11PM (#19230031)
> Yes, it does.

I'm trying to follow your explanation but help me understand better: which model assumptions would it violate?

Typical assumptions for time-series forecasting are stationarity (differencing is used to achieve this if not already the case), residuals are homoskedastic (constant variance) and normally distributed, etc. In fact, the primary use of the Box-Cox is to stabilize the variance and make the data more normal. Box-Cox itself doesn't violate any model assumptions. Forecasting on Box-Cox transformed data shouldn't either -- if anything, Box-Cox attempts to better satisfy the assumptions of time-series forecast models (well, as best it can -- some data just don't want to be normal).

Now the question is whether the inverse Box-Cox (or the entire process) violates any model assumptions. Intuitively, I don't believe it does (and Rob Hyndman, author of book on Forecasting agrees) but I'm not certain how to demonstrate this rigorously.

Re:Forecasting in Python with Prophet by CapmCrackaWaka on Friday February 22, 2019 @06:28PM (#19230157)
The assumption that your target is normally distributed about the expected value. Let's say you take the log of your target, and run a regression using RMSE. You now assume that log(Y) is normally distributed. Now, for a given sample, your model outputs E[log(Y)|X]. However, exp(E[log(Y)|X]) is not the same as E[exp(log(Y)|X], which is what you really want. It can be shown mathematically that in order to get to E[exp(log(Y)|X], you need to multiply by an offset factor, which in this case is exp(var(E[log(Y)]-log(Y)/2), which is how you would normally transform between the mean of a normal distribution to a lognormal distribution.

Here is a paper which addresses the issue in the introduction. https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4024993/

Re:Forecasting in Python with Prophet by wenc on Friday February 22, 2019 @08:32PM (#19230971)
Let me see if I understood you correctly. Let Y represent a random variable representing stationary time series data. Let g(.) be the forecast function.

1) Log-transformation: log(Y)

2) Forecast results of transformed data: E[g(log(Y))]

3) Inversion of forecast results: exp(E[g(log(Y))])

4) However, what we really want is the expectation of the transformed-forecasted-inversed results, which is E[exp(g(log(Y)))].

Jensen's inequality states that for a convex function φ,

φ(E[X]) <= E[φ(X)]

And equality is only attained if either X is constant or φ is affine. Since neither is (generally) the case here, therefore

exp(E[g(log(Y))]) < E[exp(g(log(Y)))]

An offset factor ε is needed to correct (3) to (4)

E[exp(g(log(Y)))] = exp(E[g(log(Y))]) * ε

Did I get that right? (Offset changed to multiplicative factor)

Re:Forecasting in Python with Prophet by CapmCrackaWaka on Friday February 22, 2019 @09:05PM (#19231126)
Yes, exactly. However in this case, the offset is multiplicative.
Re:Forecasting in Python with Prophet by wenc on Saturday February 23, 2019 @09:19AM (#19233396)
Understood. To add one more point, I'm noticing the reason the above works the way it does is because most forecast algorithms output an expected value instead of a random variable, hence the results are E[g(log(Y)] instead of just g(log(Y)).

It strikes me that if you package the entire thing as a random variable:

Z = exp(G(log(Y)))

and use a different kind of forecast function G : Y -> Y' where Y, Y' ~ Normal, then we don't need the multiplicative factor -- which can be difficult to calculate for an arbitrary transformation. We can just get the expected value of Z, ie. E[Z] = E[exp(G(log(Y)))]. This is not done in the article, but in theory it could be.