本文是“时间序列预测中的机器学习方法”系列文章的第五篇,如果您有兴趣,可以先阅读前面的文章:
【数据分析】利用机器学习算法进行预测分析(一):移动平均(Moving Average)
【数据分析】利用机器学习算法进行预测分析(二):线性回归(Linear Regression)
【数据分析】利用机器学习算法进行预测分析(三):最近邻(K-Nearest Neighbours)
【数据分析】利用机器学习算法进行预测分析(四):自回归差分移动平均模型(AutoARIMA)
Prophet是一种基于加性模型(additive model)预测时间序列数据的方法,其中非线性趋势与年、周、日的季节性变化以及假日效应相吻合。它适合具有强烈季节性影响和多个季节历史数据的时间序列。Prophet对于丢失数据和趋势变化具有较强的鲁棒性,并且通常能够很好地处理异常值。它的优点有:
Prophet官网:https://facebook.github.io/prophet/
使用教程:https://facebook.github.io/prophet/docs/quick_start.html#python-api
数据集和前面写的四篇文章相同,目的是为了比较不同算法对同一数据集的预测效果。数据集和代码放在了我的GitHub上,需要的朋友可以自行下载。
导入包,读入数据。fbprophet这个包在Windows下比较难安装,建议使用conda虚拟环境安装。若安装不成功时,请检查自己是否成功安装了pystan包。官网安装教程。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from fbprophet import Prophet
df = pd.read_csv('NSE-TATAGLOBAL11.csv')
设置索引。为了不破坏原始数据,重新构建一个new_data。
# setting the index as date
df['Date'] = pd.to_datetime(df.Date,format='%Y-%m-%d')
df.index = df['Date']
#creating dataframe with date and the target variable
data = df.sort_index(ascending=True, axis=0)
new_data = pd.DataFrame(index=range(0,len(df)),columns=['Date', 'Close'])
for i in range(0,len(data)):
new_data['Date'][i] = data['Date'][i]
new_data['Close'][i] = data['Close'][i]
new_data['Date'] = pd.to_datetime(new_data.Date,format='%Y-%m-%d')
new_data.index = new_data['Date']
#preparing data
new_data.rename(columns={
'Close': 'y', 'Date': 'ds'}, inplace=True)
new_data
#train and validation
train = new_data[:987]
valid = new_data[987:]
适应模型。
#fit the model
model = Prophet()
model.fit(train)
做出预测
#predictions
close_prices = model.make_future_dataframe(periods=len(valid))
forecast = model.predict(close_prices)
提取出需要的数据。
forecast_valid = forecast['yhat'][987:]
观测RMSE的大小。
rmse = np.sqrt(np.mean(np.power((np.array(valid['y'])-np.array(forecast_valid)),2)))
rmse
#plot
valid['Predictions'] = 0
valid['Predictions'] = forecast_valid.values
plt.figure(figsize=(16,8))
plt.plot(train['y'])
plt.plot(valid[['y', 'Predictions']])
plt.show()