prophet Saturating Forecasts饱和预测例子

一、例子代码

demo代码:https://github.com/lilihongjava/prophet_demo/tree/master/saturating_forecasts

# encoding: utf-8
"""
@author: lee
@time: 2019/5/13 15:26
@file: main.py
@desc: 
"""
import pandas as pd
from fbprophet import Prophet
from pandas.plotting import register_matplotlib_converters


def main():
    df = pd.read_csv('./data/example_wp_log_R.csv')

    df['cap'] = 8.5

    m = Prophet(growth='logistic')
    m.fit(df)

    register_matplotlib_converters()
    future = m.make_future_dataframe(periods=1826)
    future['cap'] = 8.5
    fcst = m.predict(future)
    fig = m.plot(fcst)
    fig.show()

    df['y'] = 10 - df['y']
    df['cap'] = 6
    df['floor'] = 1.5
    future['cap'] = 6
    future['floor'] = 1.5
    m = Prophet(growth='logistic')
    m.fit(df)
    fcst = m.predict(future)
    fig = m.plot(fcst)
    fig.show()


if __name__ == "__main__":
    main()

二、逻辑增长模型(logistic growth)

默认情况下,Prophet 使用线性模型来预测,在预测增长时,通常会出现最大可达点,例如总市场规模,总人口数等。这被称为承载能力,预测应该在这一点上饱和。

Prophet允许使用具有指定承载能力的逻辑增长模型(logistic growth)进行预测。以下使用维基百科上R语言访问量(取对数)的数据。

df = pd.read_csv('../examples/example_wp_log_R.csv')

使用该模型,必须指定承载能力即:cap,必须在一个新的列上指明

df['cap'] = 8.5

需要注意的是,cap必须为dataframe的每一行指定,cap 列的值不一定是常数,因为如果市场规模在增长,那么cap 可能也会增长。

然后我们像以前一样拟合模型,传递一个额外的参数growth='logistic'来指定 logistic growth:

m = Prophet(growth='logistic')
m.fit(df)

我们像之前的例子一样为预测构造一个dataframe ,但我们还必须指定cap。我们将cap设置上面相同的值,并预测未来3年:

future = m.make_future_dataframe(periods=1826)
future['cap'] = 8.5
fcst = m.predict(future)
fig = m.plot(fcst)

logistic函数的隐式最小值为0,并且在0处饱和,就像在cap处饱和一样。也可以指定不同的饱和最小值。

三、饱和最小值

逻辑增长模型模型还可以处理饱和最小值,使用floor与cap相同的方式来指定:

df['y'] = 10 - df['y']
df['cap'] = 6
df['floor'] = 1.5
future['cap'] = 6
future['floor'] = 1.5
m = Prophet(growth='logistic')
m.fit(df)
fcst = m.predict(future)
fig = m.plot(fcst)

要使用具有饱和最小值的logistic growth trend,还必须指定最大cap。

参考资料:

https://facebook.github.io/prophet/docs/saturating_forecasts.html

Prophet-NNAR是一种混合预测模型,它结合了Facebook的Prophet库和自回归神经网络(Neural Network AR, NNAR)技术。Prophet是一个强大的时间序列分析工具,特别适合有季节性和趋势变化的数据。而NNAR则通过深度学习的方式增强了模型对非线性和复杂性的适应能力。 在Python中,如果你想要实现这样一个模型,首先需要安装`fbprophet`和深度学习库如`Keras`或`PyTorch`。以下是一个简化版的示例,假设我们已经在环境中安装了这些库: ```python import pandas as pd from fbprophet import Prophet from keras.layers import Dense from sklearn.preprocessing import StandardScaler # 加载数据并准备Prophet部分 def prepare_prophet_data(df): df['ds'] = pd.to_datetime(df['ds']) df = df.set_index('ds') return df # 定义NNAR部分 def create_nn_ar_model(input_shape): model = Sequential() model.add(LSTM(units=50, input_shape=input_shape)) model.add(Dense(1)) # 输出一层,用于预测 model.compile(optimizer='adam', loss='mse') # 使用均方误差作为损失函数 return model # 结合两个模型 def prophet_nnar_forecast(data, prophet_steps, nnar_steps): # 准备Prophet部分 data_prophet = prepare_prophet_data(data) # 创建Prophet模型 m = Prophet() m.fit(data_prophet) # 进行Prophet预测 future = m.make_future_dataframe(periods=prophet_steps) forecast_prophet = m.predict(future) # 对原始数据进行标准化 scaler = StandardScaler() data_scaled = scaler.fit_transform(data.values) # 使用NNAR预测剩余部分 input_shape = (data_scaled.shape[0], 1) nnar_model = create_nn_ar_model(input_shape) forecast_nnar = nnar_model.predict(data_scaled[-nnar_steps:]) # 合并Prophet和NNAR预测结果 forecast = np.concatenate((forecast_prophet[['yhat']].tail(nnar_steps), forecast_nnar), axis=0) return forecast # 使用示例 data = ... # 假设你的时间序列数据在这里 forecast = prophet_nnar_forecast(data, prophet_steps=365, nnar_steps=90) # 设置Prophet和NNAR预测的时间步长
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lovelife110

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值