Energy Consumption (能源消耗)数据集预测(1):1小时从据说prophet 到完成预测(含安装)

前言

上个专辑咱们分析了COVID19的数据,主要从可视化的角度进行了分析。 其实 kaggle上COVID19的数据集多达上千个(连接)。 有兴趣的能够下载更多的内容研究,后续我也会考虑使用其中一部分数据进行建模。html

今天咱们来入手另外一个经典数据集,Energy Consumption (能源消耗)。该数据集是美国PJM公司(至关于国家电网或者南方电网)统计的能源消耗状况,时间跨度为达20年,数据集的采样频率为小时。python

时间序列预测简述

时间序列,通常指一维的时间序列(更准确的叫一元时间序列),这是约定俗成的省略。因为也有多元时间序列,因此在和别人交流时,须要判断ta所说的时间序列是否是特指一元时间序列。c++

我遇到的时间序列:git

  • 工业控制中的几乎全部信号(measurement),都是一个随时间变化的数据。
  • 股市的股票
  • 几乎人类全部的可量化活动,均可以画在时间轴上

时间序列的预测就是用过去的信息,预测将来的信息。github

  • 股票明天涨仍是涨呢?(调皮)
  • 如何根据特朗普的民调支持率预测下个月的支持率是多少呢?
  • 如何预测明天的天气温度呢?

prophet 简述

你可能据说过prophet,隐约有以下印象:算法

  • facebook公司近几年开开源的算法
  • 专门针对时间序列预测
  • 据说能考虑节假日等的影响,很牛 。。。

够了,知道这些就能够阅读本文了。至于它如何分解时间序列,如何划分changepoint,等等。实战过程当中你天然会想着去了解。为啥呢?想提高模型的效果,总得尝试调参啊。今天我就花了一个小时,完成从安装prophet(包含入坑出坑)到模型预测。windows

prophet 安装

这里特意花一点时间来讲一下prophet的安装过程,由于它里面有坑,坑里面还有天坑。不然就是半小时从据说prophet 到完成预测了。api

先说一下本人此次使用的环境:CPU only的笔记本+ pycharm 软件。bash

第一坑

打开prophet的官网,在安装指导页面,你会被这简单而又熟悉的pip代码吸引。机器学习

结果,安装失败。

回去仔细阅读安装说明,下面还有小字:

The major dependency that Prophet has is pystan. PyStan has its own installation instructions. Install pystan with pip before using pip to install fbprophet.
复制代码

第二坑

pystan 一眼就看出是能够pip安装的。因而pip install pystan,没有报错,内心窃喜。而后pip install fbprophet

结果。。。仍是失败!!

回去仔细阅读pystan的说明:

天坑

原来pystan也有一堆东西要提早安装,可是我一看到要安装c++,我瑟瑟发抖。由于这中间的坑不是一篇文章能说完的。再者,我不想弄乱本身windows的系统。

避免坑

因而花了一点时间仔细看说明,想要节省时间,就用pystan安装手册的推荐的用Anaconda 安装吧。 因而个人安装步骤以下:

  • 安装minicoda(洁癖),这就是典型的windows 软件安装方式:运行-->下一步-->完成
  • 在pycharm中配置采用anaconda 做为python的环境
  • conda install anaconda
  • conda install pystan
  • conda install -c conda-forge fbprophet

终于成功了,赶忙码代码。 一如既往,代码优先。

准备数据

从kaggle上下载数据,放到本地文件夹data中。 首先导入模块,包括数据分析经典的pandas,sklearn,numpy,matplotlib 以及咱们本文的明星Prophet。

from fbprophet import Prophet
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import mean_absolute_error
import numpy as np
复制代码

简单说一下数据集,kaggle提供了PJM 各个区域(客户群)的数据。咱们快速浏览每一个数据的columns,发现除了pjm_hourly_est文件,剩下的都是两列数据,一个时间列,一个耗电量(MW)。pjm_hourly_est 不过是把全部其余文件的信息合并到一个文件而已。

AEP_hourly
Index(['Datetime', 'AEP_MW'], dtype='object')
******************************
COMED_hourly
Index(['Datetime', 'COMED_MW'], dtype='object')
******************************
DAYTON_hourly
Index(['Datetime', 'DAYTON_MW'], dtype='object')
******************************
DEOK_hourly
Index(['Datetime', 'DEOK_MW'], dtype='object')
******************************
DOM_hourly
Index(['Datetime', 'DOM_MW'], dtype='object')
******************************
DUQ_hourly
Index(['Datetime', 'DUQ_MW'], dtype='object')
******************************
EKPC_hourly
Index(['Datetime', 'EKPC_MW'], dtype='object')
******************************
FE_hourly
Index(['Datetime', 'FE_MW'], dtype='object')
******************************
NI_hourly
Index(['Datetime', 'NI_MW'], dtype='object')
******************************
PJME_hourly
Index(['Datetime', 'PJME_MW'], dtype='object')
******************************
PJMW_hourly
Index(['Datetime', 'PJMW_MW'], dtype='object')
******************************
pjm_hourly_est
Index(['Datetime', 'AEP', 'COMED', 'DAYTON', 'DEOK', 'DOM', 'DUQ', 'EKPC',
       'FE', 'NI', 'PJME', 'PJMW', 'PJM_Load'],
      dtype='object')
