公众号:尤而小屋 编辑: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()