如何安装NeuralProphet,训练NeuralProphet预测器

636 阅读7分钟

使用NeuralProphet预测Covid-19案例

在以时间序列为独立变量的数据集上进行预测,使用传统的机器学习方法会被证明是一种挑战。2017年,Facebook(现在的Meta)提出了一个库,可以提取可能具有每日、每周或其他季节性的非线性模式。

这个库被称为先知(以前被称为FbProphet)。该库的一个局限性是它不能很好地概括复杂的趋势,所以它倾向于欠拟合。因此,该公司的数据科学核心团队提出了NeuralProphet,一个基于AR-Net(一个简单的时间序列自动回归神经网络)和Pytorch的库。

我们将使用[约翰霍普金斯大学系统科学与工程中心(JHU CSSE)全球Covid-19数据存储库]的全球案例数据集来进行预测。这是一个非常有用的数据集,因为它有很多的季节性和复杂的时间序列模式。

前提条件

  • Python的基本知识。
  • 机器学习基础知识。
  • 使用Pandas的基本数据操作技能。
  • 在你的电脑上安装Python (与pip,NumPyPandas),或在谷歌Colab或Kaggle等在线环境中安装。

目标

在本教程结束时,你将熟悉。

  • 了解时间序列预测。
  • 安装NeuralProphet。
  • 形成用于预测的数据。
  • 使用NeuralProphet对单一序列进行预测。
  • 对多个序列进行预测。

关于时间序列预测

时间序列是一系列按时间顺序排列的数据点。例如,某地某段时间的天气数据会以日期的形式列出,并有相应的温度、降雨量、大气压力等。

使用传统的统计方法如线性回归、岭回归和拉索回归以及贝叶斯技术来预测这类数据,并不能产生最佳效果。时间序列预测是一种建模策略,用于利用过去的观察结果预测未来的趋势,其中时间序列是独立变量。这种技术可以解开时间域的关系,如季节性、每周、每月和每年的趋势。

设置环境

在Google Colab上,要安装NeuralProphet,请运行以下命令。

pip install neuralprophet[live]

在本地,运行以下命令。

pip install neuralprophet

注意:由于内存分配不足,repl.it 等在线编辑器可能无法运行我们的代码。

导入和准备数据

我们将从导入pandas 库和数据集开始。

import pandas as pd
path='https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv'
dataset=pd.read_csv(path,engine='python')

COVID-19数据集

我们将使用[约翰霍普金斯大学系统科学与工程中心(CSSE)的COVID]-19数据[存储库中]的Covid-19全球案例数据集。要手动导航到资源库中的CSV文件,请按照路径csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv

该数据集收集了来自各国卫生部门、机构和大学的报告,由约翰霍普金斯大学的CSSE每日更新。

数据的准备

该数据有一些国家的数据,由ProvinceState 。'省/州'列应合并为一个国家的列。我们还需要删除'纬度'和'长度'列,因为它们对这个任务没有用。

dataset=dataset.groupby('Country/Region').sum()
dataset=dataset.drop(columns=['Lat','Long'])

为了在模型训练中更容易获取,我们将旋转数据,使国家名称成为列名,日期只是行。

我们将通过将日期保存在一个变量dates ,转置数据集的其余部分,并将其与dates ,作为Date 列连接起来。

dates=dataset.columns
dataset=dataset.transpose().reset_index(drop=True)
dates=pd.DataFrame(dates)
rotated_dataset= pd.concat([dates, dataset.diff()], axis=1, join='inner')
rotated_dataset=rotated_dataset.rename(columns={0:'Date'})

NeuralProphet只接受两列;datesy-column 拟合数据时。这两列必须分别命名为dsy 。我们将从数据中删除所有NULL 的值。

目前,让我们使用US 数据进行演示。

data=cases[['Date','US']]
data.columns=['ds','y']
data.dropna(inplace=True)
data[:1].head()

输出。

 	      ds 	   y
