时间序列预测神器Prophet【入门教程2-饱和预测】

2024-09-05 17:08:02 浏览数 (3)

公众号:尤而小屋 编辑:Peter 作者:Peter

大家好,我是Peter~

本文是时间序列预测神器Prophet的第二篇:使用Prophet如何实现饱和预测

饱和预测增长-Saturating Forecasts

默认情况下,Prophet 使用线性模型来进行预测。然而,在预测增长时,通常存在一个可达到的最大点:如总市场规模、总人口规模等。这个点被称为承载能力(carrying capacity),并且预测应该在这个点上达到饱和。

这个时候使用Prophet进行预测时,需要考虑这个上限,可以使用逻辑增长等模型来确保预测值在达到上限后不再增长,而是保持在该水平附近波动。

导入库

代码语言:python代码运行次数:0复制
import numpy as np
import pandas as pd
import os
import datetime 
import time
import re
np.random.seed(42)   

import plotly_express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import matplotlib.pyplot as plt
%matplotlib inline
# 设置支持中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] 
# 设置图像标题字体
plt.rcParams['axes.unicode_minus'] = False
import seaborn as sns
sns.set_theme(style="darkgrid")

import statsmodels.api as sm
import statsmodels.formula.api as smf
from statsmodels.tsa.stattools import adfuller
from sklearn.metrics import r2_score,mean_squared_error,mean_squared_log_error

from prophet import Prophet 

import warnings
warnings.filterwarnings('ignore')

读取数据

在本案例中采用维基百科上R语言的日访问量的数据进行建模:

代码语言:python代码运行次数:0复制
df = pd.read_csv('https://raw.githubusercontent.com/facebook/prophet/main/examples/example_wp_log_R.csv')
df

需要指定特殊的承载力字段cap(必须为cap):

代码语言:python代码运行次数:0复制
df["cap"] = 8.5  # 不一定是固定值

fit训练

实例化过程中指定逻辑增长logistic:

代码语言:python代码运行次数:0复制
m = Prophet(growth='logistic')
m.fit(df)

predict预测

代码语言:python代码运行次数:0复制
# 1、先指定预测的数据集
future = m.make_future_dataframe(periods=1826) 
代码语言:python代码运行次数:0复制
# 2、预测数据中指定cap值
future["cap"] = 8.5
代码语言:python代码运行次数:0复制
# 3、实施预测
forecast = m.predict(future)

预测可视化

代码语言:python代码运行次数:0复制
m.plot(forecast)
plt.show()

饱和预测减少

在逻辑增长模型中,通常关注的是模型如何接近并达到一个上限(即承载能力),但在某些情况下,模型也可能从一个非零的最小值开始增长。这个非零的最小值可以被称为“饱和最小值”(saturating minimum)。

Prophet在处理饱和预测减少的时候,需要指定一个floor字段,就像cap列用于指定最大值一样。

代码语言:python代码运行次数:0复制
df.head()

指定上下限

代码语言:python代码运行次数:0复制
# 分别指定cap和floor

df["y"] = 10 - df["y"]  
df["cap"] = 6
df["floor"] = 1.5

future["cap"] = 6
future["floor"] = 1.5

fit&predict

训练和预测过程:

代码语言:python代码运行次数:0复制
m = Prophet(growth="logistic")  # 增长的模式为逻辑增长
m.fit(df)

实施预测过程:

代码语言:python代码运行次数:0复制
forecast = m.predict(future)

可视化过程:

代码语言:python代码运行次数:0复制
m.plot(forecast)
plt.show()

0 人点赞