# 此单元格将不会被渲染,但用于隐藏警告并限制显示的行数。
import warnings
"ignore")
warnings.filterwarnings(
import logging
'statsforecast').setLevel(logging.ERROR)
logging.getLogger(
import pandas as pd
'display.max_rows', 6) pd.set_option(
Croston经典模型
使用
Statsforecast
的Croston经典模型
的逐步指南。
在这次演示中,我们将熟悉主要的 StatsForecast
类及一些相关方法,如 StatsForecast.plot
、StatsForecast.forecast
和 StatsForecast.cross_validation
等。
目录
引言
克罗斯顿模型是一种用于时间序列分析的方法,旨在预测在间歇性数据或频繁出现零值的情况下的需求。该模型由J.D. Croston于1972年开发,特别适用于库存管理、零售销售和低销售频率产品的需求预测等行业。
克罗斯顿模型基于两个主要组成部分:
间歇性需求率:计算出现销售或事件的时期的需求率,忽略没有销售的时期。这个比例用于估计未来发生索赔的概率。
需求间隔:计算销售或事件发生之间的时间间隔,再次忽略非销售时期。这个间隔用于估计下一个周期内发生需求的概率。
克罗斯顿模型将这两个估计值结合起来生成一个加权预测,考虑了间歇性需求的速率和需求之间的间隔。这种方法有助于解决在时间序列中有许多零值或缺失值情况下的需求预测挑战。
需要注意的是,克罗斯顿模型是一种简化方法,并未考虑需求数据中的其他可能的变异来源或模式。因此,在存在外部因素或需求行为变化的情况下,其准确性可能会受到影响。
Croston经典模型
什么是间歇性需求?
间歇性需求是指一种需求模式,其特征是事件或销售的不规则和零星发生。换句话说,它指的是某种产品或服务的需求间歇性地出现,在某些时段内没有销售或重大事件。
间歇性需求不同于恒定或规律性的需求,在后者中,销售在时间上以可预测和一致的方式发生。相反,在间歇性需求中,没有销售的时段可能很长,并且可能没有规律的事件序列。
这种类型的需求可以出现在不同的行业和背景中,例如低消费产品、季节性产品、高变动性产品、生命周期短的产品,或者需求依赖于特定事件或外部因素的情况。
间歇性需求可能在预测和库存管理中带来挑战,因为很难预测销售何时发生及其数量。像我之前提到的Croston模型等方法被用来应对间歇性需求,并为这种需求模式生成更准确和适当的预测。
间歇性需求的问题
间歇性需求在库存管理和需求预测中可能会带来各种挑战和问题。与间歇性需求相关的一些常见问题如下:
不可预测的变异性:间歇性需求可能具有不可预测的变异性,这使得计划和预测变得困难。需求模式可能不规则,并在有销售的时期和无销售的时期之间剧烈波动。
销售频率低:间歇性需求的特点是长时间没有销售。这可能导致库存管理困难,因为必须持有足够的库存以满足需求的出现,同时避免在无销售期间产生过剩库存。
预测误差:预测间歇性需求可能比恒定需求更难以确定。传统的预测模型可能不足以捕捉间歇性需求中的变异性和缺乏模式,这可能导致未来需求估计的重大误差。
对供应链的影响:间歇性需求可能影响供应链的效率,并在生产计划、供应商管理和物流方面造成困难。必须调整交货时间和库存水平以满足不可预测的需求。
运营成本:在间歇性需求的情况下管理库存可能会增加运营成本。在无销售期间保持足够的库存并管理库存水平可能需要在仓储和物流方面的额外投资。
为了解决这些问题,采用了针对间歇性需求管理的特定方法,例如专业的预测模型、产品分类技术和量身定制的库存策略。这些解决方案旨在最小化变异性和缺乏模式的影响,优化库存管理并提高供应链效率。
Croston 方法 (CR)
Croston 方法 (CR) 是一种经典的方法,专门用于处理间歇性需求,它是基于简单指数平滑法 (SES) 开发的。当 Croston 处理间歇性需求时,他发现使用 SES 时,每个时期的需求预测水平通常高于其实际值,这导致了非常低的准确性。在经过一段时间的研究后,他提出了一种优化间歇性需求预测结果的方法。
该方法基本上将间歇性需求分解为两个部分:非零需求的大小和发生这些需求的时间间隔,然后对这两个部分应用简单指数平滑。其公式如下:
如果 \(Z_t=0\) 则:
\[Z'_t= Z'_{t-1}\]
\[P'_t= P'_{t-1}\]
否则
\[Z'_t=\alpha Z_t +(1-\alpha) Z'_{t-1}\]
\[P'_t=\alpha P_t +(1-\alpha) P'_{t-1}\]
其中 \(0< \alpha < 1\)
最后通过结合这些预测
\[{Y'}_t = \frac{{Z'}_t}{{P'}_t}\]
其中
- \({Y'}_t:\) 每期的平均需求。
- \(Z_t:\) 第 \(t\) 期的实际需求。
- \(Z'_t:\) 两次正需求之间的时间。
- \(P:\) 下一期的需求大小预测。
- \(P_t:\) 需求间隔的预测。
- \(\alpha :\) 平滑常数。
Croston 方法将间歇性需求时间序列转换为非零需求时间序列和需求间隔时间序列,许多案例表明此方法效果很好,但在应用 Croston 方法之前,需做出以下三个假设:
- 非零需求是独立的,并服从正态分布;
- 需求间隔是独立的,并服从几何分布;
- 需求大小与需求间隔之间相互独立。
根据许多实际案例显示,Croston 方法适用于需求提前期服从正态分布的情况,对于那些包含大量零值的需求序列,Croston 方法并未显示出优越的表现,有时甚至不如 SES 方法。
此外,Croston 方法只能提供每期的平均需求,无法给出每期的需求大小预测,无法预测哪个时期会发生需求,也无法给出某一时期发生需求的概率。
尽管如此,虽然 Croston 方法是一种非常经典且广泛使用的方法,但它仍然有许多局限性。在统计学家和学者的多年研究之后,提出了几种 Croston 方法的变体。
Croston’s 方法的变种
Croston’s 方法是需求预测领域中主要使用的模型,大多数的研究工作都是基于这个模型。然而,在2001年,Syntetos和Boylan提出Croston’s 方法并不是一个无偏的方法,同时一些实证证据也表明,使用Croston’s 方法的性能损失(Sani和Kingsman,1997)。
在改进Croston’s 方法方面进行了大量的后续研究。Syntetos和Boylan(2005)提出了一种近似无偏的程序,该程序在估计结果中提供较小的方差,称为SBA(Syntetos和Boylan近似)。最近,Teunter等人(2011)还提出了一种可以处理老化问题的间歇性预测方法,该方法基于Croston’s 方法,称为TSB方法(Teunter,Syntetos和Babai)。
Croston 方法的应用领域
Croston 方法通常应用于库存管理和间歇性需求的需求预测领域。Croston 模型可以应用的一些具体领域包括:
库存管理:Croston 模型用于预测 sporadic 或间歇性销售的产品需求。帮助确定最佳库存水平和补货策略,最小化库存成本,并确保有足够的可用性以满足间歇性需求。
零售销售:在零售行业,尤其是低销售频率或不规则销售的产品中,Croston 模型可以有效地用于需求预测和在商店或仓库中优化库存规划。
需求预测:一般来说,当时间序列缺乏明确的模式或高度变动时,Croston 模型应用于需求预测。可用于制药行业、汽车行业、易腐商品行业和其他间歇性需求常见的行业。
供应链规划:Croston 模型可以用于供应链规划和管理,以提高间歇性需求预测的准确性。这有助于优化生产、库存管理、供应商订单调度以及供应链的其他方面。
需要注意的是,Croston 模型只是解决间歇性需求的众多方法之一。根据上下文和时间序列的具体特征,可能还有其他更合适的方法和技术。
Croston方法用于静态时间序列
不,Croston方法中的时间序列不必须是平稳的。Croston方法是对间歇性时间序列进行有效预测的方法,即使这些时间序列不是平稳的。然而,如果时间序列是平稳的,Croston方法可能会更准确。
Croston方法基于这样一个观点:间歇性时间序列可以分解为两个组成部分:需求组件和需求之间的时间组件。需求组件使用标准的时间序列预测方法进行预测,比如单指数平滑或双指数平滑。需求之间的时间组件则使用概率分布函数进行预测,如泊松分布或威布尔分布。
然后,Croston方法将这两个组件的预测结果结合起来,以获得下一时间段的总需求预测。
如果时间序列是平稳的,那么时间序列的两个组件也会是平稳的。这意味着Croston方法能够更准确地预测这两个组件。
然而,即使时间序列不是平稳的,Croston方法仍然可以是一个有效的预测方法。Croston方法是一种稳健的方法,可以处理具有不规则需求模式的时间序列。
如果您使用Croston方法来预测一个非平稳的间歇性时间序列,选择一种对非平稳时间序列有效的标准时间序列预测方法是至关重要的。双指数平滑是对非平稳时间序列有效的预测方法。
加载库和数据
需要使用 Statsforecast。要安装,请参见 说明。
接下来,我们导入绘图库并配置绘图风格。
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
'grayscale') # 五三八 灰度 经典
plt.style.use('lines.linewidth'] = 1.5
plt.rcParams[= {
dark_style 'figure.facecolor': '#008080', # #212946
'axes.facecolor': '#008080',
'savefig.facecolor': '#008080',
'axes.grid': True,
'axes.grid.which': 'both',
'axes.spines.left': False,
'axes.spines.right': False,
'axes.spines.top': False,
'axes.spines.bottom': False,
'grid.color': '#000000', #2A3459
'grid.linewidth': '1',
'text.color': '0.9',
'axes.labelcolor': '0.9',
'xtick.color': '0.9',
'ytick.color': '0.9',
'font.size': 12 }
plt.rcParams.update(dark_style)
from pylab import rcParams
'figure.figsize'] = (18,7) rcParams[
import pandas as pd
=pd.read_csv("https://raw.githubusercontent.com/Naren8520/Serie-de-tiempo-con-Machine-Learning/main/Data/intermittend_demand2")
df df.head()
date | sales | |
---|---|---|
0 | 2022-01-01 00:00:00 | 0 |
1 | 2022-01-01 01:00:00 | 10 |
2 | 2022-01-01 02:00:00 | 0 |
3 | 2022-01-01 03:00:00 | 0 |
4 | 2022-01-01 04:00:00 | 100 |
StatsForecast 的输入始终是一个长格式的数据框,包含三列:unique_id、ds 和 y:
unique_id
(字符串、整型或类别)表示系列的标识符。ds
(日期戳)列应为 Pandas 期望的格式,理想情况下,日期的格式为 YYYY-MM-DD,时间戳的格式为 YYYY-MM-DD HH:MM:SS。y
(数值型)表示我们希望进行预测的测量值。
"unique_id"]="1"
df[=["ds", "y", "unique_id"]
df.columns df.head()
ds | y | unique_id | |
---|---|---|---|
0 | 2022-01-01 00:00:00 | 0 | 1 |
1 | 2022-01-01 01:00:00 | 10 | 1 |
2 | 2022-01-01 02:00:00 | 0 | 1 |
3 | 2022-01-01 03:00:00 | 0 | 1 |
4 | 2022-01-01 04:00:00 | 100 | 1 |
print(df.dtypes)
ds object
y int64
unique_id object
dtype: object
我们可以看到我们的时间变量 (ds)
是以对象格式存储的,我们需要将其转换为日期格式。
"ds"] = pd.to_datetime(df["ds"]) df[
使用 plot 方法探索数据
使用 StatsForecast 类中的 plot 方法绘制一些系列。该方法随机打印数据集中的一系列数据,对于基本的探索性数据分析 (EDA) 很有用。
from statsforecast import StatsForecast
StatsForecast.plot(df)
自相关图
= plt.subplots(nrows=1, ncols=2)
fig, axs
"y"], lags=30, ax=axs[0],color="fuchsia")
plot_acf(df[0].set_title("Autocorrelation");
axs[
"y"], lags=30, ax=axs[1],color="lime")
plot_pacf(df[1].set_title('Partial Autocorrelation')
axs[
; plt.show()
时间序列的分解
如何分解时间序列以及为什么?
在时间序列分析中,为了预测新值,了解过去的数据是非常重要的。更准确地说,了解值随时间变化所遵循的模式是非常重要的。导致我们预测值朝错误方向发展的原因可能有很多。基本上,一个时间序列由四个组成部分构成。这些组件的变化导致时间序列模式的变化。这些组成部分是:
- 水平: 这是随时间变化的主要值的平均水平。
- 趋势: 趋势是导致时间序列中值增加或减少模式的因素。
- 季节性: 这是在时间序列中短时间内发生的周期性事件,并导致时间序列中的短期增加或减少模式。
- 残差/噪声: 这些是时间序列中的随机变化。
这些组件随时间的结合形成了一个时间序列。大多数时间序列由水平和噪声/残差组成,而趋势或季节性则是可选的值。
如果季节性和趋势是时间序列的一部分,那么将会影响预测值。因为预测的时间序列模式可能与之前的时间序列不同。
时间序列中组件的组合可以分为两种类型: * 加性 * 乘性
加性时间序列
如果时间序列的组成部分是通过相加形成时间序列的,那么这个时间序列称为加性时间序列。从可视化的角度看,如果时间序列的增加或减少模式在整个序列中相似,那么我们可以认为该时间序列是加性的。任何加性时间序列的数学函数可以表示为: \[y(t) = 水平 + 趋势 + 季节性 + 噪声\]
乘性时间序列
如果时间序列的组成部分是通过相乘形成的,那么这个时间序列称为乘性时间序列。从可视化来看,如果时间序列表现出随时间指数增长或下降的趋势,那么可以认为该时间序列是乘性的。乘性时间序列的数学函数可以表示为: \[y(t) = 水平 * 趋势 * 季节性 * 噪声\]
from statsmodels.tsa.seasonal import seasonal_decompose
from plotly.subplots import make_subplots
import plotly.graph_objects as go
def plotSeasonalDecompose(
x,='additive',
model=None,
filt=None,
period=True,
two_sided=0,
extrapolate_trend="Seasonal Decomposition"):
title
= seasonal_decompose(
result =model, filt=filt, period=period,
x, model=two_sided, extrapolate_trend=extrapolate_trend)
two_sided= make_subplots(
fig =4, cols=1,
rows=["Observed", "Trend", "Seasonal", "Residuals"])
subplot_titlesfor idx, col in enumerate(['observed', 'trend', 'seasonal', 'resid']):
fig.add_trace(=result.observed.index, y=getattr(result, col), mode='lines'),
go.Scatter(x=idx+1, col=1,
row
)return fig
plotSeasonalDecompose("y"],
df[="additive",
model=24,
period="Seasonal Decomposition") title
将数据分为训练集和测试集
我们将数据划分为以下几个部分:
- 用于训练我们的
Croston经典模型
的数据。 - 用于测试我们模型的数据。
对于测试数据,我们将使用最后500小时的数据来测试和评估我们模型的性能。
= df[df.ds<='2023-01-31 19:00:00']
train = df[df.ds>'2023-01-31 19:00:00'] test
train.shape, test.shape
((9500, 3), (500, 3))
现在让我们绘制训练数据和测试数据的图。
="ds", y="y", label="Train", linestyle="--",linewidth=2)
sns.lineplot(train,x="ds", y="y", label="Test", linewidth=2, color="yellow")
sns.lineplot(test, x"Store visit");
plt.title( plt.show()
CrostonClassic 的实现与 StatsForecast
要了解 CrostonClassic Model
函数的更多参数,下面列出了相关信息。有关更多信息,请访问 文档。
alias : str
模型的自定义名称。
加载库
from statsforecast import StatsForecast
from statsforecast.models import CrostonClassic
实例化模型
导入并实例化模型。设置参数有时很棘手。大师Rob Hyndmann的这篇关于季节性周期的文章对season_length
可能会很有帮助。
= 24 # 每小时数据
season_length = len(test) # 预测数量
horizon
= [CrostonClassic()] models
None我们通过实例化一个新的 StatsForecast 对象并使用以下参数来拟合模型:
模型:一个模型列表。从模型中选择所需的模型并导入它们。
freq:
一个字符串,指示数据的频率。(请参见 pandas 可用的频率.)n_jobs:
n_jobs: int,表示并行处理使用的工作数量,使用 -1 表示所有核心。fallback_model:
如果某个模型失败,将使用的模型。
任何设置都会传递给构造函数。然后调用其 fit 方法并传入历史数据框
= StatsForecast(df=df,
sf =models,
models='H',
freq=-1) n_jobs
拟合模型
sf.fit()
StatsForecast(models=[CrostonClassic])
让我们看看我们 Croston经典模型
的结果。我们可以通过以下指令进行观察:
=sf.fitted_[0,0].model_
result result
{'mean': array([23.606695], dtype=float32)}
预测方法
如果您希望在有多个序列或模型的生产环境中提高速度,我们建议使用 StatsForecast.forecast
方法,而不是 .fit
和 .predict
。
主要区别在于 .forecast
不存储拟合值,并且在分布式环境中具有很高的可扩展性。
预测方法接受两个参数:预测下一个 h
(时间跨度)和 level
。
h (int):
表示预测未来 h 步。在这种情况下,预测 25 周。
这里的预测对象是一个新的数据框,包含一个带有模型名称的列和 y hat 值,以及不确定性区间的列。根据您的计算机,这一步大约需要 1 分钟。
= sf.forecast(horizon)
Y_hat Y_hat
ds | CrostonClassic | |
---|---|---|
unique_id | ||
1 | 2023-02-21 16:00:00 | 23.606695 |
1 | 2023-02-21 17:00:00 | 23.606695 |
1 | 2023-02-21 18:00:00 | 23.606695 |
... | ... | ... |
1 | 2023-03-14 09:00:00 | 23.606695 |
1 | 2023-03-14 10:00:00 | 23.606695 |
1 | 2023-03-14 11:00:00 | 23.606695 |
500 rows × 2 columns
=Y_hat.reset_index()
Y_hat Y_hat
unique_id | ds | CrostonClassic | |
---|---|---|---|
0 | 1 | 2023-02-21 16:00:00 | 23.606695 |
1 | 1 | 2023-02-21 17:00:00 | 23.606695 |
2 | 1 | 2023-02-21 18:00:00 | 23.606695 |
... | ... | ... | ... |
497 | 1 | 2023-03-14 09:00:00 | 23.606695 |
498 | 1 | 2023-03-14 10:00:00 | 23.606695 |
499 | 1 | 2023-03-14 11:00:00 | 23.606695 |
500 rows × 3 columns
= pd.concat([df,Y_hat])
Y_hat1 Y_hat1
ds | y | unique_id | CrostonClassic | |
---|---|---|---|---|
0 | 2022-01-01 00:00:00 | 0.0 | 1 | NaN |
1 | 2022-01-01 01:00:00 | 10.0 | 1 | NaN |
2 | 2022-01-01 02:00:00 | 0.0 | 1 | NaN |
... | ... | ... | ... | ... |
497 | 2023-03-14 09:00:00 | NaN | 1 | 23.606695 |
498 | 2023-03-14 10:00:00 | NaN | 1 | 23.606695 |
499 | 2023-03-14 11:00:00 | NaN | 1 | 23.606695 |
10500 rows × 4 columns
= plt.subplots(1, 1)
fig, ax = pd.concat([df, Y_hat1]).set_index('ds')
plot_df 'y'].plot(ax=ax, linewidth=2)
plot_df["CrostonClassic"].plot(ax=ax, linewidth=2, color="yellow")
plot_df[ ' Forecast', fontsize=22)
ax.set_title('Store visit (Hourly data)', fontsize=20)
ax.set_ylabel('Hourly', fontsize=20)
ax.set_xlabel(={'size': 15})
ax.legend(propTrue) ax.grid(
预测方法及置信区间
要生成预测,请使用预测方法。
预测方法接受两个参数:预测下一个 h
(代表时间范围)和 level
。
h (int):
代表预测未来 h 步的情况。在本例中,提前 500 小时。
此处的预测对象是一个新的数据框,其中包含一个列,列名为模型名称,以及 y hat 值,以及不确定性区间的列。
此步骤应该在 1 秒内完成。
= sf.predict(h=horizon)
forecast_df forecast_df
ds | CrostonClassic | |
---|---|---|
unique_id | ||
1 | 2023-02-21 16:00:00 | 23.606695 |
1 | 2023-02-21 17:00:00 | 23.606695 |
1 | 2023-02-21 18:00:00 | 23.606695 |
... | ... | ... |
1 | 2023-03-14 09:00:00 | 23.606695 |
1 | 2023-03-14 10:00:00 | 23.606695 |
1 | 2023-03-14 11:00:00 | 23.606695 |
500 rows × 2 columns
我们可以使用pandas函数pd.concat()
将预测结果与历史数据进行合并,然后能够利用这个结果进行图形绘制。
'ds') pd.concat([df, forecast_df]).set_index(
y | unique_id | CrostonClassic | |
---|---|---|---|
ds | |||
2022-01-01 00:00:00 | 0.0 | 1 | NaN |
2022-01-01 01:00:00 | 10.0 | 1 | NaN |
2022-01-01 02:00:00 | 0.0 | 1 | NaN |
... | ... | ... | ... |
2023-03-14 09:00:00 | NaN | NaN | 23.606695 |
2023-03-14 10:00:00 | NaN | NaN | 23.606695 |
2023-03-14 11:00:00 | NaN | NaN | 23.606695 |
10500 rows × 3 columns
= pd.concat([df, forecast_df]).set_index('ds').tail(5000)
df_plot df_plot
y | unique_id | CrostonClassic | |
---|---|---|---|
ds | |||
2022-08-18 04:00:00 | 0.0 | 1 | NaN |
2022-08-18 05:00:00 | 80.0 | 1 | NaN |
2022-08-18 06:00:00 | 0.0 | 1 | NaN |
... | ... | ... | ... |
2023-03-14 09:00:00 | NaN | NaN | 23.606695 |
2023-03-14 10:00:00 | NaN | NaN | 23.606695 |
2023-03-14 11:00:00 | NaN | NaN | 23.606695 |
5000 rows × 3 columns
现在让我们可视化我们的预测结果和时间序列的历史数据。
'y'],label="Actual", linewidth=2.5)
plt.plot(df_plot['CrostonClassic'], label="CrostonClassic", color="yellow") # '-', '--', '-.', ':',
plt.plot(df_plot[
"Store visit (Hourly data)");
plt.title("Hourly")
plt.xlabel("") plt.ylabel(
Text(0, 0.5, '')
让我们使用Statsforecast
中的plot函数绘制相同的图,如下所示。
sf.plot(df, forecast_df)
交叉验证
在之前的步骤中,我们利用历史数据来预测未来。然而,为了评估其准确性,我们还希望了解模型在过去的表现。为了评估模型在数据上的准确性和稳健性,可以进行交叉验证。
对于时间序列数据,交叉验证是通过在历史数据上定义滑动窗口并预测随后的时间段来进行的。这种交叉验证形式使我们能够在更广泛的时间实例中更好地估计模型的预测能力,同时保持训练集中的数据连续,这是我们模型所要求的。
以下图表展示了这样的交叉验证策略:
执行时间序列交叉验证
时间序列模型的交叉验证被认为是最佳实践,但大多数实现速度非常慢。statsforecast库将交叉验证实现为分布式操作,使得该过程变得不那么耗时。如果您有大型数据集,还可以使用Ray、Dask或Spark在分布式集群中执行交叉验证。
在此情况下,我们希望评估每个模型在过去5个月内的性能(n_windows=)
,每隔两个小时进行一次预测(step_size=50)
。根据您的计算机,这一步骤应该大约需要1分钟。
StatsForecast类中的cross_validation方法接受以下参数。
df:
训练数据框h (int):
代表未来将预测的\(h\)步。在这种情况下,为500小时。step_size (int):
每个窗口之间的步长。换句话说:您希望多频繁地运行预测过程。n_windows (int):
用于交叉验证的窗口数量。换句话说:您希望评估过去的多少个预测过程。
= sf.cross_validation(df=df,
crossvalidation_df =horizon,
h=50,
step_size=5) n_windows
crossvaldation_df对象是一个新的数据框,其中包括以下列:
unique_id:
索引。如果您不喜欢使用索引,只需运行crossvalidation_df.resetindex()
。ds:
日期戳或时间索引cutoff:
n_windows
的最后一个日期戳或时间索引。y:
真实值model:
包含模型名称和拟合值的列。
crossvalidation_df
ds | cutoff | y | CrostonClassic | |
---|---|---|---|---|
unique_id | ||||
1 | 2023-01-23 12:00:00 | 2023-01-23 11:00:00 | 0.0 | 23.655830 |
1 | 2023-01-23 13:00:00 | 2023-01-23 11:00:00 | 0.0 | 23.655830 |
1 | 2023-01-23 14:00:00 | 2023-01-23 11:00:00 | 0.0 | 23.655830 |
... | ... | ... | ... | ... |
1 | 2023-02-21 13:00:00 | 2023-01-31 19:00:00 | 60.0 | 27.418417 |
1 | 2023-02-21 14:00:00 | 2023-01-31 19:00:00 | 20.0 | 27.418417 |
1 | 2023-02-21 15:00:00 | 2023-01-31 19:00:00 | 20.0 | 27.418417 |
2500 rows × 4 columns
模型评估
现在我们可以使用适当的准确性指标来计算预测的准确度。在这里,我们将使用均方根误差(RMSE)。为此,我们首先需要安装 datasetsforecast
,这是一个由 Nixtla 开发的 Python 库,包含计算 RMSE 的函数。
%%capture
!pip install datasetsforecast
from datasetsforecast.losses import rmse
计算RMSE的函数需要两个参数:
- 真实值。
- 预测值,在这种情况下为
Croston经典模型
。
= rmse(crossvalidation_df['y'], crossvalidation_df["CrostonClassic"])
rmse print("RMSE using cross-validation: ", rmse)
RMSE using cross-validation: 48.08823
致谢
我们要感谢 Naren Castellon 编写本教程。
参考文献
- Changquan Huang • Alla Petukhina. 施普林格系列 (2022)。使用Python进行应用时间序列分析和预测。
- Ivan Svetunkov. 使用增强动态自适应模型(ADAM)的预测和分析
- James D. Hamilton. 时间序列分析 普林斯顿大学出版社,普林斯顿,新泽西州,第一版,1994年。
- Nixtla 参数。
- Pandas 可用频率。
- Rob J. Hyndman 和 George Athanasopoulos (2018)。 “预测原则与实践,时间序列交叉验证”。。
- 季节性周期 - Rob J Hyndman。
Give us a ⭐ on Github