【问题标题】:Facebook Prophet: Providing different data sets to build a better modelFacebook Prophet:提供不同的数据集以构建更好的模型
【发布时间】:2019-04-27 20:12:23
【问题描述】:

我的数据框看起来像这样。我的目标是根据event_id1event_id2

的数据预测event_id3
ds tickets_sold y event_id
3/12/19 90  90  1
3/13/19 40  130 1
3/14/19 13  143 1
3/15/19 8   151 1
3/16/19 13  164 1
3/17/19 14  178 1
3/20/19 10  188 1
3/20/19 15  203 1
3/20/19 13  216 1
3/21/19 6   222 1
3/22/19 11  233 1
3/23/19 12  245 1
3/12/19 30  30  2
3/13/19 23  53  2
3/14/19 43  96  2
3/15/19 24  120 2
3/16/19 3   123 2
3/17/19 5   128 2
3/20/19 3   131 2
3/20/19 25  156 2
3/20/19 64  220 2
3/21/19 6   226 2
3/22/19 4   230 2
3/23/19 63  293 2

我想根据该数据预测未来 10 天的销售额:

ds  tickets_sold y event_id
3/24/19 20  20  3
3/25/19 30  50  3
3/26/19 20  70  3
3/27/19 12  82  3
3/28/19 12  94  3
3/29/19 12  106 3
3/30/19 12  118 3

到目前为止,我的模型就是那个。但是,我并没有告诉模型这是两个独立的事件。然而,考虑来自不同事件的所有数据将是有用的,因为它们属于同一组织者,因此提供的信息不仅仅是一个事件。 Prophet 可以这样搭配吗?

# Load data
df = pd.read_csv('event_data_prophet.csv')
df.drop(columns=['tickets_sold'], inplace=True, axis=0)
df.head()

# The important things to note are that cap must be specified for every row in the dataframe,
# and that it does not have to be constant. If the market size is growing, then cap can be an increasing sequence.
df['cap'] = 500

# growth: String 'linear' or 'logistic' to specify a linear or logistic trend.
m = Prophet(growth='linear')
m.fit(df)

# periods is the amount of days that I look in the future
future = m.make_future_dataframe(periods=20)
future['cap'] = 500
future.tail()

forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

fig1 = m.plot(forecast)

【问题讨论】:

    标签: python machine-learning facebook-prophet


    【解决方案1】:

    事件的开始日期似乎会导致高峰。您可以通过将每个事件的开始日期设置为假期来使用holidays。这会告知先知事件(及其高峰)。我注意到事件 1 和 2 是重叠的。我认为你有多种选择来处理这个问题。你需要问自己每个事件的预测值与 event3 有什么关系。您没有太多数据,这将是主要问题。如果它们具有相同的价值,您可以更改一个事件的日期。例如 11 天前。不等值场景可能意味着您丢弃 1 个事件。

    events = pd.DataFrame({
      'holiday': 'events',
      'ds': pd.to_datetime(['2019-03-24', '2019-03-12', '2019-03-01']),
      'lower_window': 0,
      'upper_window': 1,
    })
    
    m = Prophet(growth='linear', holidays=events)
    m.fit(df)
    

    我还注意到你对 cumsum 的预测。我认为您的事件是固定的,因此先知可能受益于对每日门票销售的预测,而不是对 cumsum 的预测。

    【讨论】:

    • 嗨 tvgriek,假期的一个有趣的想法。我会试试的。重叠部分会更加“糟糕”,因为我有几十个事件同时发生。我在这里添加的数据只是示例数据。我认为总的来说,拥有“更多”数据是件好事,因为这些活动来自同一个“巡回演出”,因此与预测的活动销售高度相关。我想我还应该包括这些吗?到最后一部分#cumsum。你的意思是我不应该计算每天的总和,而应该将每笔销售单独交给 Prophet?
    • 是的,您可以尝试将它们链接起来。一天中的一周可能很重要,所以尽量保持这一点。此外,您可以使用假期来模拟其他因素,例如“营销活动在位置 X 上线”。最后,它是关于评估您的模型。您可以使用 cross_validation 函数中的预测器来回测您的模型并评估您做出的决定。然后,您还可以尝试 cumsum 和每日销售额之间的差异。没有金子弹。尝试不同的东西。
    • 我有 10 个不同的现场活动 - 例如一场音乐会。它们具有不同的最大容量,因此具有不同的营销预算。但是,它们在门票发行的峰值和活动前 2-3 周的峰值等方面是相似的。看看你的想法,我想知道这是否是一种有效的方法。这10个不同的事件都发生在过去两年中。销售和 y 是重叠的。我现在的方法是保留月份和日期,但给每个事件不同的年份。赛事 1(瑞典):2018 年,赛事 2(波兰):2017 年等。考虑到每个赛事的上限不同,这是否有意义?
    • 我的字符数不足,但我想补充一点,我在过去几周测试了不同的模型,到目前为止,Prophet 仍然给我最好的结果。现在我尝试根据您的建议对其进行优化。
    • 为了处理不同的容量,您可以在链接它们之前使用例如最小最大缩放器来缩放每个事件。我怀疑销售与营销工作和位置高度相关。您可能希望将这些添加为额外的回归量。可能按预算和大陆/大陆的一部分进行分箱
    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2020-07-22
    相关资源
    最近更新 更多