2 	1/24/20 	1.0
3 	1/25/20 	0.0
4 	1/26/20 	3.0
5 	1/27/20 	0.0
6 	1/28/20 	0.0

训练模型

我们将从neuralprophet 中导入NeuralProphet() 类,从中创建一个空模型,并将其分配给变量m 。然后,我们将在上一步的训练数据集data 上拟合该模型。此后,我们将开始训练过程,向fit() 方法传递三个参数。

  • 要训练的数据集,data
  • 数据的频率,freq 为'D',因为数据的发生是每天。
  • 训练时间,epochs
from neuralprophet import NeuralProphet
m = NeuralProphet()
m.fit(data,freq='D',epochs=1000)

训练过程完成后,我们可以从单元格的输出中获得模型的指标,如平均绝对误差(MAE)。我们可以注意到,在训练过程中,MAE明显减少(~90%)。

监测训练过程和评估模型

一个NeuralProphet模型会自我验证并提供验证指标作为训练过程输出的一部分。如果你安装了NeuralProphet的[live] 版本,并希望在训练过程中监测指标,请使用模型的split_df() 方法将数据分成训练和测试集,如下图所示。

df_train, df_test = m.split_df(data, freq='D')
metrics = m.fit(df_train, freq='D', epochs=1000, validation_df=df_test, plot_live_loss=True)

在训练过程中,SmoothL1LossMAE 的实时图将被绘制出来。

下面代码单元的输出显示了训练结束时模型的指标。

metrics.tail(1)

输出。

index,SmoothL1Loss,MAE,RMSE,RegLoss,SmoothL1Loss_val,MAE_val,RMSE_val
1999,0.0029082219263359263,14688.557393324336,21929.236516299832,0.0,NaN,NaN,NaN

预测

通过将数据和周期数(天数)传递给make_future_dataframe() 方法来预测未来趋势。让我们预测未来14天的情况。让我们在future 上调用predict() 方法来进行预测。预测结果是forecast 数据框中的yhat1 列。

future=m.make_future_dataframe(data,periods=14)
forecast=m.predict(future)
print(forecast)

让我们使用模型内置的绘图方法,即来自matplotlib API的plot() ,绘制预测结果。

fig1 = m.plot(forecast)

输出。

Predicted cases

由于我们预测的是案例,所以它们不能是浮点值。我们通过将一系列的浮动值转换为int 数据类型,将预测值四舍五入为最接近的整数。

forecast['yhat1'].astype(int)

yhat1 的值是。

0     377139
1     376244
2     376643
3     376004
4     382333
5     358197
6     340498
7     353060
8     352851
9     353981
10    354114
11    361250
12    337950
13    321113
Name: yhat1, dtype: int64

这意味着该模型预测明天有377,139个病例,第二天有376,244个,以此类推。我们将获得带有日期的预测结果,如下所示。

results_df=forecast[['ds','yhat1']]
results_df['yhat1']=forecast['yhat1'].astype(int)
results_df.columns=['Date','Predicted Cases']
results_df

输出。

index,Date,Predicted Cases
0,2022-02-14 00:00:00,377139
1,2022-02-15 00:00:00,376244
2,2022-02-16 00:00:00,376643
3,2022-02-17 00:00:00,376004
4,2022-02-18 00:00:00,382333
5,2022-02-19 00:00:00,358197
6,2022-02-20 00:00:00,340498
7,2022-02-21 00:00:00,353060
8,2022-02-22 00:00:00,352851
9,2022-02-23 00:00:00,353981
10,2022-02-24 00:00:00,354114
11,2022-02-25 00:00:00,361250
12,2022-02-26 00:00:00,337950
13,2022-02-27 00:00:00,321113

结论

我们已经建立了一个NeuralProphet模型,并使用它来预测Covid-19案件。在本教程中,我们学习了如何安装NeuralProphet,导入和准备用于时间序列预测的数据,训练NeuralProphet预测器,并使用训练好的模型进行预测。

我们可以通过任何网络应用框架,如Streamlit或Dash使用Django或Flask通过API为这个模型服务。