Python 如何通过Prophet交叉验证获得更好的预测结果?
我有10年的每日需求数据,具有积极的趋势 在一年的最后三个月里,1-2的需求总是会受到冲击。15-16岁。当月(促销活动) 我试着用以下方法预测它: future=m.make\u future\u数据帧(句点=365) 预测=预测(未来) 但结果并不是我所期望的。我能得到的最好的MSE是6681。但当我尝试交叉验证时,结果与6690几乎相同Python 如何通过Prophet交叉验证获得更好的预测结果?,python,pandas,time-series,forecasting,Python,Pandas,Time Series,Forecasting,我有10年的每日需求数据,具有积极的趋势 在一年的最后三个月里,1-2的需求总是会受到冲击。15-16岁。当月(促销活动) 我试着用以下方法预测它: future=m.make\u future\u数据帧(句点=365) 预测=预测(未来) 但结果并不是我所期望的。我能得到的最好的MSE是6681。但当我尝试交叉验证时,结果与6690几乎相同 有什么我可以改变我的设置,以获得更好的结果 它是否有助于获得更大的数据集,比如说50年 总的来说:我是否正确理解了,您使用了“forecast=m.pr
- 有什么我可以改变我的设置,以获得更好的结果
- 它是否有助于获得更大的数据集,比如说50年
- 总的来说:我是否正确理解了,您使用了“forecast=m.predict(future)”或交叉验证选项
尝试网格搜索并调整超参数。使用changepoint\u previor\u scale参数也可能有所帮助。这只是个人观点,但将年度季节性设置为False,并在外部添加新的傅立叶顺序和优先级也会有所帮助。关于交叉验证,请检查以获得更好的理解。我认为您可以将您提到的特定日期(促销)设置为假日(参见prophet's guide。关于第二点,更多的数据通常可以提供更好的概括。@LuisBlanche这就是我在模型中对holidays=促销所做的。效果还不够好。绘制数据时,可以更好地看到它
import numpy as np
from fbprophet import Prophet
import matplotlib.pyplot as plt
from fbprophet.diagnostics import cross_validation
df = pd.read_excel('Dataset2.3_kurz.xls')
promotions = pd.DataFrame({
'holiday': 'winter_promotion',
'ds': pd.to_datetime(['2009-10-1','2009-10-2','2009-10-15','2009-10-16',
'2009-11-1','2009-11-2','2009-11-15','2009-11-16',
'2009-12-1','2009-12-2','2009-12-15','2009-12-16',
'2010-10-1','2010-10-2','2010-10-15','2010-10-16',
'2010-11-1','2010-11-2','2010-11-15','2010-11-16',
'2010-12-1','2010-12-2','2010-12-15','2010-12-16',
'2011-10-1','2011-10-2','2011-10-15','2011-10-16',
'2011-11-1','2011-11-2','2011-11-15','2011-11-16',
'2011-12-1','2011-12-2','2011-12-15','2011-12-16',
'2012-10-1','2012-10-2','2012-10-15','2012-10-16',
'2012-11-1','2012-11-2','2012-11-15','2012-11-16',
'2012-12-1','2012-12-2','2012-12-15','2012-12-16',
'2013-10-1','2013-10-2','2013-10-15','2013-10-16',
'2013-11-1','2013-11-2','2013-11-15','2013-11-16',
'2013-12-1','2013-12-2','2013-12-15','2013-12-16',
'2014-10-1','2014-10-2','2014-10-15','2014-10-16',
'2014-11-1','2014-11-2','2014-11-15','2014-11-16',
'2014-12-1','2014-12-2','2014-12-15','2014-12-16',
'2015-10-1','2015-10-2','2015-10-15','2015-10-16',
'2015-11-1','2015-11-2','2015-11-15','2015-11-16',
'2015-12-1','2015-12-2','2015-12-15','2015-12-16',
'2016-10-1','2016-10-2','2016-10-15','2016-10-16',
'2016-11-1','2016-11-2','2016-11-15','2016-11-16',
'2016-12-1','2016-12-2','2016-12-15','2016-12-16',
'2017-10-1','2017-10-2','2017-10-15','2017-10-16',
'2017-11-1','2017-11-2','2017-11-15','2017-11-16',
'2017-12-1','2017-12-2','2017-12-15','2017-12-16',
'2018-10-1','2018-10-2','2018-10-15','2018-10-16',
'2018-11-1','2018-11-2','2018-11-15','2018-11-16',
'2018-12-1','2018-12-2','2018-12-15','2018-12-16',
'2019-10-1','2019-10-2','2019-10-15','2019-10-16',
'2019-11-1','2019-11-2','2019-11-15','2019-11-16',
'2019-12-1','2019-12-2','2019-12-15','2019-12-16']),
'lower_window': 0,
'upper_window': 0,
})
#model
m = Prophet( growth='linear',
holidays=promotions,
seasonality_mode='multiplicative',
holidays_prior_scale=10,
seasonality_prior_scale=10,
yearly_seasonality=True,
)
m.fit(df)
df_cv = cross_validation(m, initial='732 days', period='365 days', horizon = '366 days')
from fbprophet.diagnostics import performance_metrics
df_p = performance_metrics(df_cv)
df_p = df_p[-365:]
df_p.tail()