facebookexperimental / Robyn

Robyn is an experimental, AI/ML-powered and open sourced Marketing Mix Modeling (MMM) package from Meta Marketing Science. Our mission is to democratise modeling knowledge, inspire the industry through innovation, reduce human bias in the modeling process & build a strong open source marketing science community.
https://facebookexperimental.github.io/Robyn/
MIT License
1.16k stars 346 forks source link

Prophet #156

Closed hugolan closed 3 years ago

hugolan commented 3 years ago

Hello Robyn Team!

In the first place let me say that you have done an amazing work! This is a fabulous package.

Nevertheless, I still don't understand what is the purpose of prophet. On #87 you gave a bit more explanation with a slide, still, I don't get it.

From what I have understood prophet will be used on the non-media var data to make their predictions, for instance on the dependent variable that is the revenue on the example you provided. It will then add the extra information gained which is the trend, season, weekly... to the features for the model training. Correct me if I am wrong.

Therefore what I don't understand is that on the ridge regression components, you have coefficients for each of the prophet components, e.g. Beta_trend trend + Beta_sea sea etc why would you train the model with such betas, aren't this coefficients theoretically going to be very close to 1 as we already know the value of impact of trend, seasonality or week for a given time? When running Robyn and outputting the coefficients on the models I observed that they are not, and I have no clue why.

Moreover, why have you not taken the error given in Prophet ( in the additive model of prophet, when you have the trend, seasonality and holidays components then the only parameter you don't know yet is the error) and fit the model accordingly to it?

Thank you in advance, incredible job!

Best

N.B: on the ridge regression tab I think there is a small mistake in the formula of the adstock transformation, I think it should be something like Xdecay(tj) = Xtj + OjXdecay(t-1,j) [instead of OjXdecay(t,j-1)]

gufengzhou commented 3 years ago

Thanks! To the prophet usage, if we do as you suggest, for example the seasonality will take all the credits for Xmas, summer break etc. The prophet residual is free from any seasonality. Then if we always have big marketing spend over Xmas and summer, regressing on the prophet residual will result in little effect for marketing. This is the typical question how to balance seasonality and seasonal marketing. The way we do it is to use season and trend as independent variables in the ridge to regress original revenue. This way, marketing still "has a chance"

maisiemoore commented 3 years ago

Maybe I missed this somewhere in the documentation -- is there anywhere for us to be able to tune the Prophet components (ie. adjusting the weekly seasonality prior.scale or adding specific changepoint dates)?

laresbernardo commented 3 years ago

Hi @maisiemoore thanks for your feedback. I've enabled the ... parameter on robyn_inputs() and robyn_engineering() so you can pass additional custom arguments to prophet and/or prophet.fit. Please, try it out and let us know how it goes. This approach is a test and may be removed or adapted. Also, note that this is enabled only into the package branch for now, which will be released at the end of this month. If you'd like to try the current version, just modify your local func.R, on the prophet section.

gufengzhou commented 3 years ago

@laresbernardo I assume that she/he is still using the current Robyn 2.0 that doesn't have robyn_inputs() and robyn_engineering() yet.

The new version 3.0 will be released on Sep.29th FYI. However no matter which version, using extra prophet param requires manually customising Robyn.

maisiemoore commented 3 years ago

Thanks Robyn team for the quick turnaround! Yes, I'm currently on Robyn 2.0 -- so I'll look forward to Sept 29th

gufengzhou commented 3 years ago

please re-open if necessary