【数据分析】利用机器学习算法进行预测分析(五):Prophet(2021-01-21)

时间序列预测中的机器学习方法(五):Prophet

本文是“时间序列预测中的机器学习方法”系列文章的第五篇,如果您有兴趣,可以先阅读前面的文章:
【数据分析】利用机器学习算法进行预测分析(一):移动平均(Moving Average)
【数据分析】利用机器学习算法进行预测分析(二):线性回归(Linear Regression)
【数据分析】利用机器学习算法进行预测分析(三):最近邻(K-Nearest Neighbours)
【数据分析】利用机器学习算法进行预测分析(四):自回归差分移动平均模型(AutoARIMA)

1.Prophet 简介

Prophet是一种基于加性模型(additive model)预测时间序列数据的方法,其中非线性趋势与年、周、日的季节性变化以及假日效应相吻合。它适合具有强烈季节性影响和多个季节历史数据的时间序列。Prophet对于丢失数据和趋势变化具有较强的鲁棒性,并且通常能够很好地处理异常值。它的优点有:

  • 准确快速。Prophet在Facebook的许多应用程序中用于生成可靠的计划和目标设定预测。在大多数情况下,它的性能要优于其他方法。
  • 全自动。无需人工干预即可获得有关杂乱数据的合理预测。Prophet对异常值,丢失的数据以及时间序列中的急剧变化具有鲁棒性。
  • 可调整。Prophet为用户提供了许多调整和调整预测的可能性。可以使用一些参数来添加自己研究领域的相关知识,从而改善预测效果。

Prophet官网:https://facebook.github.io/prophet/
使用教程:https://facebook.github.io/prophet/docs/quick_start.html#python-api

2.股价预测实例

数据集和前面写的四篇文章相同,目的是为了比较不同算法对同一数据集的预测效果。数据集和代码放在了我的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()

在这里插入图片描述
从图中可以看到,Prophet对这个数据的预测效果也并不是很好。

猜你喜欢

转载自blog.csdn.net/be_racle/article/details/112973932