******************************
PJM_Load_hourly
Index(['Datetime', 'PJM_Load_MW'], dtype='object')
******************************
复制代码

咱们就是想看看prophet如何预测,因此就使用第一个数据集吧。

file = 'data/AEP_hourly.csv'
raw_df = pd.read_csv(file)
print(raw_df.head(5))
print(raw_df.tail(5))
复制代码

结果以下,看来时间跨度从2004年底到2018年初。

Datetime   AEP_MW
0  2004-12-31 01:00:00  13478.0
1  2004-12-31 02:00:00  12865.0
2  2004-12-31 03:00:00  12577.0
3  2004-12-31 04:00:00  12517.0
4  2004-12-31 05:00:00  12670.0
                   Datetime   AEP_MW
121268  2018-01-01 20:00:00  21089.0
121269  2018-01-01 21:00:00  20999.0
121270  2018-01-01 22:00:00  20820.0
121271  2018-01-01 23:00:00  20415.0
121272  2018-01-02 00:00:00  19993.0
复制代码

调用prophet建模

对于prophet,啥都不知道,那就看指导手册吧,每一个指导手册都会有quick start,让你快速调用。

数据稍做处理

对于prophet,输入的数据须要有如下格式:

  • Dataframe (咱们已经知足)
  • 两列,第一列时间,第二列是观察对象(咱们知足)
  • 第一列数据格式为YYYY-MM-DD HH:MM:SS 的Timestamp (咱们不知足,由于pandas 读到的是默认字符串)
  • 第一列名称要为'ds',第二列名称为'y' (咱们不知足)

因此,根据上述要求,咱们来处理数据:

dt_format = '%Y-%m-%d %H:%M:%S'  # 处理时间格式
raw_df['Datetime']= pd.to_datetime(raw_df['Datetime'],format=dt_format)
raw_df.rename({'AEP_MW':'y','Datetime':'ds'},axis=1,inplace=True) # 重命名

print(raw_df.info())
复制代码
Data columns (total 2 columns):
 # Column Non-Null Count Dtype 
---  ------  --------------   -----         
 0   ds      121273 non-null  datetime64[ns]
 1   y       121273 non-null  float64       
dtypes: datetime64[ns](1), float64(1)
复制代码

训练和测试数据集划分

对于机器学习,划分训练和测试数据集是必须的。由于时间序列有时间上的连贯性,不能轻易的用sklearn的train_test_split 函数划分。 这里咱们划分很简单,咱们刚才已经预览了数据集的首尾,知道器时间跨度为2004 到2018,有十几年的数据,因此咱们这里就划分为最后一年为测试集,其余的数据为训练集。 Timestamp 能够支持逻辑比大小,因此咱们就能够经过如下代码划分数据集。

split_dt = pd.Timestamp('2017-01-01 00:00:00')
train_df = raw_df[raw_df['ds']< split_dt]
test_df = raw_df[raw_df['ds']>= split_dt]
复制代码

prophet建模

prophet 听从sklearn 模型的API接口规范,也就是建模经典三部曲:建立模型--> fit训练数据--> predict 测试集。

代码还真的只有三行!!

model = Prophet()
model= model.fit(train_df)
y_hat  = model.predict(test_df)
复制代码

原本想调用matplotlib 画图试试,结果看到prophet已经自带plot函数。

model.plot(y_hat)

复制代码

结果分析

从人眼可见的角度来判断,预测的有点模样,有周期趋势,均值彷佛也差很少。咱们来看一下,偏差多大,这里采用mean_absolute_error来衡量,而且计算偏差占均值的比例。

print(mean_absolute_error(test_df['y'].values,y_hat['yhat']))
print(mean_absolute_error(test_df['y'].values,y_hat['yhat'])/test_df['y'].values.mean())

复制代码
1782.2521239509801
0.12056939407796417
复制代码

平均偏差为1782MW,偏差约等于观测对象水平的12%。 那这个偏差是大仍是小呢?模型是好还不是很差呢? 我以为单看准确度,确定不是好的模型。可是问题出在哪里呢?是prophet 模型的上限就是这样的准确度?仍是咱们没有好好调整prophet的参数?

没有对比就没有伤害!!下一篇,咱们能够对比一下咱们的快速prophet 模型与网上的大牛的结果对比。

bonus:一点知识

到此咱们就已经预测了最后一年的时间趋势,可是咱们对prophet仍是不甚了解。 prophet 核心就是时间序列的分解技术,它能够从原始序列中剥离每日周期序列,每周周期序列,每一年周期序列,以及大趋势。

咱们能够看看plot此次分解的结果。彷佛大的趋势是一条水平线,也就是常值。每周的序列周期不是特别明显,可是每一年的周期比较明显,周期约为半年,幅值高达2000左右。

fig2 = model.plot_components(y_hat)

复制代码

总结

本文中咱们采用prophet模型,对能源消耗的数据集的进行了预测,其中预测一年的平均偏差为1782 左右。 本文还涵盖了使用prophet建模的一些辅助事项:

  • 安装过程如何避免坑
  • 数据如何准备能够被prophet 做为输入
  • plot prophet 分解的趋势和周期 因为本文讲求的快速建模,因此没有涵盖prophet的理论以及背景知识,网上这方面的资料不少,首推官方手册。
相关文章
相关标签/搜索